java实现点对点通信
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用java实现的点对点通信程序的设计
通信0803班、0909081701、迪力夏提;指导老师:王国才,杨政
一设计目标:
1. 与聊天室成员一起聊天。
2. 可以与聊天室成员私聊。
3. 可以改变聊天内容风格。
4. 用户注册(含头像)、登录。
5. 实现消息的加密传递。
6. 实现文件的实时传输。
7. 实现来消息时的及时提醒
二问题陈述
1.接受用户注册信息并保存在一个基于文件的对象型数据库。
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中我通过从接受到的输入流中读出流中对象的名称不同,来进行不同的服务处理。其中:
public static LinkedList
public static ArrayList
public static LinkedList
obin=new ObjectInputStream(soc.getInputStream());//得到输入流
toc=new PrintStream(soc.getOutputStream());
on=(Object)obin.readObject()//读出对象
if(on.getClass().getName().equals("java.util.ArrayList")) {
alluser=(ArrayList
}
if(on.getClass().getName().equals("JavaChat.Mess")){
Mess me=(Mess)on;
if(me.setuser){
user=;
}
if(me.state1){
lme=me.me;
}
if(me.state2){
Mess mee=new Mess();
mee.me=lme;
=user;
obout=new
ObjectOutputStream(soc.getOutputStream());
obout.writeObject(mee);
}//给客户端发送消息和用户集
}
if(on.getClass().getName().equals("ers")){
Users u=(Users)on;
if(u.ru){//表示有新的用户注册
user.add(u);
File file=new File("User.txt");
try {
ObjectOutputStream obout=new ObjectOutputStream( new FileOutputStream(file)); obout.writeObject(user)
obout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(!u.ru){
ServeLog(soc);
} //处理登录
if(on.getClass().getName().equals("JavaChat.Message")) {
reciveMessage();}//对接受到的消息进行处理。