Socket端到端的通信.docx
- 文档编号:16432549
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:13
- 大小:166.90KB
Socket端到端的通信.docx
《Socket端到端的通信.docx》由会员分享,可在线阅读,更多相关《Socket端到端的通信.docx(13页珍藏版)》请在冰点文库上搜索。
Socket端到端的通信
客户端与客户端之间的通信系统设计与实现
学号
姓名__
所在学院
学科、专业__
考试科目_
考试日期__
课程学时
考试形式___________
评语:
客户端与客户端之间的通信系统设计与实现
一.功能描述:
在客户端/服务器/客户端模式中,基于Socket通信要实现信息共享,即服务器可以向其他多个客户端发送广播消息,客户端通过服务器也可以向其他客户端彼此收发送消息。
类似于聊天室的那种功能,实现信息能在多个客户端之间共享。
客户端先与服务器建立连接,服务器接收客户端的消息,再转发给其他的客户端,转发之前客户端都必须先与服务器建立连接才可以,每个客户端之间通过服务器间接通信,从而实现客户端彼此间的通信。
二.设计思路:
客户端循环可以不停输入向服务器发送消息,并且启一个线程,专门用来监听服务器端发来的消息并打印输出。
服务器端启动时,启动一个监听何时需要向客户端发送消息的线程。
每次接受客户端连接请求,都启一个线程进行处理,并且将客户端信息存放到公共集合中。
当客户端发送消息时,服务器端将消息顺序存入队列中,当需要输出时,从队列中取出广播到各客户端处。
客户端输入showuser命令可以查看在线用户列表,查看到每个客户端名,输入bye向服务器端申请退出连接。
创建服务端Socket,创建向客户端发送消息线程,监听客户端请求并处理。
监听是否有输出消息请求线程类,向客户端发送消息。
将缓存在队列中的消息按顺序发送到各客户端,并从队列中清除。
创建客户端,与服务器连接,并输入发送消息,
用于监听服务器端向客户端发送消息线程。
网络程序是建立在TCP/IP协议的基础上,致力于应用层,传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传输细节,应用层的程序通过Socket来建立与远程主机的连接以及进行数据传输。
两个进程之间通信过程是从建立连接开始的,接着交换数据,到断开连接结束,套接字可看做是通信线路两端的收发器,进程通过套接字来收发数据。
套接字可以看做通信连接两端的收发器
三.代码行编辑,行注释:
服务器端:
//创建服务端
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;import.ServerSocket;
import.Socket;
importjava.util.ArrayList;
importjava.util.LinkedList;
importjava.util.List;
publicclassServerextendsServerSocket{
privatestaticfinalintSERVER_PORT=2014;//定义个端口号
privatestaticbooleanisPrint=false;//是否输出消息标志
privatestaticListuser_list=newArrayList();//登录用户集合
privatestaticList
privatestaticLinkedList
//创建服务端Socket,创建向客户端发送消息线程,监听客户端请求并处理
publicServer()throwsIOException{
super(SERVER_PORT);//创建ServerSocket
newPrintOutThread();//创建向客户端发送消息线程
try{
while(true){//监听客户端请求,启个线程处理
Socketsocket=accept();//等待客户链接
newServerThread(socket);//创建一个线程
}
}catch(Exceptione){
}finally{
close();
}
}
//监听是否有输出消息请求线程类,向客户端发送消息
classPrintOutThreadextendsThread{
publicPrintOutThread(){
start();
}
publicvoidrun(){
while(true){
if(isPrint){//将缓存在队列中的消息按顺序发送到各客户端,并从队列中清除。
Stringmessage=message_list.getFirst();
for(ServerThreadthread:
thread_list){
thread.sendMessage(message);
}
message_list.removeFirst();
isPrint=message_list.size()>0?
true:
false;//判断缓存在队列中的消息是否发完
}
}
}
}
//服务器线程类
classServerThreadextendsThread{
privateSocketclient;
privatePrintWriterout;
privateBufferedReaderin;
privateStringname;
publicServerThread(Sockets)throwsIOException{
client=s;
out=newPrintWriter(client.getOutputStream(),true);/*this.getOutputStream()就是返回一个服务器与客户端的输出流,
true是对PrintWriterout而言,就是强行把缓冲区的数据输出*/
in=newBufferedReader(newInputStreamReader(client.getInputStream()));//得到从控制台输入流的字节转换后的字符
in.readLine();
out.println("成功连上聊天室,请输入你的名字:
");
start();
}
publicvoidrun(){
try{
intflag=0;
Stringline=in.readLine();
while(!
"bye".equals(line)){
//查看在线用户列表,显示每个客户端名
if("showuser".equals(line)){
out.println(this.listOnlineUsers());
line=in.readLine();
}
//第一次进入,保存名字
if(flag++==0){
name=line;
user_list.add(name);//添加名字
thread_list.add(this);
out.println(name+"你好,可以开始聊天了...");
this.pushMessage("Client<"+name+">进入聊天室...");
}else{
this.pushMessage("Client<"+name+">say:
"+line);}
line=in.readLine();
}
out.println("byeClient");
}catch(Exceptione){
e.printStackTrace();
}finally{//用户退出聊天室
try{
client.close();
}catch(IOExceptione){
e.printStackTrace();
}
thread_list.remove(this);
user_list.remove(name);
pushMessage("Client<"+name+">退出了聊天室");
}
}
//放入消息队列末尾,准备发送给客户端
privatevoidpushMessage(Stringmsg){
message_list.addLast(msg);
isPrint=true;
}
//向客户端发送一条消息
privatevoidsendMessage(Stringmsg){
out.println(msg);
}
//统计在线用户列表
privateStringlistOnlineUsers(){
Strings="---在线用户列表---\015\012";
for(inti=0;i s+="["+user_list.get(i)+"]\015\012"; } s+="--------------------"; returns; } } publicstaticvoidmain(String[]args)throwsIOException{ newServer();//启动服务端 } } 客户端: //客户端 importjava.io.BufferedReader; importjava.io.InputStreamReader; importjava.io.PrintWriter; import.Socket; //创建客户端 publicclassSocketClientextendsSocket{ privatestaticfinalStringSERVER_IP="127.0.0.1";//定义个IP地址 privatestaticfinalintSERVER_PORT=2014;//定义个端口号 privateSocketclient; privatePrintWriterout;//定义个PrintWriter对象out privateBufferedReaderin;//定义个BufferedReader对象in,可以将字符流转换为字符串流 //与服务器连接,并输入发送消息 publicSocketClient()throwsException{ super(SERVER_IP,SERVER_PORT); client=this; out=newPrintWriter(this.getOutputStream(),true);/*this.getOutputStream()就是返回一个服务器与客户端的输出流, true是对PrintWriterout而言,就是强行把缓冲区的数据输出。 */ in=newBufferedReader(newInputStreamReader(this.getInputStream()));//得到从控制台输入流的字节转换后的字符 newreadLineThread();//创建读入数据 while(true){ in=newBufferedReader(newInputStreamReader(System.in));//构造一个字符流的缓存,里面存放在控制台输入的字节转换后成的字符 Stringinput=in.readLine();//从控制台读取输入行,赋给input out.println(input); } } //用于监听服务器端向客户端发送消息线程类 classreadLineThreadextendsThread{ privateBufferedReaderbuff; publicreadLineThread(){ try{ buff=newBufferedReader(newInputStreamReader(client.getInputStream())); start(); }catch(Exceptione){ } } publicvoidrun(){ try{ while(true){ Stringresult=buff.readLine(); if("byeClient".equals(result)){//客户端申请退出,服务端返回确认退出 break; }else{//输出服务端发送消息 System.out.println(result); } } in.close();//关闭读缓存区对象 out.close();//关闭PrintWriter对象out client.close();//关闭客户端socket对象 }catch(Exceptione){ } } } publicstaticvoidmain(String[]args){ try{ newSocketClient();//启动客户端 }catch(Exceptione){ }} } 四.运行结果截图: 1.编译执行(*执行后先Enter下,再操作) 2.从Client<鸣人>发送消息给Client<雏田>和Client<六道仙人>, 同时可以收到Client<鸣人>和Client<六道仙人>,发的消息 3.Client<雏田>加入聊天,收发Client<鸣人>和Client<雏田>的消息 4.Client<六道仙人>加入聊天,可以收发Client<鸣人>和Client<雏田>的消息
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Socket 端到端 通信
![提示](https://static.bingdoc.com/images/bang_tan.gif)