通信3总结——简单的XML格式

刚觉得,通信的传输内容很简单,就是由位(0、1二进制)组成的字节。但是,通过设计之后,产生了多种协议。

此次使用了XML 格式定义消息,如<msg>消息内容……</msg>,替代了前面无标志的消息,更具有灵活性。将此字符串转化为字节写入流里。
与字节流相比,XML 格式的消息清晰,明了易懂,但标签加大了消息的长度。

1.代码严谨性。
1.1考虑函数的输入和输出。
1.1.1检查传入的参数是否合格;
1.1.2当调用函数的时候,对不同返回值的处理。比如返回值null。
1.2输入框内是否允许输入为空(String=””)。字符串””和null的区别。
1.3 try{}中放入的语句,捕获到异常,{}内后面的语句就不执行了。
总之,考虑可能产生的多种情况,并做相应的处理。

2.函数的定义
函数的功能具有普遍性,则可调用的地方多。比如发消息的函数和只能发送特定消息的函数。
函数的功能增多时,这个函数调用的次数就少了。正如越简单的零件,处处需要它,使用率越高。

3易犯错误
由于写在不同的函数中,只需写一次的代码,写了多次。如Socket的关闭,由于随意调用,就使用了多次。先前已创建了对象,后面,又重新创建了这个对象。没理清思路。

4. 服务器和客户端都有Socket对象:
服务器:java.net.Socket so=server.accept();
客户端:so=new java.net.Socket(ip,port);
但同一个Socket得到的输入流不会读取自己的输出流传送的数据。

5.类与类之间的关系
类与类之间属性的传值:一种可以通过方法(set、get、构造函数)。另一种,通过对象直接调用类的非private属性。
易产生方法栈溢出的情况:
B的构造方法中,创建A;且A的构造方法中,创建B。则创建A(或B)的对象时,互相调用。
public class A {
public static void main(String[] args) {
A a=new A();
}

public A(){
B b=new B();
}
}
public class B {
public B(){
A a=new A();
}
}
而传值,对于基本类型,再拷贝一份;非基本类型,由于占的内存较大,所以只是传引用,不会造成互相调用的后果,最多,创建了多份不需要的引用。

6.在阻塞处捕获异常,处理断开连接的情况。
如6.1客户端,在接收服务器消息处阻塞。突然断线,客户端read处捕获异常,处理:关闭客户端,提示用户:已与服务器断开连接。

6.2服务器,在接收客户端消息处阻塞。突然断线,服务器readString()中read字节捕获异常,处理:关闭与此客户端的Socket连接对象,提示其他用户:此用户已下线。服务器断开,在服务器accept处,处理异常。

7.类的属性加注释,说明作用。否则如果属性很多,以后看就想不起属性的作用了。

8.在处理单独聊天,弹出单独聊天界面时,遇到一些问题:
8.1 发送方a请求前,对方b已经将两者的单聊界面打开。
8.2双方聊天中,突然一方a下线,对方b的单聊界面未关闭;等到a上线时,对方b的单聊界面可继续和a聊天。
8.3一方a打开了与b、c的多个单聊界面,此时,要管理多个a的单聊界面,并将b、c发送的消息添加到a对应的聊天界面。
一开始,有些混乱,但理清思路,考虑如何传值后,就有进展了。当一个类的对象很多时,就要进行管理。目前,只用了ArrayList和Map,如果存在一一对应的关系,就使用Map。使用Java中已有类的方法,与自己写相比较,能减少代码,看起来清晰。

9.XML格式的消息,由于是字符形式,传文件比较麻烦。
<msg>
<type>file</type>
<na>文件名</na>
<con>文件内容</con>
</msg>
1.先传前半段字符串<msg><type>file</type><na>文件名</na><con>
2.再直接传文件字节
3.再传后半段字符串</na><con>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值