网络编程(TCP/IP编程) != 网站编程
qq,MSN,游戏,魔兽争霸
socket:client端的插座
serversocket: TCP 服务器端的插座
UDP没有所谓的server、client
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
// 服务器端也建立了一个插座
serverSocket.accept(); // 如果client没有连接,则傻傻等待
System.out.println("已连接");
}
public class TCPClient {
public static void main(String[] args) throws IOException {
// 客户端申请连接
Socket socket = new Socket("127.0.0.1",8888);
}
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
// 服务器端也建立了一个插座
while (true){
Socket ss = serverSocket.accept(); // 如果client没有连接,则傻傻等待
System.out.println("已连接");
// 这个流是阻塞的
DataInputStream dataInputStream = new DataInputStream(ss.getInputStream());
String str = dataInputStream.readUTF();
System.out.println(str);
dataInputStream.close();
ss.close();
System.out.println("superkcl");
}
}
public class TCPClient {
public static void main(String[] args) throws Exception {
// 客户端申请连接
Socket socket = new Socket("127.0.0.1",8888);
OutputStream outputStream = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(outputStream);
Thread.sleep(5000);
dos.writeUTF("hello server!");
dos.flush();
dos.close();
socket.close();
}
}
此方式是同步的
一个客户端阻塞通讯,那么server就无法继续连接了
java 推出了 异步式的网络应用, 大多数是异步式的编程!!(Tomcat、JBoss可以提供很多连接)
public class TestSocketServer {
public static void main(String[] args) throws IOException {
InputStream in = null;
OutputStream out = null;
ServerSocket serverSocket = new ServerSocket(5888);
Socket socket = serverSocket.accept();
in = socket.getInputStream();
out = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(out);
DataInputStream dis = new DataInputStream(in);
String str = null;
if((str = dis.readUTF()) != null){ // 收数据
System.out.println(str);
System.out.println("from: " + socket.getInetAddress()+ " port: " + socket.getPort());
}
dos.writeUTF(" I am server, hi hello"); // 发数据
dis.close();
dos.close();
socket.close();
}
}
public class TestSocketClient {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1", 5888);
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF("hey");
String str = null;
if((str = dis.readUTF()) != null){
System.out.println(str);
}
dos.close();
dis.close();
socket.close();
}
}
服务器端先读后写,客户端先写后读
同步操作
两边都读,那么都堵塞
打开管道不操作,会报错
点对点通信,你说一句,我说一句
代码有问题
public class Server {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket = new ServerSocket(9999);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
String line = sin.readLine(); // server先发送
while(!line.equals("bye")){
printWriter.println(line);
printWriter.flush();
System.out.println("server: " + line);
System.out.println("client: " + bufferedReader.readLine());
line = sin.readLine();
}
printWriter.close();
bufferedReader.close();
sin.close();
socket.close();
serverSocket.close();
}
}
public class Client {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1", 9999);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));
String str = bufferedReader.readLine();
while(!str.equals("bye")){
printWriter.println(str);
printWriter.flush();
System.out.println("Client: " + str);
System.out.println("Server: " + bufferedReader.readLine());
str = sin.readLine();
}
bufferedReader.close();
printWriter.close();
socket.close();
}
}