使用 ServerSocket 建立聊天服务器-2
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的更多相关文章
- Socket 基础解析使用ServerSocket建立聊天服务器
		很简单的教程哦! 1.socket 简介 Socket 又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求.ServerSocket 用于 ... 
- 使用 ServerSocket 建立聊天服务器-1
		1.代码目录 2.ChatSocket.java --------------------------------------------------------------------------- ... 
- 使用ServerSocket建立聊天服务器(一)
		-------------siwuxie095 工程名:TestMyServerSocket 包名:com.siwuxie095.socket ... 
- 使用ServerSocket建立聊天服务器(二)
		-------------siwuxie095 工程名:TestMyServerSocket 包名:com.siwuxie095.socket 类名:M ... 
- 使用Java建立聊天客户端
		---------------siwuxie095 关于 聊天服务器,详见本人博客的分类:来一杯Java, 里面的 使用ServerSocket ... 
- [CareerCup] 8.7 Chat Server 聊天服务器
		8.7 Explain how you would design a chat server. In particular, provide details about the various bac ... 
- openfire:基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
		基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件 上一篇文章介绍到怎么在自己的Java环境中搭建openfire插件开发的环境,同时介绍到怎样一步步简单的开发openfir ... 
- 基于开源 Openfire 聊天服务器 - 开发Openfire聊天记录插件
		原文:http://www.cnblogs.com/hoojo/archive/2013/03/29/openfire_plugin_chatlogs_plugin_.html 随笔-150 评论- ... 
- 使用rabbitmq实现集群im聊天服务器消息的路由
		这个地址图文会更清晰:https://www.jianshu.com/p/537e87c64ac7 单机系统的时候,客户端和连接都有同一台服务器管理. image.png 在本地维护一份userI ... 
随机推荐
- NOP法破解
			目录 步骤 步骤 OD载入目标软件,汇编窗口右键搜索字符串,发现错误类提示字符串,双击该字符串来到该段代码位置. 向上寻找到跳转到本段错误提示代码的跳转指令,用NOP指令填充跳转指令. 保存修改后的代 ... 
- windows下使用linux terminal
			windows下使用linux terminal 1.下载安装包 2.安装 3.解决乱码 0.前言 其实,写这个的目的是怕自己忘了,方便以后配置和分享 1.下载安装包 安装包下载地址: http:// ... 
- Vue基础语法(样式绑定,事件处理,表单,Vue组件)
			样式绑定 事件处理 表单 Vue组件 样式绑定 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ... 
- (转)DMA(Direct Memory Access)
			DMA(Direct Memory Access) DMA(Direct Memory Access)即直接存储器存取,是一种快速传送数据的机制. 工作原理 DMA是指外部设备不通过CPU而直接与系统 ... 
- idea下spring boot jpa写原生sql的时候,报Cannot resolve table错误
			错误如图 打开View→Tool Windows→Persistence选项 在弹出的Persistence窗口的项目上右键,选择Generate Persistence Mapping→By Dat ... 
- [转载] jmeter Bean Shell的使用
			Jmeter有哪些Bean Shell 定时器: BeanShell Timer 前置处理器:BeanShell PreProcessor 采样器: BeanShell Sampler 后置处理器:B ... 
- 一、zuul如何路由到上游服务器
			所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 zuul在分布式项目中充当着一个网关的角色,而它最主要的功能像nginx一样针对上游服务 ... 
- Shell 编程中的常用工具
			文件查找 find 命令 语法格式 find命令总结: 常用选项: -name 查找/etc目录下以conf结尾的文件 find /etc -name "*.conf" -inam ... 
- 【leetcode】496. Next Greater Element I
			原题 You are given two arrays (without duplicates) nums1 and nums2 where nums1's elements are subset o ... 
- Django 启动报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7
			pycharm 报错 cmd 报错 解决办法 首先 是计算机 编码问题 是 django 读取你的 用户host名 但是 windos 用户名 如果是中文 就会报这个错 要改成 英文 
