java实现点对点通信文档格式.docx
《java实现点对点通信文档格式.docx》由会员分享,可在线阅读,更多相关《java实现点对点通信文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![java实现点对点通信文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/26/ed1b2e83-373e-4a66-99ec-1c16585bd0d5/ed1b2e83-373e-4a66-99ec-1c16585bd0d51.gif)
2.能够允许注册过的用户登陆聊天界面并可以聊天。
3.能够接受私聊信息并发送给特定的用户。
4.服务器运行在自定义的端口上#8000。
5.服务器监控用户列表和用户聊天信息。
三设计思想
3.1总的设计思想是利用java里的套接字Socket和ServerSocket(客户/服务器)来建立进程之间的通信,
其中服务器端:
1.处理用户注册2.处理用户登录3.处理用户发送信息及文件的传输4.处理用户得到信息5.处理用户退出
客户端:
1.用户注册界面2.用户登录界面及结果3.用户发送信息界面及结果4.用户得到信息界面及结果5.用户退出界面及结果
3.2客户端主要结构
LandingFrame.java为客户端程序登录界面,负责用户帐号信息的验证与反馈。
RegisterFrame.java为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。
ChatFrame.java为客户端程序聊天室主界面,负责接收、发送聊天内容,文件的传输。
与服务器端的亲密合作。
Message.java为封装的消息类实现对象序列化接口,主要包括发送者名称,接受者名称,信息的内容。
附加功能:
可以改变消息字体的样式,字体,颜色
3.3系统实现原理
当用户聊天时,将当前用户名、聊天对象名、聊天内容、聊天语气进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端
当用户发送聊天信息时,服务端将会收到客户端用Socket传输过来的聊天信息对象,并将本次用户的聊天信息对象添加到聊天对象集Message中,以供所有聊天用户访问。
接收用户的聊天信息是由多线程技术实现的,因为客户端必须时时关注更新服务器上是否有最新消息,在本程序中设定的固定一小段时间刷新服务器一次,如果间隔时间太短将会增加客户端与服务器端的通信负担,而间隔时间长就会让人感觉没有时效性,所以经过权衡后认为1秒最佳。
当每次用户接收到聊天信息,会找到其中属于自己的那一个信息对象(通过Message类中的两个String变量frname和toname判断),然后将会开始分析聊天信将适合自己的信息人性化地显示在聊天信息界面
四程序的实现
4.1服务器
由于总的聊天系统中消息的传递是采用socket套接字的客户/服务器模型。
所以我首先创建了类Serve1(启动监听端口8000,主要负责登录,注册以及消息的接受)和Serve2类(启动监听端口9000,主要负责文件传)来创建服务器。
在Serve1和Serve2中通过Thread类使用线程实现多个客服端的同时监听和通过一个while(true)循环一直监听新的客服端连接。
在Server1中我通过从接受到的输入流中读出流中对象的名称不同,来进行不同的服务处理。
其中:
publicstaticLinkedList<
Users>
user=newLinkedList<
();
//用户集
publicstaticArrayList<
alluser=newArrayList<
Message>
lme=newLinkedList<
//消息集
obin=newObjectInputStream(soc.getInputStream());
//得到输入流
toc=newPrintStream(soc.getOutputStream());
on=(Object)obin.readObject()//读出对象
if(on.getClass().getName().equals("
java.util.ArrayList"
)){
alluser=(ArrayList<
)on;
}
JavaChat.Mess"
)){
Messme=(Mess)on;
if(me.setuser){
user=me.us;
if(me.state1){
lme=me.me;
if(me.state2){
Messmee=newMess();
mee.me=lme;
mee.us=user;
obout=newObjectOutputStream(soc.getOutputStream());
obout.writeObject(mee);
}//给客户端发送消息和用户集
}
if(on.getClass().getName().equals("
JavaChat.Users"
Usersu=(Users)on;
if(u.ru){//表示有新的用户注册
user.add(u);
Filefile=newFile("
User.txt"
);
try{
ObjectOutputStreamobout=newObjectOutputStream(newFileOutputStream(file));
obout.writeObject(user)
obout.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
if(!
u.ru){
ServeLog(soc);
}//处理登录
JavaChat.Message"
)){
reciveMessage();
}//对接受到的消息进行处理。
if(on.getClass().getName().equals("
java.util.LinkedList"
sendMessage(soc);
}//给客户端发送信息集
4.2客户端登录和注册
4.2.1登录
启动服务器监听后,就可以创建客服端了,在客户端中主要有如下:
ChatFrame.java为客户端程序聊天室主界面,负责接收、发送聊天内容,文件的传输。
与服务器端亲密合作。
在这之外还有三个对象类用来表示用户信息用于注册用户的Register_Customer,用于登录用户类Customer,客户端类Chat。
4.2.1.1
在登录界面类Login中,有三个监听按钮buttonjenter,jcancel,jregister,分别用于表示用户是选择登录,退出还是注册
这中间重点是注册和登录事件的响应
4.2.1.2登录事件的响应
通过方法checkUsers()来实现
privatevoidcheckUsers(){
Usersuser=newUsers();
user.account=accber1.getText().trim();
user.passWord=passWord.getText().trim();
acc=accber1.getText().trim();
try{
Socketsoc=newSocket(IP,8000);
ObjectOutputStreamobout=newObjectOutputStream(soc.getOutputStream());
obout.writeObject(user);
//这里服务器通过接受的对象将启动Server1中的ServeLog(Socketsoc);
方法来判断登录是否能成功
BufferedReaderre=newBufferedReader(newInputStreamReader(soc.getInputStream()));
Stringstae=re.readLine();
if(stae.equals("
此账号已经登录,请重新输入"
JOptionPane.showMessageDialog(null,"
accber1.setText("
"
passWord.setText("
登录成功"
accber1.setText("
passWord.setText("
newUserFrame(acc);
密码输入错误,请重新输入"
此账号不存在,请重新输入"
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
JOptionPane.showMessageDialog(null,"
与服务器断开"
return;
4.2.2注册
然后就是注册时间的响应
当你点击登录窗口的注册按钮后就会进入注册画面
该界面是通过RegisterFrame类来实现的
注册成功后就可以进行聊天
4.3.3聊天
在聊天中主要是通过三个类UserFrame,ChatFrame,来分别实现好友列表,私聊
在登录成功后会启动newUserFrame(StringUsername);
1在newUserFrame中会向服务器发送信息获取当前的在线以及没在线的好友列表,(背景为红色表示在线,黑色的表示把该用户设置成了黑名单,有图片闪动说明有消息需要查看)
//super.setTitle);
Messme=newMess();
me.state2=true;
Socketsoc=newSocket(IP,8000);
ObjectOutputStreamobout=newObjectOutputStream