最近在学习java网络通信方面的知识,学习的过程就是一个不断总结的过程,通信整个过程需要注意的内容很多,下面就在网络通信中常见的错误或者问题进行一个短暂的总结:
1.ip port已被占用或错误
学习通信的在初期通常都犯过这个错误,一台电脑的端口值为1到65535之间,另外对于要连接的服务器本身ip地址可以通过ipconfig来获得,端口被占用错误出现的较频繁,当一个服务器启动时,端口已经被占用,在再次启动时需要将以前的关闭。
2.循环导致错误 (慎用while true)
在通信中有许多过程都是阻塞的,特别是传输过程中的流的写入和读取都需要循环来完成,有时候循环位置不当也可以出错。下面给出一段代码示例:
try{
ServerSocket myser=new ServerSocket(port);
System.out.println("创建服务器成功");
Socket client=myser.accept();
while(true){
SerThread ser=new SerThread(client);
ser.start();
}
}catch(Exception ex){
ex.printStackTrace();
}
在这段代码中,当连接到一个socket对象时就需要将其放到一个线程中去处理,这段代码错误在于while“达到”的目的是不断的用这个socket建 SerThread,久而久之就会最终导致服务器内存溢出,报错。正确的代码应该是 :
try{
ServerSocket myser=new ServerSocket(port);
System.out.println("创建服务器成功");
while(true){
Socket client=myser.accept();
SerThread ser=new SerThread(client);
ser.start();
}
}catch(Exception ex){
ex.printStackTrace();
}
3.服务器客户端协议不一致
网络通信中各种流的传输都需要协议来约束,没有协议就没有网络通信就没有互联网,因此在通信过程自定义协议过程中一定要保证服务器和客户端都严格按照规定的协议写入和读取流,也许仅仅是一个byte没有读取到都会导致整个流的读取错误,最后会报错。
4.read和readfully
两种方法都可以返回一个byte[],查看java API文档可以看到输入流read方法的说明:
写道
从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。以整数形式返回实际读取的字节数。在输入数据可用、检测到文件末尾 (end of file) 或抛出异常之前,此方法将一直阻塞。
如果 b 为 null,则抛出 NullPointerException。如果 b 的长度为 0,则不读取字节并返回 0;否则,尝试读取至少一个字节。如果因为流位于文件末尾而没有字节可用,则返回值 -1;否则至少读取一个字节并将其存储到 b 中。
将读取的第一个字节存储到元素 b[0] 中,将下一个字节存储到 b[1] 中,依此类推。读取的字节数至多等于 b 的长度。设 k 为实际读取的字节数;这些字节将存储在从 b[0] 到 b[k-1] 的元素中,b[k] 到 b[b.length-1] 的元素不受影响。
read(b) 方法与以下方法的效果相同:
read(b, 0, b.length)
read当读取的数组满或者到文件末尾时会返回,因此返回的不一定是一个满的数组,下面看下readfully的API说明:
写道
从输入流中读取一些字节,并将它们存储在缓冲区数组 b 中。读取的字节数等于 b 的长度。
在出现以下条件之一以前,此方法将一直阻塞:
输入数据的 b.length 个字节是可用的,在这种情况下,正常返回。
检测到文件末尾,在这种情况下,抛出 EOFException。
发生 I/O 错误,在这种情况下,将抛出 IOException,而不是 EOFException。
如果 b 为 null,则抛出 NullPointerException。如果 b.length 为零,则不读取字节。否则,将读取的第一个字节存储到元素 b[0] 中,下一个字节存储到 b[1] 中,依此类推。如果此方法抛出异常,则可能是因为已经用输入流中的数据更新了 b 的某些(但非全部)字节。
这个方法返回的一定是一个完整的数组,而且当读取到末尾但是数组还是未满时会抛出EOFException,这样两者的区别就很明显了。
5内存溢出
内存溢出这个容易发现,只要细心就可以尽量避免,当然这个内存溢出肯能是由于流的读取或者其他问题造成的。给出最简单的示例:
int len=5686544;
byte[] by=new byte[len];
一太电脑的内存有限,分配给一个程序的空间有限,超过这个限度就是溢出。
6EOFException
在上面的readfully的说明有出现异常的情况。具体说明为:
写道
当输入过程中意外到达文件或流的末尾时,抛出此异常。
此异常主要被数据输入流用来表明到达流的末尾。注意,其他许多输入操作返回一个特殊值表示到达流的末尾,而不是抛出异常。
当文件或者流已经结束,但是程序缺还在阻塞的读取数据就会出现这种异常。
7突然中断通信(正常的异常)
之所以说这是一种正常的异常是因为这个异常并不是程序本身的错误,是程序员本身不能控制的,比如突然某一端掉线或者突然断电都会导致通信失败,抛出异常,我们在写程序过程中要考虑这种情况,及时在出现时print信息。
8.程序性能问题
一段程序需要其运行的时间空间复杂度尽量的小,这样的程序才是可取的,这是每个程序员需要注意并且不断改善的。下面阐述一种最简单的,比如在一个循环中需要某个对象的方法,很多人都会把创建对象放到循环中去。这样每次都会创建一个对象,这样会不断的消耗内存,简单的处理就是将这个对象作为属性来处理。
9.try{}catch和throw
try catch是在catch中直接对出现的错误进行处理,或者打印信息,或者调用另 外的程序,而throw就是将异常的处理方法交给调用这个方法的代码去处理,有点不负责的意味,两者主要是在使用场合上,合适的场合使用合适的处理方法。
目前先写这么多吧,当然以前以后遇到的错误还会更多,这是一个不断的总结锻炼的过程,成为一个程序员就要在过程中不断的犯错,不断的提高,这样才能不断进步。
最后送给自己,也送给所有看到这篇文章的读者:记住,你是最棒的!
分享到:
相关推荐
基于计算机网络通信常见问题及管控措施.pdf
谈计算机网络通信常见问题及技术发展.pdf
计算机网络通信常见问题及其技术发展概论.pdf
计算机网络通信常见问题及技术发展研究.pdf
工程通信个人年终总结_
网络通信错误代码大全,很不错的一些总结,给大家分享一下
电力网络通信常见的故障.doc
谈计算机网络通信常见问题及技术发展 (1).pdf
中低端网络产品常见故障排错,路由器,网关,交换接入, 无线AP AC课程介绍 故障排错整体思路 故障定位常用命令和工具 故障相关信息查看及分析 典型案例分析
TIA博途_Profinet通信故障诊断及常见错误解决方法汇总
1、 了解Android网络通信技术 2、 掌握在程序中嵌入浏览器的方法 3、掌握HTTP通信 4、掌握Socket通信 实验内容:(其中,1必做,2和3选一个) 1、 开发一个简单的浏览器程序,实现网址输入、前进、后退、刷新网页等...
flex与 java 通信常见错误: [RPC Fault faultString="Send failed" faultCode="Client.Error.MessageSend" faultDetail="Channel.Connect.Failed error NetConnection.Call.Failed: ...
网络通信年终总结.docx
网络通信中涉及的相关基础知识,分章节总结了网络通信中所涉及的概念及相关解释。概括了解网络通信知识。
北京理工大学,网络与通信安全,期末复习总结,个人总结全部知识点应对期末考试
通信广场营业员工作个人总结.doc
C#网络通信程序设计 无水印版。2积分带走。
网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt网络通信技术.ppt
通信公司转正个人总结.doc
通信监理工作个人总结.docx