package com.atolance.threadtcp;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
public class TcpClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("192.168.0.12", 8888);
DataOutputStream ds = new DataOutputStream(socket.getOutputStream());
ds.writeUTF("核打击");
ds.flush();
ds.close();
socket.close();
}
}
使用循环来模拟多线socket连接
服务器端代码:
package com.yaoxun.threadtcp;
import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8888);
int i = 0;
while(true) {
Socket socket = serverSocket.accept();
i ++;
System.out.println("第"+i+"个客户端连接成功");
//DataInputStream方便读取数据
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
System.out.println(dataInputStream.readUTF());//读出流中的数据,DataInputStream对象的readUTF()方法可以读出流中的数据,而且支持中文
socket.close();
dataInputStream.close();
}
}
}
以上代码利用Socket对象和ServerSocket对象进行简单的网络交互,即客户端通过DataOutputStream对象的writeUTF()方法向服务器发送消息,服务器利用DataInputStream对象的readUTF()方法读出数据。
看上去挺好,但ServerSocket对象的accept()方法是阻塞的方法,它会一直等待,直到有客户端连接。
同理,DataInputStream对象的readUTF()方法也是阻塞的方法,它也会一直等待,直到客户端调用writeUTF()方法。
因此,假如某个客户端成功连接服务器,但是迟迟不调用writeUTF()方法发送数据,服务器就要一直等待,直到客户端调用writeUTF()方法为止,此期间整个服务器是阻塞的,无法再接受其他客户端连接,显然这不符合实际情况。