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,一经查实,立即删除!

相关文章

java实验10流_实验9 Java输入输出流

《实验9 Java输入输出流》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《实验9 Java输入输出流(14页珍藏版)》请在金锄头文库上搜索。1、山 西 大 学 计 算 机 与 信 息 技 术 学 院实 验 报 告姓 名 颜 凯 丽 学 号 2010242100 专业班级 软件工程一班课程名称 Java …

java获取子路径_Java中路径的获取

1.Java中获取路径的方法&#xff1a; Class_Name.class .getResource("") // Class_Name.class .getResource("/") // 获得当前类所在路径 Java中根路径就是binClass_Name.class .getResource("user.dir") // 获得当前类所…

arm9 安装java_QT5.7 AM1808 ARM9的交叉编译

目前&#xff0c;我们正在开发QT&#xff0c;用于在AM1808处理器上运行的硬件的应用程序开发 .目前&#xff0c;我们使用QT创建者开发了我们的应用程序&#xff0c;编译器版本为Qt 4.8.7 .我们计划用Qt 5.7升级它&#xff0c;为此&#xff0c;我们从中下载相应的包我们成功下载…

php pdf 文字水印图片,php如何给pdf加上文字水印和图片水印[未测试]

php给pdf加上水印环境php5.5.12fpdi-1.5.2fpdf-1.7原理利用fpdi来加载已知pdf文件&#xff0c;用fpdf对pdf进行操作注意事项免费的fpdi只支持处理pdf1.4及以下版本&#xff0c;1.5以上就需要用到FPDI PDF-Parser插件使用方法fpdi-1.5.2fpdf-1.71.文字水印 word.phprequire_once…

php调接口post,php模拟post提交请求,调用接口

/*** 模拟post进行url请求* param string $url* param string $param*/function request_post($url , $param ) {if (empty($url) || empty($param)) {return false;}$postUrl $url;$curlPost $param;$ch curl_init();//初始化curlcurl_setopt($ch, CURLOPT_URL,$postUrl)…

php 中class,PHP5中的类(class) (转)

类的结构&#xff1a;类的内部能可能有三种东西&#xff0c;就是常量(constant)&#xff0c;属性(property)和方法(method)&#xff0c;功能可以理解成类外部的常量&#xff0c;变量和函数。在这之中&#xff0c;属性和方法又可以使用public, protected, private三个不同的关键…

Php jsondb,JsonDB-PHP

JsonDB项目介绍JsonDB是一个由原生PHP实现的文件数据库&#xff0c;JsonDB只有一个文件&#xff0c;如果你不想使用庞大的数据库系统&#xff0c;而且只需要单机功能&#xff0c;那么JsonDB就是你最佳的选择。 JsonDB只有初始化写入和查询功能,所以适用于比较固定的,数据量不大…

php 发送post请求json,thinkphp ,php post发送json请求,就收post请求

发送方的代码如下namespace Api\Controller;use Think\Controller;class IndexController extends Controller{public function send(){ini_set("error_reporting","E_ALL & ~E_NOTICE");$obj->phonenum 15340958922;$data json_encode($obj);$ur…

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 …

matlab怎么写集合,matlab集合操作

C intersect(A,B) -- 返回A和B的交集(相同元素)%----C中的元素将会从小到大排序----%如果A和B都是向量&#xff0c;那么返回A、B中的相同元素如果A和B都是矩阵&#xff0c;intersect(A,B,rows) 将返回A、B中的相同列还有一种调用格式&#xff1a;[C,IA,IB] intersect(A,B);其…

php表单验证内容不能为空,php校验表单检测字段是否为空的方法_PHP教程

php校验表单检测字段是否为空的方法这篇文章主要介绍了php校验表单检测字段是否为空的方法,涉及php验证表单的技巧,非常具有实用价值,需要的朋友可以参考下本文实例讲述了php校验表单检测字段是否为空的方法。分享给大家供大家参考。具体如下&#xff1a;php校验表单&#xff0…

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服务器部署…

php字符串中单引号与双引号的区别,简单概括PHP的字符串中单引号与双引号的区别...

今天有个朋友问起,说下区别,顺便复习下。单引号与双引号的不同&#xff1a;" "双引号里面的字段会经过编译器解释&#xff0c;然后再当作HTML代码输出。 单引号里面的不进行解释&#xff0c;直接输出。单引号解析的时间比双引号快 。单引号支持转义符,双引号支持的转…

php 判断ajax访问,PHP里判断是否Ajax请求

$.ajax({type: ‘POST’,url: ‘http://www.yourwebsite.com’,beforeSend: function (XMLHttpRequest) {XMLHttpRequest.setRequestHeader(“request_type”,”ajax”);},data: ‘testtest’,success: function(rs) {alert(‘ok’);}}});PHP代码&#xff1a;echo isset($_SERV…

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;从严…

php设计者,PHP设计者---composer

Composer 是 PHP5以上 的一个依赖管理工具。它允许你申明项目所依赖的代码库&#xff0c;它会在你的项目中为你安装他们。Composer 不是一个包管理器。是的&#xff0c;它涉及 "packages" 和 "libraries"&#xff0c;但它在每个项目的基础上进行管理&#…

java内部类练习题,学习笔记——Java内部类练习题

1.尝试在方法中编写一个匿名内部类。package com.lzw;public class AnonymityInnerClass {}class OuterClass4{public OutInterface doit(final String s){return new OutInterface(){private int i0;public int getValue(){System.out.println(s);return i;}public void f(){S…