java通讯课程_Java团队课程设计-socket聊天室(Day3)

Java团队课程设计-socket聊天室(Day3)

写了两天的项目,越写到后面越觉得这个结构太烂了,所以迫不得已只能重新搭建框架

此前代码的冗余度太高,复用率低,于是今天重构项目

重构后:

aa7ce18c656470f0c5b15e7d2840a446.png

对Message类进行整理,分出HistoryMessage(历史消息),OfflineMessage(离线消息),OnlineMessage(在线消息)三个消息子类:

23230a4664232413154bf1a796bcf722.png

d4913c109d3c3bac270e9affae450473.png

f1271dca146e20ba5183be39e71f6b20.png

解决传输问题

问题1:

原来在ServiceController中将objectInputStream和objectOutputStream设置为static静态变量,这样做会导致多个线程连接服务器时,后一个线程的objectInputStream和objectOutputStream覆盖前一个线程,导致传输出错

解决:

创建每一个连接线程构造函数中传入各个用户对应的输入输出流

758fb971ec7879368d8deca3c3ee58fa.png

问题2:

原来的UserController(客户端)在与服务端交互时使用了多种对象流,导致接受端的判断变得困难且不利于数据的读取

解决:

统一使用ObjectInputStream对象流,在传输过程中,客户端先发送一个对象给服务端(用于判断发送的对象是什么),再发送需要传输的Object。同时,接收方也需要进行两次相应读取操作

下面仅展示服务端的转发和客户端的接收代码:

public void run() {

while (true) {

try {

Object o = ois.readObject();

if (o.getClass().toString().equals("class message.OnlineMessage")) {

OnlineMessage onlineMessage = (OnlineMessage) o;

if (sendMessage(onlineMessage)) {

//正确发送,Type为2,数据库我自己的表Flag为2,别人的表Flag为1

InsertIntoMysql(onlineMessage, 1);

} else {

//存入数据库,自己的表Type为2,对方的表Type为1,数据库我自己的表Flag为2,别人的表Flag为1

InsertIntoMysql(onlineMessage, 2);

}

} else if (o.getClass().toString().equals("class message.HistoryMessage")) {

getHistoryMessage();//发送历史消息

}

else if(o.getClass().toString().equals("class user.normal.impl.UserDocument"))

{

UserDocument userDocument=(UserDocument) ois.readObject();

sendDocument(userDocument);

}

} catch (IOException |ClassNotFoundException e) {

System.out.println(user.getUserName()+"线程意外退出!");

return;

} catch (SQLException e){

System.out.println(user.getUserName()+"此线程数据库异常!");

return;

}

}

}

public void run() {

while(true){

try {

Object object = objectInputStream.readObject();

if(object.equals("Find error in user regist!")){

//注册失败

RegisteJFrame.registrationReturnInformation("Find error in user regist!");

}else if(object.equals("user created successfully!")){

//注册成功

RegisteJFrame.registrationReturnInformation("user created successfully!");

}else if(object.equals("Login successful!")){

Login.changePermission(2);

//登陆成功

}else if(object.equals("Login error!")){

Login.changePermission(1);

}else if(object.getClass().toString().equals("class user.normal.impl.User")){

//返回数据库中列表信息cxxx

User tempUser;

ArrayList personList = new ArrayList<>();

while(true){

tempUser = (User) objectInputStream.readObject();

if(tempUser.getUserName()==null) break;

personList.add(tempUser);

}

ContactJFrame.returnListInformation(personList);

ContactJFrame.setButton();

}else if(object.getClass().toString().equals("class message.OfflineMessage")){

Message tempMessage;

ArrayList offlineMessageArrayList = new ArrayList<>();

while(true){

tempMessage = (Message)objectInputStream.readObject();

if(tempMessage.getSender()==null) break;

OfflineMessage tempOfflineMessage = (OfflineMessage)tempMessage;

offlineMessageArrayList.add(tempOfflineMessage);

ContactJFrame.changeButton(tempMessage);

}

ContactJFrame.returnOfflineMessage(offlineMessageArrayList);

}else if(object.getClass().toString().equals("class message.OnlineMessage")){

OnlineMessage onlineMessage = (OnlineMessage)objectInputStream.readObject();

ContactJFrame.returnOnlineMessage(onlineMessage);

}else if(object.getClass().toString().equals("class message.HistoryMessage")){

Object o;

ArrayList historyMessageArrayList = new ArrayList<>();

while(true){

o = objectInputStream.readObject();

HistoryMessage t = (HistoryMessage)o;

if(t.getSender()==null) break;

historyMessageArrayList.add(t);

}

ContactJFrame.returnHistoryList(historyMessageArrayList);

}

else if(object.getClass().toString().equals("class user.normal.impl.UserDocument"))

{

Object o=objectInputStream.readObject();

UserDocument userDocument=(UserDocument) o;

System.out.println(userDocument.toString());

ContactJFrame.receiveUserDocument(userDocument);

}

} catch (IOException | ClassNotFoundException e) {

e.printStackTrace();

return;

}

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值