一:引言

想要私聊必须有规定的格式:@名字:要说的话

二:上码

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 Demo5_服务端私聊版 {//在遍历一个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();}}//群聊:获取自己的消息 发送信息给其他人//私聊:约定数据格式:@xxx:msg;private void sendothers(String msg,boolean isSys) {boolean isPrivate = msg.startsWith("@");if(isPrivate) {int idx = msg.indexOf(":");String tagetName = msg.substring(1,idx);msg = msg.substring(idx+1);for( pipe others :all) {if( others.name.equals(tagetName)) {others.send(this.name+"悄悄对你说:"+msg);}}}else {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 Demo5_客户端私聊版 {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手写聊天室 可以 私聊版加群聊版相关推荐

  1. 基于TCP的网络聊天室实现(C语言)

    基于TCP的网络聊天室实现(C语言) 一.网络聊天室的功能 二.网络聊天室的结果展示 三.实现思路及流程 四.代码及说明 1.LinkList.h 2.LinkList.c 3.client.c 4. ...

  2. 【java毕业设计】基于java+原生Sevlet+socket的聊天室系统设计与实现(毕业论文+程序源码)——聊天室系统

    基于java+原生Sevlet+socket的聊天室系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+原生Sevlet+socket的聊天室系统设计与实现,文章末尾附有本毕业设 ...

  3. TCP多人聊天室实现 JSON文件解析

    TCP多人聊天室实现 JSON文件解析 1. TCP多人聊天室实现 1.1 分析 客户端功能:1. 数据发送2. 数据接收技术:1. socket2. 输入流和输出流3. 多线程,客户端功能模块有两个 ...

  4. java socket多人聊天室_如何运用Java socket实现多人聊天室功能

    如何运用Java socket实现多人聊天室功能 导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构 ...

  5. java用UDP作简易聊天室

    -------------------------------------------------java用UDP作简易聊天室------------------------------------- ...

  6. java socket多人聊天_如何运用Java socket实现多人聊天室功能

    导语:如何运用Java socket实现多人聊天室功能呢?下面是小编给大家提供的代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网. 目录结构: ChatClient: package com ...

  7. Java网络编程——多人聊天室

    多用户即时通信系统 需求分析: 1.用户登录 2.拉取在线用户列表 3.无异常退出 4.私聊 5.群聊 6.发送文件 7.服务器推送新闻 多用户登录 老韩的课程讲的真的很清楚: 关于Java多线程的文 ...

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

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

  9. 完成聊天室的私聊功能

    1 完成聊天室的私聊功能 完成聊天室私聊功能.私聊功能是指,客户端之间可以实现一对一的聊天. 服务器端程序启动后,将等待客户端连接,界面效果如图-1所示: 图-1 客户端程序运行时,需要用户先输入昵称 ...

最新文章

  1. 重大疫情给企业管理带来的挑战,企业的管理应如何应对?
  2. 新型冠状病毒心理防护手册(大众版)
  3. 转:SAP 零售业POS心得分享
  4. python 作业4
  5. 工具用的好下班走的早
  6. 那些年,程序员读错的英语
  7. C# 8中的Async Streams
  8. Matlab归一化函数(mapminmax)
  9. 开源社区_建立一个开源社区
  10. android os自动联网,联网设置指南
  11. uniaccess安全助手卸载_“安装一分钟,卸载半小时”,盘点高速下载通道中的流氓操作...
  12. 图解设计模式-State模式
  13. 装备制造业包括哪些行业(装备制造业行业分类目录)
  14. 2020年日历电子版(打印版)_2020年日历全年表黄历-2020年日历打印版下载 A4横版带农历--pc6下载站...
  15. Swift实战之2048小游戏
  16. 2021年东方市铁路中学高考成绩查询,东方2021多少分可以上高中 分数线预测
  17. 7位专家– 7条意见:Java 13的亮点是什么?
  18. 百度秋招补录前端一面面试
  19. 计算材料学中的四巨头之间的关系
  20. ubuntu16.04配置虚拟主机

热门文章

  1. 3分钟看完 Day2 Keynote
  2. PHP开发自己的框架必备知识点
  3. 【MapBox】5种地图(底图)样式自由切换附源码
  4. ArcGIS10.6中,在3D分析工具中创建视线之后,怎么将其删除?
  5. ArcGIS实验教程——实验二十一:DEM分析
  6. Android之category
  7. Android之滑动事件冲突解决 Touch事件处理机制总结
  8. Android之事件总线EventBus详解
  9. 【iVX 初级工程师培训教程 10篇文拿证】09 聊天室制作
  10. xhr get获取文件流下载文件_python爬虫实战——豆瓣电影get初体验