网络通信中常犯错误与解决办法
1、 IP、Port错误,或者Port被占用
服务端与客户端的IP或Port不向对应,或服务端所使用的Port已经被占用。
2、 等待连接时,不同循环方式可能导致内存溢出
(1)原因: 对于阻塞等待客户端并交给线程处理时的流程没有弄清楚。
(2)代码示例:
//创建服务器对象
java.net.ServerSocket ser=new java.net.ServerSocket(port);
//等待客户机进入
java.net.Socket sc=ssc.accept();
while(true){
//启动一个线程去处理连接
ProcessThread pt=new ProcessThread(sc);
pt.start();
如上代码如果进入多个用户,就会造成内存溢出异常:OutOfMemoryError
(3)解决办法:
java.net.ServerSocket ser=new java.net.ServerSocket(port);
while(true){
//等待客户机进入
java.net.Socket sc=ssc.accept();
//启动一个线程去处理连接
ProcessThread pt=new ProcessThread(sc);
pt.start();
3、 双方协议没有达成一致
网络通信中,服务器与客户端双方能否正常传输信息,得达成一定的协议,才能进行。
这是通信的基础与保障。虽然我们知道一定要保持双方的协议一致。但是实际操作中还
是难免出现我们意想不到由协议不一致而造成的问题。解决此类问题要:1.细心,熟悉通信中
每一个流程。2.对于底层的数据传输要有一定的了解。
4、 read([])和readFully([])的区别
(1) DataInputStream.read([])方法:从包含的输入流中读取一定数量的字节,并将
它们存储到缓冲区数组 b 中。以整数形式返回实际读取的字节数。将读取的第一个字节存储
到元素 b[0] 中,将下一个字节存储到 b[1] 中,依此类推。读取的字节数至多等于 b 的长
度。
read(b) 方法与以下方法的效果相同:
read(b, 0, b.length) :其意思是:从包含的输入流中将最多 len 个字节读入一个 byte 数
组中。尽量读取 len 个字节,但读取的字节数可能少于 len 个,也可能为零。
(2) 而DataInputStream.readFully([])方法:从输入流中读取一些字节,并将它们存
储在缓冲区数组 b 中。读取的字节数等于 b 的长度。
(3)简而言之:在不发生异常的情况下,read([])方法不一定能全部读取数组中的元素
,而readFully([])方法能读取全部的数组元素。
5、 内存溢出
对于通信过程中常常会有读取字节时、创建对象时对于其中的流程不清晰造成可能的内
存溢出。
6、 EOFException:end of file exception,
就是流中只有一定量的字节,而输入流却规定了读取更多的字节,造成最后到达流中字
节结尾而没有字节供输入流来读取的现象。这可能是双方协议没有达成一致,而导致的要求读
取过多字节的异常。或者是流中的字节因为某些原因丢失,而造成读取时没有足够多的字节读
取。
7、 断开(正常的异常)
因某些因素某一方突然断开连接,终止通信的异常。
8、 try-catch与throws的用法。
还未有深入的理解
9、 性能问题
如:(1)某些信息,只需要写入byte类型的值就可以完全地传达出信息,而写入了int类
型等,造成输入输出以及传送时占用更多的内存,以致降低程序反应速度。
(2) 本来只需要创建一个对象而可以重复赋值,却在循环中重复创建对象,重复赋
值,造成占用了更多的内存。
10、自己的问题
未完待续。。。。。
总结:1.有经历就会有错误,所以我觉得目前要尽快地“经历更多”。
2.祸乱常积于忽微!我们很多犯错的地方是我们以为没有错的而地方。故不可小视细节!
因还未完善 难登大雅之堂,故只能先放到这里了
1、 IP、Port错误,或者Port被占用
服务端与客户端的IP或Port不向对应,或服务端所使用的Port已经被占用。
2、 等待连接时,不同循环方式可能导致内存溢出
(1)原因: 对于阻塞等待客户端并交给线程处理时的流程没有弄清楚。
(2)代码示例:
//创建服务器对象
java.net.ServerSocket ser=new java.net.ServerSocket(port);
//等待客户机进入
java.net.Socket sc=ssc.accept();
while(true){
//启动一个线程去处理连接
ProcessThread pt=new ProcessThread(sc);
pt.start();
如上代码如果进入多个用户,就会造成内存溢出异常:OutOfMemoryError
(3)解决办法:
java.net.ServerSocket ser=new java.net.ServerSocket(port);
while(true){
//等待客户机进入
java.net.Socket sc=ssc.accept();
//启动一个线程去处理连接
ProcessThread pt=new ProcessThread(sc);
pt.start();
3、 双方协议没有达成一致
网络通信中,服务器与客户端双方能否正常传输信息,得达成一定的协议,才能进行。
这是通信的基础与保障。虽然我们知道一定要保持双方的协议一致。但是实际操作中还
是难免出现我们意想不到由协议不一致而造成的问题。解决此类问题要:1.细心,熟悉通信中
每一个流程。2.对于底层的数据传输要有一定的了解。
4、 read([])和readFully([])的区别
(1) DataInputStream.read([])方法:从包含的输入流中读取一定数量的字节,并将
它们存储到缓冲区数组 b 中。以整数形式返回实际读取的字节数。将读取的第一个字节存储
到元素 b[0] 中,将下一个字节存储到 b[1] 中,依此类推。读取的字节数至多等于 b 的长
度。
read(b) 方法与以下方法的效果相同:
read(b, 0, b.length) :其意思是:从包含的输入流中将最多 len 个字节读入一个 byte 数
组中。尽量读取 len 个字节,但读取的字节数可能少于 len 个,也可能为零。
(2) 而DataInputStream.readFully([])方法:从输入流中读取一些字节,并将它们存
储在缓冲区数组 b 中。读取的字节数等于 b 的长度。
(3)简而言之:在不发生异常的情况下,read([])方法不一定能全部读取数组中的元素
,而readFully([])方法能读取全部的数组元素。
5、 内存溢出
对于通信过程中常常会有读取字节时、创建对象时对于其中的流程不清晰造成可能的内
存溢出。
6、 EOFException:end of file exception,
就是流中只有一定量的字节,而输入流却规定了读取更多的字节,造成最后到达流中字
节结尾而没有字节供输入流来读取的现象。这可能是双方协议没有达成一致,而导致的要求读
取过多字节的异常。或者是流中的字节因为某些原因丢失,而造成读取时没有足够多的字节读
取。
7、 断开(正常的异常)
因某些因素某一方突然断开连接,终止通信的异常。
8、 try-catch与throws的用法。
还未有深入的理解
9、 性能问题
如:(1)某些信息,只需要写入byte类型的值就可以完全地传达出信息,而写入了int类
型等,造成输入输出以及传送时占用更多的内存,以致降低程序反应速度。
(2) 本来只需要创建一个对象而可以重复赋值,却在循环中重复创建对象,重复赋
值,造成占用了更多的内存。
10、自己的问题
未完待续。。。。。
总结:1.有经历就会有错误,所以我觉得目前要尽快地“经历更多”。
2.祸乱常积于忽微!我们很多犯错的地方是我们以为没有错的而地方。故不可小视细节!
因还未完善 难登大雅之堂,故只能先放到这里了