`

java socket聊天室

    博客分类:
  • Java
阅读更多

一个java版本的控制台版的聊天室,记录一下。以便后续使用

服务端

package com.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 * 1.创建服务器端口
 * 2.接收客户端连接
 * 3.发送数据
 * @author jacktan
 *
 */
public class Server
{
	public List<MyCall> all = new ArrayList<>();
	
	public static void main(String[] args) throws IOException
	{
		new Server().start();
	}
	
	public void start() throws IOException {
		//1.创建服务器端口,指定端口
		ServerSocket serverSocket = new ServerSocket(8888);
		//2.接收客户端连接,阻塞
		while ( true ) {
			Socket socket = serverSocket.accept();
			MyCall my = new MyCall(socket);
			//将客户端添加到容器中
			all.add(my);
			new Thread(my).start();
		}
	}
	
	private class MyCall implements Runnable {
		private BufferedReader br = null;
		private BufferedWriter bw = null;
		private boolean isRunning = true;
		private String name;
		public MyCall(Socket socket)
		{
			try
			{
				bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
				br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				this.name = br.readLine();
				this.send(this.name+"欢迎您进入聊天室");
				this.sendOther(this.name+"进入聊天室");
			} catch (IOException e)
			{
				isRunning = false;
			}
		}
		
		/**
		 * 读取消息
		 * @return
		 */
		public String receive() {
			String lineText = "";
			try
			{
				lineText = br.readLine();
			} catch (IOException e)
			{
				isRunning = false;
				CloseUtils.closeAll(br);
				all.remove(this);
				
			}
			return lineText;
		}
		
		/**
		 * 发送数据
		 * @param msg
		 */
		public void send(String msg) {
			if ( msg == null || "".equals(msg) ) {
				return;
			}
			//私聊只需要改这里的代码就可以了
			try
			{
				bw.write(msg);
				bw.newLine();
				bw.flush();
			} catch (IOException e)
			{
				isRunning = false;
				CloseUtils.closeAll(bw);
				all.remove(this);
			}
		}
		
		/**
		 * 发送给其他人
		 */
		public void sendOther(String msg) {
			//发送消息给所有人,不包含自己
			for ( MyCall m : all ) {
				if ( m != this ) {			
					m.send(msg);
				}
			}
		}

		@Override
		public void run()
		{
			while ( isRunning ) {
				sendOther(receive());
			}
		}
	}
}

 客户端:

package com.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 1.创建连接
 * 2.接收数据
 * @author jacktan
 *
 */
public class Client
{
	public static void main(String[] args) throws UnknownHostException, IOException
	{
		System.out.println("请输入您的名称:");
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String name = br.readLine();
		
		Socket client = new Socket("localhost",8888);
		new Thread(new Send(client,name)).start();
		new Thread(new Receive(client)).start();
	}
}

 发送数据:

package com.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
 * 发送数据的线程
 * 
 * @author jacktan
 * 
 */
public class Send implements Runnable
{
	// 1.获取控制台输入流
	private BufferedReader console;
	// 2.获取输出流
	private BufferedWriter bw;
	// 3.当前线程标识
	private boolean isRunning = true;
	// 4.客户名称
	private String name; 
	
	public Send()
	{
		console = new BufferedReader(new InputStreamReader(System.in));
	}

	public Send(Socket socket,String name)
	{
		this();
		this.name = name;
		try
		{
			bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			//客户端一进入就给服务器发送一条消息
			send(this.name);
		} catch (IOException e)
		{
			// 不让线程再运行
			isRunning = false;
			CloseUtils.closeAll(console,bw);
		}
	}
	
	
	//从控制台接收数据
	private String getMsgFromConsole() {
		try
		{
			return console.readLine();
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			//e.printStackTrace();
		}
		return "";
	}
	
	//发送数据
	public void send(String msg) {
		if ( msg != null && !msg.equals("") ) {
			try
			{
				bw.write(msg);
				//换行并强制刷新
				bw.newLine();
				bw.flush();
			} catch (IOException e)
			{
				//发送失败退出
				isRunning = false;
				CloseUtils.closeAll(console,bw);
			}
		}
	}

	@Override
	public void run()
	{
		while (isRunning)
		{
			send(getMsgFromConsole());
		}
	}

}

 接收数据:

package com.tcp;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

import javax.sound.sampled.ReverbType;

/**
 * 接收数据的线程
 * @author jacktan
 *
 */
public class Receive implements Runnable
{
	//1.获取输入流
	private BufferedReader br = null;
	//2设置标识符
	private boolean isRunning = true;
	public Receive(Socket socket)
	{
		try
		{
			br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		} catch (IOException e)
		{
			isRunning = false;
			CloseUtils.closeAll(br);
		}
	}
	
	/**
	 * 接收数据
	 */
	public String receive() {
		String lineText = "";
		try
		{
			lineText = br.readLine();
		} catch (IOException e)
		{
			isRunning = false;
			CloseUtils.closeAll(br);
		}
		return lineText;
	}
	
	@Override
	public void run()
	{
		while ( isRunning ) {
			System.out.println(receive());
		}
	}
	
}

 关闭资料功能类

package com.tcp;

import java.io.Closeable;
import java.io.IOException;

public class CloseUtils
{
	/**
	 * 关闭所有流
	 * 
	 * @param io
	 */
	public static void closeAll(Closeable... io)
	{
		for (Closeable temp : io)
		{
			if (temp != null)
			{
				try
				{
					temp.close();
				} catch (IOException e)
				{
					// TODO Auto-generated catch block
				}
			}
		}
	}
}

 

 

分享到:
评论

相关推荐

    Java Socket聊天室

    Java Socket聊天室是一种基于Java编程语言实现的网络通信应用,它利用了Socket接口来构建一个局域网内的多人聊天环境,类似于QQ群的功能。在这个项目中,开发者运用了多线程技术来处理并发的用户交互,同时利用...

    java socket 聊天室

    Java Socket聊天室是一种基于Java网络编程技术实现的通信系统,主要使用了Socket接口来构建客户端与服务器端的连接。在这个项目中,用户通过控制台(console)进行交互,体验类似于简单的在线聊天室。以下是对这个Java...

    完整的java socket聊天室

    Java Socket聊天室是一种基于TCP/IP协议的网络通信应用,它允许客户端和服务端通过Socket进行双向通信,实现数据的交换。本项目提供了一个完整的聊天室实现,包括服务端和客户端的代码,具有图形用户界面(GUI),...

    MATLAB-GUI-平台的人脸购物系统.zip

    程序可以参考,非常好的思路建设,完美!

    MATLAB-GUI-平台的人脸考勤.zip

    程序可以参考,非常好的思路建设,完美!

    【毕业设计】java+springboot+vue二手车估值与销售平台实现(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java+springboot+vue二手车估值与销售平台实现(完整前后端+mysql+说明文档+LunW).zip

    【悬索桥】基于matlab单跨悬索桥风致静位移的基准解决方案【含Matlab源码 9993期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【图像加密解密】基于matlab混沌和DCT变换图像加密解密【含Matlab源码 9709期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    三菱PLC程序大型项目:QCPU+QD77MS集成电气开发系统,包含自动化设备控制程序、伺服模块设置与通信功能丰富的控制系统 ,三菱PLC大型自动化控制项目:涵盖电气开发全套资料、高效程序结构设计与丰

    三菱PLC程序大型项目:QCPU+QD77MS集成电气开发系统,包含自动化设备控制程序、伺服模块设置与通信功能丰富的控制系统。,三菱PLC大型自动化控制项目:涵盖电气开发全套资料、高效程序结构设计与丰富通信功能应用,三菱PlC程序大型项目QCPU+QD77MS16 项目说明如下: 1.包含一套完整的电气开发系统资料(包含plc程序,触摸屏程序,伺服模块设置程序,程序开发地址规划表) 2.这套开发程序是用一套完美的程序结构进行设计,掌握这套程序结构后就可以开发各种自动化设备控制程序 3.提供的这套三菱plc程序开发地址规划表可以大大提高程序开发效率 4.三菱伺服运动模块设置程序中包含详细的各轴参数设置可以参考学习 5.触摸屏程序中也有一套完美的框架结构,掌握以后可以套用各种自动化设备 6.这套控制系统,包含几十个三菱伺服,三协机器人,BCR,CCD色彩检测仪等,用到串口通信,socket套接字通信,Cclink IE通信功能丰富多样。 ,三菱PLC程序; QCPU+QD77MS16; 电气开发系统资料; 程序结构; 开发效率; 伺服运动模块设置; 轴参数设置; 触摸屏程序框架; 三菱

    096-FreeRTOS+LCD1602+ADS1015 application.rar

    freertos

    【毕业设计】java-springboot+vue高校学科竞赛平台源码(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot+vue高校学科竞赛平台源码(完整前后端+mysql+说明文档+LunW).zip

    CmsTop模板帮助手册.mht

    CmsTop模板帮助手册

    【光学】基于matlab菲涅耳衍射S-FFT计算平面波照射下给定波长及距离的衍射场振幅图像【含Malab源码 11032期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【PFJSP问题】基于matlab灰狼算法GWO求解置换流水车间调度问题PFSP【含Matlab源码 10023期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【气动学】基于matlab飞行器机动飞行质点弹道仿真(侧向和纵向)【含Matlab源码 9722期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【车间调度】基于matlab斑马算法ZOA求解分布式置换流水车间调度DPFSP【含Matlab源码 6134期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    基于遗传算法优化的CNN-LSTM股票预测模型研究与应用

    内容概要:本文提出了一种基于遗传算法(GA)优化的CNN-LSTM混合深度学习模型,用于预测韩国股市指数(KOSPI)的日收盘价。CNN用以提取特征,LSTM用于处理时间序列数据并发现长短期相关性,而GA则用于优化参数选择,确保模型最佳性能。研究表明,相比单一CNN、LSTM以及未优化的CNN-LSTM模型,提出的模型在误差率指标上显著提高预测准确性。具体而言,在均方误差(MSE)、平均绝对误差(MAE)和平均绝对百分比误差(MAPE)方面表现出更好的表现。作者还强调了未来改进方向,如纳入宏观经济因素和延长预测周期。 适合人群:对金融市场特别是股价预测有兴趣的研究人员、交易员和投资者。 使用场景及目标:本模型适用于利用深度学习进行股票价格波动预测的需求,为决策提供更具可靠性的依据。 其他说明:文章详细阐述了数据准备流程和技术细节,并提供了实验设置与结果分析图表。同时指出了一些潜在的发展趋势,比如融合多种分析手段提升精度的可能性及其局限性讨论。

    【图像去噪】小波变换图像去噪【含Matlab源码 3726期】.md

    CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型燃料电池

    燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型:基于Cruise与Simulink联合开发,源文件全包的实战项目解析,燃料电池仿真模型燃料电池仿真模型,本模型基于Cruise软件和 Simulink软件共同搭建完成,并基于实际项目搭建,本资料包包含所有源文件 ,关键词:燃料电池仿真模型;Cruise软件;Simulink软件;实际项目;源文件;,Cruise Simulink 联合建模的燃料电池仿真模型全套源文件分享

Global site tag (gtag.js) - Google Analytics