TCP Socket简单模拟多线程

来源:互联网 发布:软件创新之路 编辑:程序博客网 时间:2024/06/04 18:24

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()方法为止,此期间整个服务器是阻塞的,无法再接受其他客户端连接,显然这不符合实际情况。


0 0
原创粉丝点击