`

网络编程 聊天室

 
阅读更多

 

 

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线程中,保证每个客户端和服务端的连接都相互独立

 

  • 大小: 104.9 KB
  • 大小: 64.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics