在看完我的上一篇总结以后,大家可能会有一个问题,上述的那个服务器只能连接一个客户端,难道只能进行一对一得服务器和客户端的聊天吗?怎么才能实现两个客户端之间也能聊天?别着急,这一篇总结中我将会给出答案!
首先得确保你的服务器是一个相对稳定的服务器,即可以循环等待客户端的连接的,这在上一篇博客中已经解决了这个问题,就是在服务器调用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的聊天工具涉及网络编程、多线程、数据格式化、错误处理等多个方面。开发者需要对这些知识有深入理解,并根据实际需求进行优化和调整,以创建一个高效、可靠的聊天平台。
总的来说,"java网络编程[匿名群聊聊天室]"是一个综合性的项目,涵盖了网络通信的基本原理,多线程的运用,数据序列化,以及安全性和用户体验的考量。对于想要提升Java网络编程技能的开发者来说,这是一个非常有价值...
《控制台群聊程序——基于C++的Socket与多线程实现》 在信息技术领域,构建实时通信系统是一项基础且重要的任务。本项目名为“控制台群聊程序”,它通过C++语言实现了基于控制台界面的多人聊天功能,集成了登陆、...
总结起来,"仿照QQ群聊TCP协议"项目涵盖了C#编程、TCP协议的运用、多线程处理、网络通信、UI交互等多个知识点。通过实现这个项目,开发者可以深入理解TCP协议的工作原理,以及如何在C#环境下构建一个实时通信系统。
总的来说,"网络程序设计--MFC网络聊天室"是一个涉及网络编程、多线程、用户界面设计等多方面技术的项目。通过实践,开发者不仅能深入理解MFC类库,还能提升在网络环境下的编程能力,特别是处理并发和通信问题的能力...
在本文中,我们将深入探讨如何实现这样的功能,并扩展到局域网内的组播群聊,同时提及一个独特的加密功能——通过改变文件后缀实现文件伪装。 首先,网络聊天的基础是建立可靠的通信链路。SSL(Secure Sockets ...
首先,我们要理解标题中的"聊天系统 完整版 多线程"意味着这是一个具备所有必要功能的聊天应用程序,它不仅包括客户端和服务器端的实现,还特别强调了多线程的设计。在聊天系统中,多线程是必不可少的,因为它允许...
4. **进程间通信**:服务器端维护了一个套接口链表(USERLIST),用于存储与每个客户端建立连接的套接字,实现消息的分发。当有消息发送时,服务器将消息复制到每个客户端的缓冲区,并通知他们发送,从而实现信息的...
整个设计涵盖了网络通信的基础理论、Java Socket编程、数据库管理以及多线程技术,为学生提供了一个全面理解网络聊天室服务器端开发的机会。通过这个项目,学生能够深入理解网络通信系统的架构和工作原理,提升实际...
总结来说,这个实验报告详细阐述了如何使用Java构建一个简单的网络聊天室,涵盖了网络编程中的客户端-服务器模型、多线程通信、数据传输协议以及用户验证等多个关键知识点。通过这样的实践,学生能够深入理解计算机...
《Java聊天室项目——橙汁聊天室》是一个基于Java实现的简单聊天室应用,它集成了群聊和私聊功能,允许用户进行实时交流,并且支持文件的上传和下载。这个项目不仅为用户提供了一个互动的沟通平台,还通过UDP协议...
总结来说,【小型聊天软件】是一个基于Java的网络通信应用,它的实现涉及到了计算机网络基础、网络编程技术,尤其是套接字通信,以及模仿QQ的用户体验设计。这个项目不仅是一个实用的聊天工具,也是学习和提升网络...
本文将深入探讨一个基于JAVA实现的简单聊天室程序,该程序具备群聊功能以及聊天记录保存,为读者提供一个学习和参考的实例。 首先,我们要理解JAVA聊天室程序的核心概念。JAVA聊天室主要基于Socket编程,Socket是...
《Java实现聊天系统——计算机网络课程设计》 ...综上所述,Java实现的聊天系统结合了计算机网络、多线程和GUI技术,是一个综合性的项目,对于提升学生的实际操作技能和理论知识理解具有重要作用。
在本文中,我们探讨的是一个基于Java和J2EE规范构建的简单即时通讯工具——JICQ。即时通讯的核心在于实时性,这需要对网络通讯有深入理解,特别是Socket编程,它是建立TCP/IP连接的基础,用于在网络中发送和接收数据...
综上所述,实现QQ网络聊天室涉及到网络编程基础、多线程管理、数据传输协议设计、用户验证以及GUI界面开发等多个方面的知识。这是一个综合性的项目,旨在让学生理解计算机网络在实际应用中的工作原理和开发流程。
通过以上内容,我们可以了解到Java课程设计中的C/S模式聊天室系统涵盖了网络编程、多线程、面向对象设计等多个重要知识点。这个项目不仅有助于巩固Java语言的基本技能,还能提高对网络应用开发的理解和实践能力。
在编程实现时,开发者可能使用了如Socket编程接口来处理网络通信,使用多线程或者异步处理来保证界面的响应性,以及可能用到数据压缩和加密技术来提升传输效率和安全性。 总的来说,这个项目涵盖了计算机网络中的...
Socket是网络通信的两端,一个位于服务器端,另一个位于客户端。服务器端创建一个监听Socket,等待客户端的连接请求。当客户端通过Socket连接到服务器时,它们之间就建立了一个双向通信通道,可以交换数据。 在Java...
本项目是一个基于Java实现的简单聊天室,适用于课程设计或初学者学习网络通信的基础知识。该聊天室主要实现了多人之间的群聊功能,通过TCP Socket进行数据传输,确保了通信的可靠性和顺序性。 首先,我们需要了解...