一:引言:

显示结果在控制台显示,未能实现图形界面的结合

二:上码

1.服务端

package com.wyj.talkhome;
/**
* 实现一个用户可以接发多条消息
*
*
*/
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;public class Demo4_服务端群聊版 {//在遍历一个list的时候,还向list中添加元素private static CopyOnWriteArrayList<pipe> all =new CopyOnWriteArrayList<pipe>();public static void main(String[] args) throws IOException {System.out.println("---server---");//1.使用ServerSocket创建一个服务端 并指定一个端口号ServerSocket server = new ServerSocket(7777); //阻塞式等待链接boolean aa = true;while( aa ) {Socket client = server.accept();System.out.println("一个客户端链接成功");pipe p = new pipe(client);all.add(p);new Thread(p).start();}}static class pipe implements Runnable{private Socket client;private DataInputStream dis;private DataOutputStream dos;private boolean runing = true;private String name;public pipe( Socket client ) {this.client = client;try {dis = new DataInputStream(client.getInputStream());dos = new DataOutputStream(client.getOutputStream());this.name = receive();this.send("欢迎你的到来");sendothers(this.name+"来到了聊天室",true);//系统消息} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();release();}}//收到private String receive() {String msg = "";try {if (msg != null )msg = dis.readUTF();} catch (IOException e) {// TODO Auto-generated catch block// e.printStackTrace();release();}return msg;}//发送private void send ( String msg ) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {// TODO Auto-generated catch block//e.printStackTrace();this.runing = false;release();}}//发送信息给其他人private void sendothers(String msg,boolean isSys) {for( pipe others:all) {if( others == this) {continue;}if(!isSys)//群消息others.send(this.name+"对所有人说:"+msg);else//系统消息others.send(msg);}}//释放资源private void release() {try {if( dos != null )dos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( dis != null )dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( client != null )client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {// TODO Auto-generated method stub//Io流 //输入流 接受客户端的请求while( runing ) {//收到请求String msg  = receive();//反馈结果if( !msg.equals(""))sendothers(msg,false);elseruning = false;}//释放资源release();}}
}

2.客户端

package com.wyj.talkhome;
/*** 实现多用户可以接发多条消息* */import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;public class Demo4_客户端群聊版 {public static void main(String[] args) throws UnknownHostException, IOException  {// TODO Auto-generated method stubSystem.out.println("---client---");BufferedReader brr = new BufferedReader( new InputStreamReader(System.in));System.out.print("请输入你在群聊中的名称:");String name = brr.readLine();//使用Socket创建客户端并指定IP和端口号Socket client = new Socket("localhost",7777);new Thread(new Demo4_客户端send(client,name)).start();new Thread(new Demo4_客户端receive(client)).start();}}

3:客户端中实现的发送信息给服务端

package com.wyj.talkhome;import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class Demo4_客户端send implements Runnable{private Socket client;private DataOutputStream dos; private DataInputStream dis;private BufferedReader br;private boolean runing = true;private String name;public Demo4_客户端send( Socket client ,String name) {this.client = client;this.name = name;br = new BufferedReader(new InputStreamReader(System.in));try {dos = new DataOutputStream(client.getOutputStream());send(this.name);//建立好通道  直接发送名字} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();this.release();}}//释放资源private void release() {try {if( dos != null )dos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( dis != null )dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( client != null )client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}//从控制台获取信息private String fromconsole() {try {return  br.readLine();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();this.release();}return "";} //向服务端发送信息private void send( String msg) {try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {// TODO Auto-generated catch block//e.printStackTrace();this.runing = false;this.release();}}public void run() {// TODO Auto-generated method stubwhile(runing) {String msg = fromconsole();if( !msg.equals("")) {send(msg);}}   }}

4:客户端接受服务端反馈的消息

package com.wyj.talkhome;import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;public class Demo4_客户端receive implements Runnable{private DataInputStream dis; private Socket client;boolean runing = true;public Demo4_客户端receive(Socket client) {try {dis = new DataInputStream(client.getInputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();this.release();}}private String receive() {String msg = "";try {if (msg != null )msg = dis.readUTF();} catch (IOException e) {// TODO Auto-generated catch block//  e.printStackTrace();release();}return msg;}//释放资源private void release() {try {if( dis != null )dis.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}try {if( client != null )client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {// TODO Auto-generated method stubwhile( runing ) {//收到反馈结果String msg1 = receive();if( !msg1.equals(""));System.out.println(msg1);}}}

三:成果展示

Java使用TCP实现群聊 聊天室(多线程和tcp的使用)相关推荐

  1. 【Linux C】简易群聊 聊天室1.0

    聊天室简介 ​ 本聊天室基于LinuxC进行编写,使用到的有tcp协议.多线程.互斥量.条件变量等知识,实现一个最大可接入20个用户的群聊聊天室:服务端运行后,用户运行用户端接入,输入用户名即可接入: ...

  2. TCP创建多人聊天室

    群聊-聊天室 群聊:任何时候,任何一个客户端都可以向其它客户端发送和接受数据,服务器只起到转发的作用. 1.首先创建一个聊天室的简易版(版本1). 需求:可以多个用户同时访问服务端,并且可以不断各自请 ...

  3. Java网络编程:TCP实现群聊私聊代码

    Java网络编程:TCP实现群聊&私聊代码 和上一篇博客差不多,只不过是在群里的基础之上增加了私聊的功能,我们约定,私聊格式为:@xxx:msg 如何实现私聊呢,加入客户端c给服务器发送消息, ...

  4. Java进阶:基于TCP的网络实时聊天室(socket通信案例)

    目录 开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 ...

  5. java毕业设计——基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码)——局域网聊天室系统

    基于java+TCP+UDP的局域网聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+TCP+UDP的局域网聊天室系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  6. SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存

    SpringBoot与webSocket实现在线聊天室--实现私聊+群聊+聊天记录保存 引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/det ...

  7. 基于TCP的网络实时聊天室(socket通信案例)

    开门见山 一.数据结构Map 二.保证线程安全 三.群聊核心方法 四.聊天室具体设计 0.用户登录服务器 1.查看当前上线用户 2.群聊 3.私信 4.退出当前聊天状态 5.离线 6.查看帮助 五.聊 ...

  8. Java Socket实现简易多人聊天室传输聊天内容或文件

    Java Socket实现简易多人聊天室传输聊天内容或文件 Java小练手项目:用Java Socket实现多人聊天室,聊天室功能包括传输聊天内容或者文件.相比于其它的聊天室,增加了传输文件的功能供参 ...

  9. 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java

    Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...

最新文章

  1. R语言nrow函数获取dataframe或者matrix行计数统计
  2. 美国防部用AI消除“战争迷雾”,机器人、无人机全上阵
  3. [JBoss] - 环境搭建
  4. mysql表的视图怎么建立_MySQL如何创建视图
  5. su的时候密码认证失败的解决方法
  6. 算法与数据结构(part5)--栈与队列
  7. ArcGIS实验教程——实验十:矢量数据投影变换
  8. TensorFlow MNIST 入门 代码
  9. 苹果回应被18岁学生起诉索赔10亿美元:零售店内未使用面部识别
  10. 《精解Windows8》——1.2 告别开始按钮进入“开始”屏幕时代
  11. 逆向某某单车-iOS客户端
  12. mysql实现自动更新时间戳
  13. AttributeError: 'numpy.int64' object has no attribute 'translate'
  14. EZX交叉编译配置、MPKG程序制作教程
  15. linux系统下安装搜狗输入法,搜狗拼音输入法 For Linux安装方法全程图解
  16. 笔记本打印时出现打印机出现异常配置问题_笔记本电脑连接共享打印机出现错误怎么办...
  17. HTML Entity 简介
  18. .jnlp 文件打开方式
  19. 有趣的HTML实例(七) 注册登录界面Ⅱ(css+js)
  20. tex常用函数 上下行对齐_tex常用函数 上下行对齐_【学术写作】如何优雅地(用TeX)写AI论文...

热门文章

  1. java实现关键词云_Java synchronized 关键词详细说明
  2. vuejs 和 element 搭建的一个后台管理界面【收藏】
  3. 【摄影测量原理】第四章:解析空中三角测量
  4. Python面向对象编程基础
  5. Android(kotlin)之对一组图片数据更新最后的修改时间进行分类显示
  6. Android之JNI ERROR (app bug): accessed stale global reference 0xb39533f2 (index 19708 in a table of s
  7. linux c之解决array subscript is not integer和AF_NET not undeclared
  8. Android之线程池
  9. 链表之判断一个链表是否为回文结构(一)
  10. 高速旋转中隐藏着许多鲜为人知的秘密,这些你都知道吗?