`
Codestarter
  • 浏览: 11330 次
  • 性别: 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界面下启动客户端吗?如何能有一个稳定的有界面的客户端呢?下一篇日记我将给出答案~

分享到:
评论

相关推荐

    UDP实现聊天工具(可群聊和私聊)

    综上所述,实现一个基于UDP的聊天工具涉及网络编程、多线程、数据格式化、错误处理等多个方面。开发者需要对这些知识有深入理解,并根据实际需求进行优化和调整,以创建一个高效、可靠的聊天平台。

    java网络编程[匿名群聊聊天室]

    总的来说,"java网络编程[匿名群聊聊天室]"是一个综合性的项目,涵盖了网络通信的基本原理,多线程的运用,数据序列化,以及安全性和用户体验的考量。对于想要提升Java网络编程技能的开发者来说,这是一个非常有价值...

    控制台群聊程序

    《控制台群聊程序——基于C++的Socket与多线程实现》 在信息技术领域,构建实时通信系统是一项基础且重要的任务。本项目名为“控制台群聊程序”,它通过C++语言实现了基于控制台界面的多人聊天功能,集成了登陆、...

    仿照 QQ群聊 TCP协议

    总结起来,"仿照QQ群聊TCP协议"项目涵盖了C#编程、TCP协议的运用、多线程处理、网络通信、UI交互等多个知识点。通过实现这个项目,开发者可以深入理解TCP协议的工作原理,以及如何在C#环境下构建一个实时通信系统。

    网络程序设计--MFC网络聊天室

    总的来说,"网络程序设计--MFC网络聊天室"是一个涉及网络编程、多线程、用户界面设计等多方面技术的项目。通过实践,开发者不仅能深入理解MFC类库,还能提升在网络环境下的编程能力,特别是处理并发和通信问题的能力...

    网络聊天文件传输加局域网组播群聊

    在本文中,我们将深入探讨如何实现这样的功能,并扩展到局域网内的组播群聊,同时提及一个独特的加密功能——通过改变文件后缀实现文件伪装。 首先,网络聊天的基础是建立可靠的通信链路。SSL(Secure Sockets ...

    聊天系统 完整版 多线程

    首先,我们要理解标题中的"聊天系统 完整版 多线程"意味着这是一个具备所有必要功能的聊天应用程序,它不仅包括客户端和服务器端的实现,还特别强调了多线程的设计。在聊天系统中,多线程是必不可少的,因为它允许...

    vc++网络聊天室的实现计算机操作系统课程设计说明书(含MFC源程序).pdf

    4. **进程间通信**:服务器端维护了一个套接口链表(USERLIST),用于存储与每个客户端建立连接的套接字,实现消息的分发。当有消息发送时,服务器将消息复制到每个客户端的缓冲区,并通知他们发送,从而实现信息的...

    基于java的网络聊天室---服务器端毕业设计.doc

    整个设计涵盖了网络通信的基础理论、Java Socket编程、数据库管理以及多线程技术,为学生提供了一个全面理解网络聊天室服务器端开发的机会。通过这个项目,学生能够深入理解网络通信系统的架构和工作原理,提升实际...

    计算机网络课程设计实验报告--QQ网络聊天室实现.pdf

    总结来说,这个实验报告详细阐述了如何使用Java构建一个简单的网络聊天室,涵盖了网络编程中的客户端-服务器模型、多线程通信、数据传输协议以及用户验证等多个关键知识点。通过这样的实践,学生能够深入理解计算机...

    Java聊天室项目——橙汁聊天室.zip

    《Java聊天室项目——橙汁聊天室》是一个基于Java实现的简单聊天室应用,它集成了群聊和私聊功能,允许用户进行实时交流,并且支持文件的上传和下载。这个项目不仅为用户提供了一个互动的沟通平台,还通过UDP协议...

    小型聊天软件

    总结来说,【小型聊天软件】是一个基于Java的网络通信应用,它的实现涉及到了计算机网络基础、网络编程技术,尤其是套接字通信,以及模仿QQ的用户体验设计。这个项目不仅是一个实用的聊天工具,也是学习和提升网络...

    Liaotianshi.rar_java liaotians_java 聊天_聊天

    本文将深入探讨一个基于JAVA实现的简单聊天室程序,该程序具备群聊功能以及聊天记录保存,为读者提供一个学习和参考的实例。 首先,我们要理解JAVA聊天室程序的核心概念。JAVA聊天室主要基于Socket编程,Socket是...

    java实现聊天系统计算机网络课程设计报告.pdf

    《Java实现聊天系统——计算机网络课程设计》 ...综上所述,Java实现的聊天系统结合了计算机网络、多线程和GUI技术,是一个综合性的项目,对于提升学生的实际操作技能和理论知识理解具有重要作用。

    一个简单的即时通讯工具的设计与开发

    在本文中,我们探讨的是一个基于Java和J2EE规范构建的简单即时通讯工具——JICQ。即时通讯的核心在于实时性,这需要对网络通讯有深入理解,特别是Socket编程,它是建立TCP/IP连接的基础,用于在网络中发送和接收数据...

    计算机网络课程设计实验报告--QQ网络聊天室实现.docx

    综上所述,实现QQ网络聊天室涉及到网络编程基础、多线程管理、数据传输协议设计、用户验证以及GUI界面开发等多个方面的知识。这是一个综合性的项目,旨在让学生理解计算机网络在实际应用中的工作原理和开发流程。

    java课程设计-----c/s模式的聊天室

    通过以上内容,我们可以了解到Java课程设计中的C/S模式聊天室系统涵盖了网络编程、多线程、面向对象设计等多个重要知识点。这个项目不仅有助于巩固Java语言的基本技能,还能提高对网络应用开发的理解和实践能力。

    计算机网络课程设计p2p数据交换

    在编程实现时,开发者可能使用了如Socket编程接口来处理网络通信,使用多线程或者异步处理来保证界面的响应性,以及可能用到数据压缩和加密技术来提升传输效率和安全性。 总的来说,这个项目涵盖了计算机网络中的...

    网络聊天程序-java课程设计

    Socket是网络通信的两端,一个位于服务器端,另一个位于客户端。服务器端创建一个监听Socket,等待客户端的连接请求。当客户端通过Socket连接到服务器时,它们之间就建立了一个双向通信通道,可以交换数据。 在Java...

    java做的简单的聊天室,课程设计用

    本项目是一个基于Java实现的简单聊天室,适用于课程设计或初学者学习网络通信的基础知识。该聊天室主要实现了多人之间的群聊功能,通过TCP Socket进行数据传输,确保了通信的可靠性和顺序性。 首先,我们需要了解...

Global site tag (gtag.js) - Google Analytics