1 先写一个简单版的,只有一个客户端,一个服务端,两者交互一次后自动结束,分析代码存在的问题在代码注释中:
客户端代码: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.net.UnknownHostException; public class Client { /** * @param args */ public static void main(String[] args) { try { // 客户端向服务端发送数据,接受服务端数据时,这两者不应该是顺序的,就是说 客户端可以不听的发送数据给服务端,而不必等 服务端回复数据后客户端在进行发送数据。 Socket client = new Socket("localhost" , 8888); DataOutputStream dos = new DataOutputStream(client.getOutputStream()) ; DataInputStream dis = new DataInputStream(client.getInputStream()) ; dos.writeUTF("zm来了") ; String msg = dis.readUTF() ; System.out.println("服务端返回数据为: " + msg); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 服务端代码: import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class Server { /** * @param args */ public static void main(String[] args) { try { ServerSocket server = new ServerSocket(8888); Socket client = server.accept(); /** * 问题: 每一个client都会和服务端进行连接,每一次连接后这个管道都会有 数据流入和流出,应该将下面的数据流入出封装起来, * 这样在多个客户端和服务端的管道之间,能够将不同管道进行独立并相互发送数据比如 私聊,或者发送给别的客户端数据 */ DataInputStream dis = new DataInputStream(client.getInputStream()) ; DataOutputStream dos = new DataOutputStream(client.getOutputStream()) ; String msg = dis.readUTF(); // 从客户端获取数据 dos.writeUTF("欢迎您: " + msg); } catch (IOException e) { e.printStackTrace(); } } }
可以改进的有:
- 聊天室中,server服务端就是一个中转站
- 聊天室中,client每个客户端彼此独立,每个客户端发送数据,接收数据彼此独立, 按照现有知识,客户端发送数据,接收数据可以封装到Runnable中,使用线程
-
聊天室中,server服务端不停的接收客户端的连接,接收一个就构成一个管道(channel),在这个管道中存在输入和输出流,每个管道之间应该彼此独立,管道之间可以相互独立发送数据(私聊),可以管道向非自己管道的客户端中发送数据(sendothers),按照
现有知识,channel可以用一个runnable来封装
见下图:
第一个图中,发送数据和接收数据应该相互独立
图2, 客户端和服务端的连接channel中的的发送和接收流应该封装到 channel线程中,保证每个客户端和服务端的连接都相互独立