基于java TCP实现网络通信聊天室《建议收藏附完整源码》

🍅 作者主页:Java李杨勇 

🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌  简历模板、学习资料、面试题库、技术互助【关注我,都给你】

🍅 欢迎点赞 👍 收藏 ⭐留言 📝   

🍅  文末获取源码联系方式 📝  

1.1 前言

在信息化社会的今天,网络飞速发展,人们对网络的依赖越来越多,越来越离不开网 络,由此而产生的聊天工具越来越多,类似 MSNQQ,网络聊天时一类的聊天系统的发展日 新月异,因此产生了制作一个类似 QQ的网络聊天工具的想法,且通过制作该程序还能更好 的学习网络软件编程知识。 网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。 网编程中有两 个主要的问题, 一个是如何准确的定位网络上一台或多台主机, 另一个就是找到主机后如何 可靠高效的进行数据传输。 在 TCP/IP 协议中 IP 层主要负责网络主机的定位,

数据传输的路 由,由 IP 地址可以唯一地确定 Internet 上的一台主机。 而 TCP层则提供面向应用的可靠的 或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心 IP 层是如何处理数 据的。 目前较为流行的网络编程模型是客户机

/ 服务器( C/S)结构。 即通信双方一方作为服 务器等待客户提出请求并予以响应。 客户则在需要服务时向服务器提出申请。

服务器一般作 为守护进程始终运行, 监听网络端口, 一旦有客户请求, 就会启动一个服务进程来响应该客 户,同时自己继续监听服务端口,使后来的客户也得到响应的服务。

1.2 设计要求

本课程设计的目标是利用套接字 socket ()设计一个聊天程序,该程序基于 C/S 模式, 客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。

1.3 设计目的

通过设计一个网络聊天程序,对套接字、数据报通讯、 URL、与 URLConnectiom 的相关知 识有详细的了解和充分的认识。能将相关的只是运用到相关的实践中去。

1.4 功能实现

聊天室共分为客户端和服务端两部分,

服务器程序主要负责侦听客户端发来的消息,

客户 端需要登录到相应的服务器才可以实现正常的聊天功能。

服务器的主要功能有

1) 在特定端口上进行侦听,等待客户连接

2) 用户可以配置服务器的监听端口3) 向已经连接服务器的客户发送系统消息

5) 当停止服务时,断开所有用户的连接

客户端的主要功能

1) 连接到已经开启聊天服务的服务端

2) 用户可以配置要连接服务器端的 ip 地址和端口号

3) 用户可以配置连接后显示的用户名

4) 当服务器开启时。用户可以随时登陆

5) 用户可以向所有人或一个人发送消息

1.5 知识基础

应用到的java知识点有:

1. Thread 线程

线程池,线程启动,接口等。客户端,服务器端都用到了线程

2. Socket

使用了socket进行端口监听和数据传递

new Socket("localhost",port);

3. Swing图形化

简单的按钮,输入框,弹框等

4. 数据流

字符流包装、缓冲字符输出流包装、

PrintWrite(new OutputStream(new socket(".."),"UTF-8"),true)

部分代码:

定义服务器端的界面,添加事件侦听与事件处理。调用 start Socket方法来实现 服务端用户上线与下线的侦听, 调用 Socket类来实现服务器端的消息的 收发。

package chat;import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 聊天室服务端* @author 李杨勇**/
public class Server {//运行在服务端的Socket 用来接收客户端的连接。 private ServerSocket server;//线程池private ExecutorService threadPool;//存放所有客户端输出流的共享集合private List<PrintWriter> allOut;/*** 构造方法,用来初始化服务端*/public Server(){try {/** 初始化共享集合*/allOut = new ArrayList<PrintWriter>();/** 读取配置文件* java.util.Properties* */Properties properties = new Properties();/** void load(InputStream in)* 该方法用于读取给定的流中的数据,然后进行解析* * 我们可以使用FileInputStream这个流来读取我们* 定义的配置文件config.properties,所以我们可以* 创建这个流,然后将该流作为参数传给load方法。* 这样Properties就可以通过FileInputStream读取* 我们的配置文件了。*/FileInputStream fis = new FileInputStream("config.properties");properties.load(fis);//获取服务端端口号/** String getProperty(String key)* 给定配置文件中等号左面的内容,可以获取对应的* 值* serverport=8088*/String port = properties.getProperty("serverport");System.out.println("服务端口:"+port);/** 初始化ServerSocket时要传入一个参数* 该参数就是服务端对外开启的服务端口* 客户端就是通过该端口与服务端进行连接的*/server = new ServerSocket(Integer.parseInt(port));/**  获取线程的数量阿萨德*/String threadCount = properties.getProperty("threadcount");System.out.println("线程池线程数量:"+threadCount);/** 初始化线程池*/threadPool = Executors.newFixedThreadPool(Integer.parseInt(threadCount));} catch (Exception e) {e.printStackTrace();}}/*** 向共享集合中添加一个输出流* @param out*/public synchronized void addOut(PrintWriter out){allOut.add(out);}/*** 从共享集合中删除给定的输出流* @param out*/public synchronized void removeOut(PrintWriter out){allOut.remove(out);}/*** 遍历共享集合中的所有输出流,将给定的消息发送给所有* 的客户端* @param message*/public synchronized void sendMessageToAllClient(String message){for(PrintWriter out : allOut){out.println(message);}}/*** 服务端开始工作的方法*/public void start(){try {/** Socket accept()* 该方法是ServerSocket开始监听8088端口,这个方法* 是一个阻塞方法,直到一个客户端连接为止,若客户端* 连接了,会返回一个Socket,这个Socket就是用来与* 该客户端进行通讯的。*/while(true){System.out.println("等待一个客户端连接...");Socket socket = server.accept();System.out.println("一个客户端连接了!");/** 启动一个线程,并将刚刚连接的客户端的Socket* 传给它,让它去处理与这个客户端的交互。*/ClientHandler clientHandler= new ClientHandler(socket);
//				Thread t = new Thread(clientHandler);
//				t.start();threadPool.execute(clientHandler);}} catch (Exception e) {e.printStackTrace();}}public static void main(String[] args) {Server server = new Server();server.start();}/*** 该内部类是为服务端服务的。用来与一个客户端进行* 交互的。* @author 李杨勇*/class ClientHandler implements Runnable{/** 该线程用来交互的客户端的Socket*/private Socket socket;/** 该客户端的昵称*/private String nickName;public ClientHandler(Socket socket){this.socket = socket;/** 获取远程计算机的地址信息*/InetAddress address = socket.getInetAddress();//获取远程计算机的地址String add = address.getHostAddress();System.out.println(add+"上线了!");}public void run() {PrintWriter pw = null;try {/** 通过Socket获取输出流,用于将消息发送给* 客户端*/OutputStream out = socket.getOutputStream();OutputStreamWriter osw= new OutputStreamWriter(out,"UTF-8");pw = new PrintWriter(osw,true);//将该客户端的输出流放入共享集合中addOut(pw);/** InputStream getInputStream()* Socket的该方法用来获取远程计算机发送过来的数据*/InputStream in = socket.getInputStream();InputStreamReader isr= new InputStreamReader(in,"UTF-8");BufferedReader br = new BufferedReader(isr);/** 首先读取一行字符串,因为客户端发送过来的第一* 行字符串是该客户端的昵称,读取到后将其设置到* 属性nickName上*/nickName = br.readLine();/** 广播,该用户上线了*/sendMessageToAllClient("["+nickName+"]上线了");//读取客户端发送过来的一行字符串/** 使用BufferedReader的readLine方法读取客户端发送* 过来的一行字符串时,由于客户端所使用的操作系统* 不同,这里在客户端与服务端断开连接后,该方法的* 反应是不同的。*/String message = null;while((message = br.readLine())!=null){//将读取到的内容转发给所有客户端sendMessageToAllClient(nickName+"说:"+message);}				} catch (Exception e) {} finally{//将该客户端的输出流从共享集合中删除removeOut(pw);//广播,通知所有客户端该用户下线了sendMessageToAllClient("["+nickName+"]下线了.");/** 将该客户端的socket关闭。* 关闭socket同时也就将使用它获取的输入流与* 输出流关掉了。*/try {socket.close();} catch (IOException e) {}}}}}

功能实现截图:

首先启动server服务:

 然后启动client:

client可以启动多个

这样一个简单的基于Java TCP模拟的聊天室完成了 

课程总结:

通过本次课程设计是我对网络通信的知识有了更深的了解。 加深了对 TCP/UDP协议具体 连接过程的理解。同时对套接字、数据报通讯、 URL、与 URLConnectiom 的相关知识有了充 分的认识。并将这些知识运用到具体的案例中去。本次课程设计不仅运用到套接字的知识, 同时运用到 java 中的 GUI 编程,在设计框架中运用到各种组件与布局,通过服务器和客户 端主框架的设计, 对 GUI编程中的各种组件和布局有了更清晰地了解。 将书本上所学的知识成功运用到实践中去。 通过本次课程设计使自己对在 Java 中所学的 Swing 组件, 面板容器, 事件处理,线程的创建、同步,输入输出处理,内部类,异常处理,和网络通信的知识有了 一个复习和运用。培养了自己的编程能力,将学习和实践结合起来。 在 Java 的学习过程中,往往程序自己看得懂,但是需把所学知识运用到实践中去时,往 往会遇到这样那样的问题, 本次课程设计极大了锻炼了自己的动手能力, 同时也使自己明白 了只有动手做才会将课本上的知识变为自己的。 只有自己参与实践, 才能发现问题, 解决问题,在解决问题的过程中提升自己的能力。 希望自己以后能更多的将理论结合实践,再动手 的过程中提高自己的编程能力和软件设计能力。

代码获取:

java TCP网络通信聊天室(源码+报告论文6000字)

相关Java实战项目精彩推送

基于java ssm springboot+VUE疫情防疫系统系统前后端分离设计和实现

基于java springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于java ssm springboot+mybatis酒庄内部管理系统设计和实现

基于JAVA springboot+mybatis智慧生活分享平台设计和实现

基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现

基于JAVA SSM springboot实现的抗疫物质信息管理系统设计和实现

查看更多博主首页更多实战项目 >>>

Java李杨勇 

获取源码:

总体来说这个项目功能相对还是比较简单优秀的、适合初学者作为课程设计和毕业设计参考 

查看下方微信公众号获取联系方式~

精彩系列推荐

Java毕设项目精品实战案例《100套》

HTML5大作业实战案例《100套》

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

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

相关文章

mysql 获取年预提,【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。...

【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。更多相关问题[单选] 如果整条线组件压力突然升高&#xff0c;原因可能是()。[多选] 风机的常见故障有()。[单选] 侧吹风窗安装过程中应注意()。[判断题] 组件的压力波动会影响产品的质量。[单选] …

《零基础》MySQL 正则表达式(二十一)

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。 实例操作 查找name字段中以st为开头的所有数据&#xff1a; SELECT name FROM person_tbl WHERE name REGEXP ^st; 查找name字段中以ok为结尾的所有数据&#xff1a; SELECT name FROM person_tbl WHERE name REGEXP ok$;…

ORACLE 12C采坑之 ORA-12541:TNS:无监听程序

目录 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否有错误: 4.重新配置监听器Net Configuration Assistant 5.之后重启OracleServiceORCL服务 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否…

无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang

题目&#xff1a;给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复…

《SpringCloud超级入门》使用Eureka集群搭建《十三》

前面我们搭建的注册中心只适合本地开发使用&#xff0c;在生产环境中必须搭建一个集群来保证高可用。Eureka 的集群搭建方法很简单&#xff1a;每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。 以 2 个节点为例来说明搭建方式。假设我们有…

centos7 python3 sqlserver,centos7中python3环境支持s

在centos7环境中常规安装python3的话无法支持sqlite3和ssl,所以在安装pytho3是需要带上sqlite3库和ssl库:下载编译安装sqlite3:# wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz --no-check-certificate# ./configure --prefix/usr/local/sqlite3 --disable…

《SpringCloud超级入门》Eureka自我保护模式和InstanceID的配置《十四》

关闭自我保护 保护模式主要在一组客户端和 Eureka Server 之间存在网络分区场景时使用。一旦进入保护模式&#xff0c;Eureka Server 将会尝试保护其服务的注册表中的信息&#xff0c;不再删除服务注册表中的数据。当网络故障恢复后&#xff0c;该 Eureka Server 节点会自动退…

matlab中如何表示线积分,MATLAB - 复杂的线/路径积分

我试图使用积分命令在几个圆形闭合路径上找到复杂的线/路径积分 . 我的代码为1 /(z-i)^ 2在圆{z&#xff1a;| z | 2}上逆时针遍历的遍历如下&#xff1a;fun (z) 1 ./((z-1i) .^ 2);;g (t) 2 .*(cos(t) 1i .* sin(t));gprime (t) 2 .*(-sin(t) 1i .* cos(t));q1 integr…

基于HTML+CSS+JavaScript实现---美丽家乡石埇镇(建议收藏)

java毕业设计项目《100套》推荐 目录 前言&#xff1a; 系统首页&#xff1a; 历史沿革&#xff1a; 地理环境&#xff1a; 自然资源&#xff1a; 经济概括&#xff1a; 社会发展&#xff1a; 交通运输&#xff1a; 古迹人物&#xff1a; 古迹详情&#xff1a; 主要…

matlab取高字节,求助!如何将11字节的数提取出其中678三个字节

这是我参考MATLAB函数改写后的函数&#xff0c;基本可以满足你的要求&#xff0c;支持11字节的16进制数的string或string array或cell array输入和相应的输出并且具有检错功能&#xff0c;程序健壮性良好function dyour_solution(h)%YOUR_SOLUTION Convert 11-bytes hexadecima…

ORACLE 实现 ID 自增

前言 目录 前言 具体命令 具体详解&#xff1a; 由于oracle数据库不像mysql一样在建立表的时候设置自动增长列功能 设置UUID的缺点 字符串占用的空间比较大、 而且效率也比较低下、 生成的ID是字符串随机数。做表关联关系的时候不好找、要做排序也不现实 所以通过创建…

php mvc urlencode,PHP – LIUGUOFENG

/*** param $img 图片地址* param string $width 宽* param string $height 高* param string $ratio 保持原比例* return string 生成的地址*/public function resize_fuc($img, $width, $height, $ratio){$info get_img_info($img);$name pathinfo($img)[filename];$dirnam…

《零基础》MySQL 事务(二十二)

MySQL 事务主要用于处理操作量大&#xff0c;复杂度高的数据。比如说&#xff0c;在人员管理系统中&#xff0c;你删除一个人员&#xff0c;你既需要删除人员的基本资料&#xff0c;也要删除和该人员相关的信息&#xff0c;如信箱&#xff0c;文章等等&#xff0c;这样&#xf…

Java开发基础知识学习总结之(上)-王者笔记建议收藏

目录 一、面向对象概念 1. 面向对象和面向过程的区别&#xff1f; 2. 对象和类的关系&#xff1f;举例说明 3. 类里面包含什么&#xff1f; 4. 类的特性&#xff1f; 封装性 继承性 多态性 二、网络基础 5. DNS是什么? 6. 域名和端口&#xff1f; 7. CDN是什么? 8…

contract forward,菜鸟请教一个问题:the difference between forward contract and future contract...

做几个题目,巩固一下.assume the following information:______________________________________________90-day us interest rate 4%90-day malaysian interest rate 3%90-day forward rate of malaysian ringgit $.400spot rate of malaysian ringgit $.404________________…

Java 基础知识总结(下)-王者笔记《收藏版》

上一篇 Java基础知识学习总结之&#xff08;上&#xff09; 下一篇 Java 集合容器篇面试题 &#xff08;上&#xff09; java毕业设计项目《100套》推荐 毕设/私活/大佬必备&#xff0c;一个挣钱的开源前后端分离脚手架 2W字梳理总结Java--Mybatis经典面试题《王者笔…

火车头php接口制作,火车头接口

通俗一点说火车采集器的接口文件就是一个写入数据库的代码。ASP接口是用ASP语言写入数据库&#xff0c;PHP接口就是用PHP语言编程写入数据库。单独的写入数据库并不难&#xff0c;就算您不是ASP或者PHP程序员&#xff0c;上百度搜索下两种语言的入库教程就可以轻松做一个简单的…

php支持哪8种数据类型,PHP八种数据类型+使用实例

PHP的八种数据类型PHP中变量的数据类型通常不是由程序员设定的&#xff0c;准确的说&#xff0c;是PHP根据该变量使用的上下文在运行时决定的&#xff0c;简单的说就是&#xff0c;我们不需要设定变量的数据类型&#xff0c;PHP会自动识别。四种标量数据类型boolean(布尔型)也叫…

基于Java+jsp+servlet的养老院管理系统设计和实现《收藏版》

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345; 文末获取源码联系方式 &#x1f4dd; 一、 选题的依据…

oracle ldap 配置,Ubuntu安装OpenLDAP之配置LDAP

Ubuntu配置OpenLDAP上一篇博文中&#xff0c;我们成功的安装了OpenLDAP-2.4.4到系统中&#xff0c;这篇文章介绍如何基于上一篇文章配置一个自己的ldap服务器来使用。(上篇见 http://www.linuxidc.com/Linux/2016-05/130997.htm)1 配置ldap的dc和cnvim /usr/local/etc/openldap…