【Java线程】线程协作实现多对多聊天
有关线程协作的具体问题,请查看本人其他博客,链接如下:
http://blog.csdn.net/lmb55/article/details/46274165
一对多聊天(一台服务器对多台客户机):
原理图:
多对多聊天:(相当于群聊,客户端对客户端)
实现一(服务器端):
原理:
服务器端有多个socket,各socket对间不是独立的,从一个socket接受的信息,需要转发到其他的socket上去。将构建的所有的socket放到一个数组中,当需要将一个客户机发送的消息显示给其它的客户机时就遍历该数组,创建输出流,将消息发送出去。
原理图如下:
实现二(服务器端)【改进】:
原理:
服务器端有多个socket,各socket对间也不是独立的,每个socket中都有一个服务器接收线程和一个服务器发送线程,作用如下:
服务器接收线程:接收客户端发送线程发来的请求,并将其发送过来的消息写入到公共区域;唤醒服务器端发送线程;
服务器发送线程:当服务器端发送线程被唤醒之后,将需要写入公共区域的内容发送给客户端接收线程;
原理图如下:
具体实现:
服务器端代码如下:
MyChatServer.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;//发送线程
class MySend extends Thread{private Socket skt;public MySend(Socket skt){this.skt=skt;}public void run(){try {PrintWriter pw=new PrintWriter(skt.getOutputStream());for (;;) {synchronized ("a") {"a".wait();//当没接收到接收线程的唤醒时一直处于阻塞状态pw.println(MyChatServer.g_buf);//被唤醒之后,将需要写入公共区域的内容发送给接收线程pw.flush();}}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}}
} //接收线程
class MyRecv extends Thread{private Socket skt;public MyRecv(Socket skt){this.skt=skt;}public void run(){try {BufferedReader br=new BufferedReader(new InputStreamReader(skt.getInputStream()));//接收发送线程发来的消息PrintWriter pw=new PrintWriter(skt.getOutputStream());for (;;) {String s=br.readLine();if (s==null) break;synchronized ("a") {MyChatServer.g_buf=s;//将从发送线程中接收的需要写入公共数据区的内容写入到公共数据区"a".notifyAll();//唤醒所有的发送线程}}} catch (Exception e) {e.printStackTrace();}}
} public class MyChatServer {//全局公共缓冲区public static String g_buf;public static void main(String[] args) throws Exception{System.out.println("ChatServer v1.0");ServerSocket sskt=new ServerSocket(9999);for (;;) {Socket skt=sskt.accept();new MySend(skt).start();//开启发送线程new MyRecv(skt).start();//开启接收线程}}}
可使用本人之前实现的一对一聊天中的客户端来与本例中的服务器端进行通话,链接如下:
http://blog.csdn.net/lmb55/article/details/46240305
【Java线程】线程协作实现多对多聊天相关推荐
- Java多线程之线程间协作 notify与wait的使用
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 Java多线程操作运用很广,特别是在android程序方面.线程异步协作是多线程操作的难点也是关键,也 ...
- 19、Java并发编程:线程间协作的两种方式:wait、notify、notifyAll和Condition
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- Java并发编程—线程间协作方式wait()、notify()、notifyAll()和Condition
原文作者:Matrix海 子 原文地址:Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 目录 一.wait().notify()和notifyA ...
- JAVA线程间协作:wait.notify.notifyAll
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- java Thread学习(线程间协作)
线程件协作 线程之间除了使用锁同步两个任务的行为外,还需要进行协作,例如任务A必须在B完成后才能执行. wait()和notify()/notifyAll() wait()会去等待外部信号,并且在等待 ...
- java基础----线程
一.进程与线程 进程(process)是一个可并发执行的具有独立功能的程序(program)关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位. 线程(thread)是操作系统进 ...
- java面试线程必备知识点,怼死面试官,从我做起
转载自 java面试线程必备知识点,怼死面试官,从我做起 |--多线程一定好么? cpu密集不好 io密集好 |--如何减少上下文切换: 无锁并发(数据id根据Hash分段).CAS.最少线程 |-- ...
- 线程间协作的两种方式:wait、notify、notifyAll和Condition
转载自 线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当 ...
- JAVA:线程总结及多线程实现的两种方法
JAVA:线程总结 目录 目录 JAVA:线程总结 JAVA:线程总结 01_多线程(多线程的引入)(了解) 02_多线程(多线程并行和并发的区别)(了解) 03_多线程(Java程序运行原理和JVM ...
最新文章
- c#资源管理器【转】
- 联想android手机驱动,驱动天空 - 手机驱动 - 联想手机 lenovo
- SQL Server如何查看存储过程的执行计划
- springboot @PropertySource+@Value注入properties配置文件属性值
- define,require的基本用法
- Java精选笔记_JDBC
- 常见形式 Web API 的简单分类总结
- c++ set 遍历_47. Set 是如何工作的(3) 遍历顺序是如何确定的?
- fastcopy比正常复制快多少_高中三年,每个阶段考多少分才正常?快对比一下
- 《明日方舟》Python版公开招募工具
- 《Java特种兵》1.8 老A是在逆境中迎难而上者
- 红米手机 android 版本,#MIUI#关于红米手机4高配版 Android版本适配的说明【miui9吧】_百度贴吧...
- 我写了一个“文本转手写”神器来搞定作业!
- DHTML Scriptlets 容器对象参考手册
- 调用iphone客户端进行授权发微博的方法--使用友盟组件
- 190727每日一句
- 进程与线程的区别与联系(经典面试题)
- plsql使用存储过程添加数据
- 飞鸽传书2014绿色版
- Shell脚本调用阿里云API实现DDNS动态域名解析