/* 21.5 客户机相互通讯
* 本例的重点是如何实现消息的广播,
* 广播类是 bManager类,它继承自Vector类
*/
package allClass;
import java.net.*;
import java.io.*;
import java.util.*;
public class Server5{
private ServerSocket server;
private BManager bMan = new BManager(); // 消息广播者
public Server5(){}
void startServer(){
try{
server=new ServerSocket(7777);
System.out.println("服务器套接字创建完毕");
while(true){
Socket socket=server.accept();
// 创建并运行与客户机通讯的线程
new Chat_Thread(socket).start();
// 向消息广播者列表添加Socket
bMan.add(socket);
// 消息广播者向所有客户机传播当前在线认识
bMan.sendClientInfo();
}
}catch(Exception e){
System.out.println(e);
}
}
public static void main(String[] args){
Server5 server=new Server5();
server.startServer();
}
// 与客户机通讯的线程类
class Chat_Thread extends Thread{
Socket socket;
private BufferedReader reader;
private PrintWriter writer;
Chat_Thread(Socket socket){
this.socket = socket;
}
public void run(){
try{
reader=new BufferedReader(
new InputStreamReader(
socket.getInputStream()
));
writer = new PrintWriter(socket.getOutputStream(), true);
String msg;
// 从输入流获取消息
while((msg=reader.readLine())!=null){
System.out.println(msg);
bMan.sendToAll(msg); // 向所有客户机传送消息
}
}catch(Exception e){
}finally{
try{
// 从消息广播列表删除Socket
bMan.remove(socket);
if(reader!=null) reader.close();
if(writer!=null) writer.close();
if(socket!=null) socket.close();
reader=null;
writer=null;
socket=null;
System.out.println("客户机离开");
// 向所有客户机传送当前连接认识
bMan.sendClientInfo();
}catch(Exception e){}
}
}
}
// 消息广播者类,
class BManager extends Vector{
BManager(){}
void add(Socket sock){ // 添加套接字
super.add(sock);
}
void remove(Socket sock){ // 删除套接字
super.remove(sock);
}
// 向所有客户机传送 msg 。同步化方法
synchronized void sendToAll(String msg){
PrintWriter writer=null; // 输出流
Socket sock; // 套接字
// 遍历
for(int i=0; i<size(); i++){
sock = (Socket)elementAt(i); // 获取第i 个套接字输出流
try{
writer=new PrintWriter(sock.getOutputStream(), true);
}catch(IOException ie){}
// 使用第 i 个套接字输出流,输出 msg
if(writer!=null)
writer.println(msg);
}
}
// 向所有客户机发送当前聊天室人数
synchronized void sendClientInfo(){
String info="当前聊天室人数: "+ size();
System.out.println(info);
sendToAll(info);
}
}
}
java聊天室程序(含源码)
3星 · 超过75%的资源 需积分: 10 201 浏览量
2008-12-10
10:41:31
上传
评论
收藏 9KB RAR 举报
ildandan123
- 粉丝: 0
- 资源: 1
最新资源
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
- 林周瑜-论文.docx
- 基于MIC+NE555光敏电阻的声光控电路Multisim仿真原理图
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论2