`
Codestarter
  • 浏览: 11083 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类

网络通信基础总结2——一个简单的可以实现群聊的多线程服务器

阅读更多

在看完我的上一篇总结以后,大家可能会有一个问题,上述的那个服务器只能连接一个客户端,难道只能进行一对一得服务器和客户端的聊天吗?怎么才能实现两个客户端之间也能聊天?别着急,这一篇总结中我将会给出答案!

首先得确保你的服务器是一个相对稳定的服务器,即可以循环等待客户端的连接的,这在上一篇博客中已经解决了这个问题,就是在服务器调用accept()方法的时候让服务器进入一个while循环当中,这样当这个客户端断开连接后,只要服务器不关闭还可以再次连接,同时别的客户端也可以连接到你的服务器。就是这样的一个简单的循环条件就解决啦~

//2.当有客户机连接上来时,等待的方法就会返回一个代表客户机连接的对象
 while(true) 
{ java.net.Socket client=server.accept();

 

 接下来要做的就是把上一篇中处理与客户端通信的方法processClient写到一个线程类中去,每登陆上一个客户端,就把它作为一个独立的线程对象来处理,这样一个可以实现群聊,多客户的服务器就建好啦

 

 最后我把整合的代码发表如下,首先是一个线程类,支持多线程客户:

public class ServerThread extends Thread{
	private java.io.OutputStream ous;
	//private java.io.InputStream ins;
	private java.net.Socket client;//线程类要处理的连接对象
	
	public ServerThread(java.net.Socket sc){
		this.client=sc;
	}

	//发送消息的方法
	public void sendMsg2Me(String msg) throws IOException{
		byte[] data=msg.getBytes();
		ous.write(data);
		ous.flush();
		
	}
	public void run(){
		//在线程run中调用处理连结的方法
		processClient(this.client);
		//处理方法执行完毕后,线程自己即退出...
	}
	
	public void processClient(java.net.Socket client) {
		try{
		InputStream ins=client.getInputStream();
		ous=client.getOutputStream();
		
		String s="欢迎你!\r\n";
		this.sendMsg2Me(s);
		
		String inputS=readString(ins);//读取客户机发来的
		while(!inputS.equals("bye")){
		s="我收到了你的话啦 "+inputS+"\r\n";
		this.sendMsg2Me(s); //将这个字符串发送给客户机对象
		inputS=readString(ins);//再次读取
		}
		s="你好,欢迎再来!\r\n";
		this.sendMsg2Me(s);
		client.close();
		}catch(Exception e){
			e.printStackTrace();
		}
		}
		
	public String readString(java.io.InputStream ins) throws IOException{
	    //创建一个字符串缓冲区
		StringBuffer stb = new StringBuffer();
		int i=ins.read();
		while(i!=13){
			stb.append((char)i);
			
			i=ins.read();
			System.out.println("读到的字节是:"+i);
			if(i==-1){
				client.close();
				System.out.println(">>>>>");
			}
		}
		
		
		
		String input = stb.toString().trim();
		return input;
	}
	}

 

然后就是一个服务器循环等待客户连接进入的ChatServer类,同时也在这个类中启动线程,具体代码如下:

public class ChatServer {

	private ServerThread th;
	public void setUpServer(int port){
		try{
			//1.建立绑定在指定端口上的服务器对象
			java.net.ServerSocket server=new java.net.ServerSocket(port);
			System.out.println("服务器创建成功!"+port);
			
			//2.当有客户机连接上来时,等待的方法就会返回一个代表客户机连接的对象
			while(true){
				java.net.Socket client=server.accept();
				System.out.println("连接进的客户端的IP地址是:"+client.getRemoteSocketAddress());
				//调用处理对象的方法去处理对象
				th=new ServerThread(client);
				th.start();
			}
		}catch(Exception ef){
			ef.printStackTrace();
		}
	}
	
	
	
	public static void main(String args[]){
		ChatServer cs = new ChatServer();
		cs.setUpServer(9090);
	}
		
	}

 

      如此一来,一个支持多客户群聊的服务器就建好啦,当然这里还有很多缺陷需要改进。还有一个更重要的问题,难道我们永远得在DOS界面下启动客户端吗?如何能有一个稳定的有界面的客户端呢?下一篇日记我将给出答案~

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics