java搭建聊天服务器_使用 ServerSocket 建立聊天服务器-2

1.

b47bf360e681b3a5787de09a99e1980b.png

从serverListener中可以看出,每一个客户端创建新的请求之后,都会把它分配给一个独立的chatsocket ,但是每一个ChatSocket都是相互独立的,他们之间并不能沟通,所以要新建一个类,将这些新建的线程管理起来,然后实现他们之间的相互通信.(类似于微信加群聊天的功能)

由于一个聊天服务器只有一个管理者,所以创建chatManager.java管理类,需要对类做单例化的处理

===================================================================

1.项目截图

a4ce9145fe1c36fb850023148f170208.png

2.ChatManager.java

package com.nantian.socket;

import java.util.Vector;

public class ChatManager {

/**

* 由于一个聊天服务器只有一个管理者,所以创建chatManager.java管理类,需要对类做单例化的处理

*/

//单例化第一步,需要构造private的构造方法

private ChatManager() {}

//为当前类创建实例

private static final ChatManager cm=new ChatManager();

public static ChatManager getChatManager() {

return cm;

}

//===========以上代码完成了单例化的操作

Vector vector=new Vector();

//为当前类添加一个新的chatSocket

public void add(ChatSocket cs) {

vector.add(cs);

}

//还需实现一个方法,实现其中一个线程调用下面的方法向其他客户端发送信息

//ChatSocket cs(当前线程),String out(发送的信息)

public void publish(ChatSocket cs,String out) {

//发送给所有线程,需要对集合中的线程进行遍历

for (int i = 0; i < vector.size(); i++) {

//获取循环中的第i个对象

ChatSocket csChatSocket=vector.get(i);

//当前发送的线程没必要接收这条信息

//如果等于当前发送对象的话,就不执行发送消息

if (!cs.equals(csChatSocket)) {

//调用out()方法将字符串out传输出去

csChatSocket.Out(out);

}

}

}

}

===================================================================

2.ChatSocket.java

package com.nantian.socket;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.UnsupportedEncodingException;

import java.net.Socket;

public class ChatSocket extends Thread{

//本地需要有一个socket对象,来接入传入的值

Socket socket;

/**

* 创建构造方法

*/

public ChatSocket(Socket s) {

this.socket=s;

}

/**

* 运行MyServerSocket类后,没有值输出后所写的方法

* @param out

*/

public void Out(String out) {

try {

socket.getOutputStream().write(out.getBytes("UTF-8"));

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

/**

* 复写run方法,执行后台的功能

*/

@Override

public void run() {

//将socket的输入流进行包装

try {

BufferedReader br=

new BufferedReader(

new InputStreamReader(

socket.getInputStream(),"UTF-8"));

//创建本地对象

String line=null;

while ((line=br.readLine())!=null) {

//聊天室中的所有信息发送给所有人,需要调用publish()方法

//将自己传入使用this

ChatManager.getChatManager().publish(this, line);

}

//while循环结束,需要将当前的流关闭

br.close();

} catch (UnsupportedEncodingException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

===================================================================

3.MyServerSocket.java

package com.nantian.socket;

//ctrl+shift+o删除多余的jar包

public class MyServerSocket {

public static void main(String[] args) {

new ServerListener().start();

}

}

===================================================================

4.ServerListener.java

package com.nantian.socket;

import java.io.IOException;

import java.net.ServerSocket;

import java.net.Socket;

import javax.swing.JOptionPane;

public class ServerListener extends Thread{

@Override

public void run() {

try {

//port取值范围:1-65535(通常取值较大,这样可以和系统的分开)

ServerSocket serverSocket=new ServerSocket(12345);

//循环监听来自客户端的连接

while(true) {

//监听客户端的连接

//accept()为一个阻塞的方法,会阻塞当前的线程

//ServerSocket的accept()方法是侦听并接受到此套接字的连接,

//就是一直等待连接,此方法在连接传入之前一直阻塞。直到接受到有socket的连接。

//故创建ServerLIstener extends Thread

Socket socket=serverSocket.accept();

//建立连接

JOptionPane.showMessageDialog(null, "有客户端连接到了本机的12345端口");

//因为每一个Socket要与客户端独立的通信,所以socket需要另起一个线程

//将socket传递给新的线程,用于socket通信,故创建ChatSocket extends Thread

ChatSocket cs=new ChatSocket(socket);

cs.start();

//将cs添加到聊天管理器中

ChatManager.getChatManager().add(cs);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

===================================================================

5.run as -->java application

cmd,输入telnet localhost 12345,截图如下

485a652b2003e93393d90dd96d1d6aee.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lavarel php区别,laravel中{{}}和{!! !!}的区别详解

本篇文章介绍了laravel中{{}}和{!! !!}的区别&#xff0c;感兴趣的朋友可以参考下。laravel中{{}}和{!! !!}的区别详解1.{{}}和{!! !!} 中{{}}支持转义 一段html代码只是被当成普通的字符串输出 &#xff0c;{!! !!} 不支持转义 一段html代码可以被正常的解析1.2具体什么意思呢…

php获取ios,IOS 通过描述获取UDID PHP代码版

难点在于PHP对XML的解析文件结构&#xff1a;第一步&#xff1a;新建HTML文件 用于跳转安装描述文件 必须在safari里面打开地址第二步&#xff1a;新建udid.mobileconfig文件PayloadContentURLhttps://www.xxx.com/pay_super/receive.phpDeviceAttributesUDIDIMEIICCIDVERSIONP…

matlab如何读取csv,Matlab:如何读取CSV文件以及如何读取带有字符串数据项的CSV文件 | 学步园...

CSV&#xff0c;逗号分开的文件&#xff0c;如果能快速的读取这些文件中的数据&#xff0c;无疑会帮助我们解决很多问题。1、 只有数据的CSV文件&#xff0c;CSV file that includes only numbers.As an example, create a text file, named as data.csv if you prefer, which …

url中隐藏php后缀,url中如何隐藏.php

url中隐藏“.php”的方法&#xff1a;首先找到并打开“nginx.conf”配置文件&#xff1b;然后添加内容“location / {ttry_files $uri $uri/ $uri.php$is_args$args;}”&#xff1b;最后保存修改即可。推荐&#xff1a;《PHP视频教程》现在很多人都喜欢用nginx作为Web服务器部署…

discuz手机客户端java,Discuz!7.2让高级搜索更全面

Discuz! 7.2 调整了对帖子的高级搜索&#xff0c;使高级搜索的搜索选项更细化&#xff0c;覆盖面更广。一、高级搜索功能介绍高级搜索界面如下图所示&#xff1a;1、按作者&#xff1a;此处可以填写发帖作者全名&#xff0c;也可以使用通配符"*"&#xff0c;如填写&q…

php面向对象异常处理,PHP 错误和异常处理(下)

PHP 错误和异常处理(下)由 学院君 创建于9个月前, 最后更新于 7个月前版本号 #11723 views2 likes0 collects上篇我们讲了 PHP 中的错误报告和捕获&#xff0c;今天&#xff0c;我们来看看 PHP 程序中的异常处理。错误 vs. 异常错误与异常可以看作一对孪生兄弟&#xff0c;从严…

电脑运行java游戏,电脑运行软件卡顿?这几招游戏或是办公,让你速度飞起!...

许多朋友想知道他们已经购买了高端计算机&#xff0c;但是无论玩游戏还是运行软件&#xff0c;他们仍然陷于困境。今天&#xff0c;让我们教大家一个简单的方法来提高计算机性能。焦点&#xff1a;此方法大大提高了用户对高度配置的计算机的影响。如果计算机的设置不太高&#…

c matlab 数据类型,matlab中数据类型与c语言数据类型的区别?

matlab中数据类型与c语言数据类型的区别&#xff1f;mip版 关注:233 答案:3 悬赏:0解决时间 2021-02-23 08:46已解决2021-02-22 22:32matlab中数据类型与c语言数据类型的区别&#xff1f;最佳答案2021-02-22 22:42简单谈一下。1.好多类型是对应的。输入一个数&#xff0c;ma…

oracle数据库安装提示M,Python第13课:oracle数据库的安装

Python第13课&#xff1a;oracle数据库的安装时间 2019-01-22下午4&#xff1a;30主讲 罗恒丰地点 四楼电教室版本&#xff1a;11.2大小&#xff1a;2.06G安装文件在专班ftp里python安装文件的文件夹。一.找到 stage/cvu/cvu_prereq.xml &#xff0c;编辑系统名&#xff0c;以适…

linux 文件怎么不让删,请问如何设置权限,可以禁止用户删除文件

原帖由 WHITLACK 于 2009-9-28 08:48 发表 针对某个文件&#xff0c;如何设置权限&#xff0c;可以禁止删除&#xff1f;文件权限的r-w-x好像不能禁止删除的啊&#xff0c;谢谢指教&#xff01;1:使用粘滞位可以做到,下面是介绍.强制位与冒险位、粘滞位针对u&#xff0c;g&…

linux运行中望cad,国产CAD软件中望的Linux版适配UOS, 我在国产系统里试了试

可能大家都知道&#xff0c;以往我们在国产操作里运行的软件&#xff0c;很多都是国外开源的软件。在以前很长一段时间里&#xff0c;国产操作中&#xff0c;国内企业很少去适配的。据说&#xff0c;国产深度之所以有很多国产软件&#xff0c;其中一个原因就是他们一家一家去拜…

linux内核死锁检测机制 | oenhan,Linux内核CPU负载均衡机制 | OenHan

还是神奇的进程调度问题引发的&#xff0c;参看Linux进程组调度机制分析&#xff0c;组调度机制是看清楚了&#xff0c;发现在重启过程中&#xff0c;很多内核调用栈阻塞在了double_rq_lock函数上&#xff0c;而double_rq_lock则是load_balance触发的&#xff0c;怀疑当时的核间…

linux下IPROTO_TCP,TCP/IP协议栈在Linux内核中的运行时序分析

可选题目三&#xff1a;TCP/IP协议栈在Linux内核中的运行时序分析在深入理解Linux内核任务调度(中断处理、softirg、tasklet、wq、内核线程等)机制的基础上&#xff0c;分析梳理send和recv过程中TCP/IP协议栈相关的运行任务实体及相互协作的时序分析。编译、部署、运行、测评、…

vs2019Linux守护,Visual Studio 2019将支援Ninja显着提升Linux专案建置效率

微软更新Visual Studio 2019&#xff0c;新增多个可提升Linux开发体验的功能&#xff0c;包括在Linux上支援建置系统Ninja&#xff0c;以及更完整地支援gdbserver&#xff0c;而且现在开发者也可以使用连接管理器(Connection Manager)&#xff0c;编辑和配置预设的远端连接。使…

c语言程序中必不可少的,C语言程序设计(第3章程序控制语句)2

3.2 数据的输入与输出在程序的运行过程中&#xff0c;往往需要由用户输入一些数据&#xff0c;而程序运算所得到的计算结果等又需要输出给用户&#xff0c;由此实现人与计算机之间的交互&#xff0c;所以在程序设计中&#xff0c;输入输出语句是一类必不可少的重要语句&#xf…

android 九宫格封装,Android 九宫格布局

演示image需求满足0-9个图的适配图数量演示1image2image3image4image5image6image7image8image9image使用手动设置android:layout_width"match_parent"android:layout_height"wrap_content"app:ngl_gridSpace"10dp"app:ngl_oneChildHeight"…

android放大镜无广告,Android放大镜的实现代码

快三个月了没写博客了&#xff0c;因为工作调动&#xff0c;很多经验、心得都没有时间记录下来。现在时间稍微充裕了点&#xff0c;我会尽量抽时间将之前想写而没写的东西补上。进入正题。去年某个时候&#xff0c;我偶然看到一篇文章&#xff0c;讲android里面放大镜的实现。文…

鸿蒙和宙斯谁厉害,漫威宇宙宙斯vs奥丁,到底谁更强

宙斯在漫威里&#xff0c;是希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之一&#xff0c;也是奥林匹斯大部分神和神奇女侠戴安娜的父亲&#xff0c;同时也是沙赞的力量来源之一能力&#xff1a;不朽(只有宙斯的血能杀死宙斯)宙斯神力雷霆之怒控制天气宙斯的力量并不是某…

背计算机专业英语词汇,计算机专业英语词汇1500词(五)

201. exit n. & vi. 出口&#xff1b;退出202. report vt. & n. 报告&#xff0c;报表203. execution n. 执行204. backup n. 备份&#xff0c;后备&#xff0c;后援205. version n. 版本206. find v. 寻找&#xff0c;发现207. pointer n. 指针&#xff0c;指示字208.…

优考试在线考试系统计算机,使用优考试在线考试系统解决企业员工考核评比

随着信息时代的高速发展&#xff0c;很多实体传统的东西已经慢慢搬到网络上了&#xff0c;在线考试就是在其中发展的很迅速的一种&#xff0c;企业的员工考核、员工的培训、评比都可以使用企业在线考试系统来解决了&#xff0c;电脑微信小程序手机考试相结合&#xff0c;让考试…