1.

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

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

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

1.项目截图

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<ChatSocket> vector=new Vector<ChatSocket>();
//为当前类添加一个新的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,截图如下

使用 ServerSocket 建立聊天服务器-2的更多相关文章

  1. Socket 基础解析使用ServerSocket建立聊天服务器

    很简单的教程哦! 1.socket 简介 Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.ServerSocket 用于 ...

  2. 使用 ServerSocket 建立聊天服务器-1

    1.代码目录 2.ChatSocket.java --------------------------------------------------------------------------- ...

  3. 使用ServerSocket建立聊天服务器(一)

    -------------siwuxie095                             工程名:TestMyServerSocket 包名:com.siwuxie095.socket ...

  4. 使用ServerSocket建立聊天服务器(二)

    -------------siwuxie095                         工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:M ...

  5. 使用Java建立聊天客户端

    ---------------siwuxie095                             关于 聊天服务器,详见本人博客的分类:来一杯Java, 里面的 使用ServerSocket ...

  6. [CareerCup] 8.7 Chat Server 聊天服务器

    8.7 Explain how you would design a chat server. In particular, provide details about the various bac ...

  7. openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

    基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ...

  8. 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件

    原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150  评论- ...

  9. 使用rabbitmq实现集群im聊天服务器消息的路由

    这个地址图文会更清晰:https://www.jianshu.com/p/537e87c64ac7 单机系统的时候,客户端和连接都有同一台服务器管理.   image.png 在本地维护一份userI ...

随机推荐

  1. 关于python的一次性能调优过程

    问题 这两天在公司帮老大写一个程序功能,要求抓取从elasticsearch和kibana服务器上返回的数据,统计所有hits的数据字段ret_code为0的hit,并计算其占有率等一些功能. 功能倒 ...

  2. 20191106-基于Python的对字母基数排序

    基数排序 概念 基数排序的算法过程是先将待排元素补位,使其长度一致,然后按照序列中的元素的每个位数进行分桶的一种算法. 比如待排序列是数字,则将所有待比较数值(正整数)统一为同样的数位长度,数位较短的 ...

  3. PAT甲级题分类汇编——杂项

    本文为PAT甲级分类汇编系列文章. 集合.散列.数学.算法,这几类的题目都比较少,放到一起讲. 题号 标题 分数 大意 类型 1063 Set Similarity 25 集合相似度 集合 1067 ...

  4. go String方法的实际应用

    让 IPAddr 类型实现 fmt.Stringer 以便用点分格式输出地址. 例如,`IPAddr{1,`2,`3,`4}` 应当输出 `"1.2.3.4"`. String() ...

  5. Vue.js 2.x API 知识梳理(一) 全局配置

    Vue.js 2.x API 知识梳理(一) 全局配置 Vue.config是一个对象,包含Vue的全局配置.可以在启动应用之前修改指定属性. 这里不是指的@vue/cli的vue.config.js ...

  6. TortoiseSVN-1.7.12.24070-x64-svn-1.7.9安装包和汉化包

    链接:https://pan.baidu.com/s/1NbrQW44N_kTh7VN0Fz0zVA 提取码:nhd9 先安装TortoiseSVN-1.7.12.24070-x64-svn-1.7. ...

  7. 三种JS截取字符串方法

    JS提供三个截取字符串的方法,分别是:slice(),substring()和substr(),它们都可以接受一个或两个参数: var stmp = "rcinn.cn"; 使用一 ...

  8. HTML5 使用localstorage 本地存储

    HTML 本地存储介绍 最早的 Cookies 自然是大家都知道,问题主要就是太小,大概也就 4KB 的样子,而且 IE6 只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还 ...

  9. extjs6 创建工程和打包发布

    准备工作: 下载extjs6的开发包,我这里是试验版:ext-6.6.0-trial.zip.解压到某个目录,我这里解压到:D:\tools\about-ext\ext-6.6.0-trial 目录下 ...

  10. Python_字符串相关操作

    1.字符串切片操作: str1='hello word' startIndex=0 #开始索引位置 endIndex=5 #结束索引位置+1 step=2 #步长 print(str1[startIn ...