多个客户端实现多人聊天
前面已经讲过一个客户端与一个服务器相连的情况,然而发现再加入一个客户端的时候,程序不能如期
运行,这是因为当你创建的只是一个客户端,另一个客户端是不能连入,简而言之就是服务器只把门牌号给了一个上访者,这时就要不断创建客户端,如下:
while(true){
//等待客户端访问
Socket socket=host.accept();
System.out.println("有人访问了");
//把跟客户端交流的事情交给线程处理
ServerThread st = new ServerThread(socket);
//开启线程 st.start();
}
同一时间处理多个实物,就必须要用到线程了
这时创建一个ServerThread来继承线程类处理发送来的客户端对象
为了一会得到各个客户端对象,我们在线程里面建立对象来存储
private static ArrayList<ServerThread> list=new ArrayList<ServerThread>();
private OutputStream output;
private Socket socket;
private String name;
一下是完整代码:
public class Server { public void setup(int port){ try { //创建服务器 ServerSocket host=new ServerSocket(port); System.out.println("通信端口"+port+"成功开启"); while(true){ //等待客户端访问 Socket socket=host.accept(); System.out.println("有人访问了"); //把跟客户端交流的事情交给线程处理 ServerThread st = new ServerThread(socket); //开启线程 st.start(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args){ new Server().setup(8888); } }
这是服务器类,具体过程参见博客通信初步
下面是线程处理类:
public class ServerThread extends Thread{ private static ArrayList<ServerThread> list=new ArrayList<ServerThread>(); private OutputStream output; private Socket socket; private String name; public ServerThread(Socket socket){ this.socket=socket; list.add(this); } //发送给客户端的信息 public void sendMessage(String msg){ try { output.write(msg.getBytes("GBK")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void run(){ try { InputStream input=socket.getInputStream(); output=socket.getOutputStream(); String str="请输入你的昵称:"; sendMessage(str); //用户名为第一次输入的名字及括号内包括其服务器地址与客户端地址 name=readLine(input)+"("+socket.getInetAddress().getHostAddress()+")"; while(true){ String chat=readLine(input); if(chat.equals("再见")){ System.out.println(name+"下线了"); break; } System.out.println(name+"说:"+chat); //群发消息的功能 for(int i=0;i<list.size();i++){ ServerThread st=list.get(i); //if(this==st) //continue; //将显示咋服务器上的文字转发到其他客户端上,实现群聊的功能 String chaton=name+"说:"+chat+"\r\n"; st.sendMessage(chaton); } } //下线break到这里,关闭客户端端口,断开连接,同时移除客户端对象 socket.close(); list.remove(this); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public String readLine(InputStream input) throws IOException{ ByteArrayOutputStream baos=new ByteArrayOutputStream(); while(true){ int n=input.read(); if(n=='\r'){ continue; } if(n=='\n'){ break; } baos.write(n); } byte[] bytes=baos.toByteArray(); String chat=new String(bytes,"GBK"); return chat; } }
实现的效果如下图,已经可以处理多人通信了:
再多加几个人聊天效果一样,接下啦,就可以做个较为漂亮的聊天软件了,例如QQ,一起动手吧
相关推荐
4、网络通信采用MINA2.0,为整个项目省去socket和多线程的麻烦,好的框架才使得整个项目增添了如此之多的功能; 5、本人与朋友已经为消灭Bug做出了很多努力,但仍然不乏一些尚未实现或存在bug的功能,有不合理的...
比较基础的代码,分客户端和服务器.实现客户端的通信,而服务器转发的功能
NULL 博文链接:https://zhoujianquan.iteye.com/blog/1916445
比较基础的代码,分客户端和服务器.实现客户端的通信,而服务器转发的功能
基于Python网络编程实现的多人聊天室项目源码+项目说明+超详细注释.zip 基于Python网络编程的多人聊天室) ## 多人聊天室 1. 可以有多个客户端,每个客户端都有自己名字(唯一) 2. 客户端可以发送一条消息到聊天室...
类似QQ的网络聊天程序。能够实现一个人与多人通信,你可以在此基础上添加更多的功能。
基于tkinter和socket tcp实现的多人在线聊天系统python源码.zip基于tkinter和socket tcp实现的多人在线聊天系统python源码.zip基于tkinter和socket tcp实现的多人在线聊天系统python源码.zip基于tkinter和socket tcp...
操作系统与Linux程序设计团队作业,基于Socket编程的多人聊天室 <C语言实现>+源代码+文档说明 - 小白不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才...
实例09-多人聊天室 实例10-端口扫描 实例11-异步网络通讯 实例12-UDP协议实现网络通讯 ... 实例94-查询分析器 实例95-DAO读写ACCESS文件 实例96-创建XML文件 实例97-浏览数据库 实例98-BLOBS 实例99-ORACLE数据库 ...
课程设计 基于Python+tkinter+socket tcp的多人同时在线的聊天系统的设计与实现+详细文档+全部资料(高分项目).zip课程设计 基于Python+tkinter+socket tcp的多人同时在线的聊天系统的设计与实现+详细文档+全部资料...
本聊天工具通过输入服务器端的IP地址将客户端和服务器端连在一起,实现两者间的实时通信,并提供多人聊天功能的一个简单软件。 本文程序的主要功能包括发送消息、互动、私聊等提供及时聊天。在VC6.0的环境下,创建了...
项目使用的技术栈以Vue2.0语法为基础,结合了uni-app框架,以及集成了第三方websocket通信框架Go-Easy。通过采用这一主流的技术栈,市面学习资料丰富,上手简单。仅需下载源码,然后配置好appId即可上线运行,为初步...
套接字是通信的基础,这是支持网络通信协议的基本接口,套接字是不同的进程之间进行网络通信的基础,在本次实现中我采用了流式套接字,流式套接字提供了双向的、有序的、可靠的数据流服务。它是面向连接的,在数据...
- -------- ...3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------
初学JAVA者的一个课后实验报告. 掌握简单的网络通信技术 --编写简单的多人聊天室程序(问题见程序设计之网络编程(清华大学出版社)>>P461)的源代码
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。...
简易多人聊天室 多线程端口扫描 网络安全课程设计 数字签名(C#重写MD5算法) - 运行中有什么问题可以私聊博主,本人高级安卓工程师,主页置顶有常见爆红解决的方法 ## 项目备注 1、该资源内项目代码都经过测试运行...
32.多人命题系统|基于SSM框架+ Mysql+Java+ B/S结构的多人命题系统设计与实现(可运行源码+数据库+开发文档+lw) 多人命题系统主要的模块包括查看;...基础能力强的可以在此基础上修改调整,以实现不同的功能。
通过采用Java的Socket编程和多线程技术,系统能够实现客户端与服务器之间的即时通信,同时支持多人在线聊天、文件传输以及音视频通话等多种功能。 在开发过程中,我们充分利用了Java的跨平台特性,使得该系统可以在...