`
狂奔DE蜗牛
  • 浏览: 15930 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

网络通信常见错误(问题)个人总结

阅读更多

 

最近在学习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就是将异常的处理方法交给调用这个方法的代码去处理,有点不负责的意味,两者主要是在使用场合上,合适的场合使用合适的处理方法。

 

  目前先写这么多吧,当然以前以后遇到的错误还会更多,这是一个不断的总结锻炼的过程,成为一个程序员就要在过程中不断的犯错,不断的提高,这样才能不断进步。

 最后送给自己,也送给所有看到这篇文章的读者:记住,你是最棒的!

 

 

 

分享到:
评论
6 楼 狂奔DE蜗牛 2010-07-30  
3.“read当读取的数组满或者到文件末尾时会返回” 不一定,阻塞读只要读到至少一个字节就可能返回(如果此时出现网络传送延迟),这不一定是达到流的尾端。
8.有时候你必须在循环里创建对象,因为某些情况下,创建对象的代价要远远小于维护同步的成本。

总结中提到循环中创造对象的用意是为了提高程序的性能。不断的创造对象会不断的占用内存。如果在某种情况下如果这样更好,当然可以用!毕竟在大多数情况下要注意这个问题!

输入流的read方法与readfully的方法主要的区别就在read读出的数组未必是满的!可能是初学的缘故吧,有些东西还不是太懂,不过谢谢您的回复!我会再查下相关资料!!
5 楼 狂奔DE蜗牛 2010-07-30  
congdepeng 写道

引用
最后送给自己,也送给所有看到这篇文章的读者:记住,你是最棒的!

那到底是你最棒,还是看过这篇文章的读者的我最棒?
还是并列最棒?还是最棒之一?


这句话只是给自己一种信心或者激励!自己目前刚开始学习java不久,希望自己不断进步,我希望java最后成为的找工作的敲门砖!当然你要是刻意的去追究谁是最棒的话就有点钻了!毕竟生活不是辩论场!
4 楼 狂奔DE蜗牛 2010-07-30  
2.很少有人会犯这样的错误,比较常见的死循环是在做读取的时候。另外楼主的代码应该用线程池。

那个循环是在不断读取数据时使用的,是放到线程中的!我没有贴上去前面的!!
3 楼 fenshen6046 2010-07-29  
来了看了一下
2 楼 pjcai 2010-07-29  
2.很少有人会犯这样的错误,比较常见的死循环是在做读取的时候。另外楼主的代码应该用线程池。
3.“read当读取的数组满或者到文件末尾时会返回” 不一定,阻塞读只要读到至少一个字节就可能返回(如果此时出现网络传送延迟),这不一定是达到流的尾端。
8.有时候你必须在循环里创建对象,因为某些情况下,创建对象的代价要远远小于维护同步的成本。
9.throw有它的用处,尤其是你catch无法做任何有帮助性的处理。
1 楼 congdepeng 2010-07-29  

引用
最后送给自己,也送给所有看到这篇文章的读者:记住,你是最棒的!

那到底是你最棒,还是看过这篇文章的读者的我最棒?
还是并列最棒?还是最棒之一?

相关推荐

    关于西门子常用通信文档总结个人出品.pdf

    这份“关于西门子常用通信文档总结个人出品.pdf”很可能包含了对西门子通信协议、网络结构、通信设备以及常见问题解决方法的详细解析。以下是根据这些信息可能涵盖的一些关键知识点: 1. **西门子通信协议**: - *...

    常见中间件漏洞总结PPT

    但是,Nginx同样有安全漏洞,比如配置错误导致的安全风险、使用不当的模块、访问控制问题等。 4. IIS是微软公司出品的Web服务器软件,是Windows系统的一部分,主要适用于***等技术。IIS也经常被曝出漏洞,如缓存...

    C#与VB.NET网络通信开发实战

    ### C#与VB.NET网络通信开发实战 #### 一、套接字编程基础与实践 在本书《C#与VB.NET网络通信开发实战》中,作者深入浅出地介绍了网络通信的基本概念及其在.NET框架中的具体应用。尤其针对套接字编程进行了详尽的...

    计算机网络技术考点个人总结.doc

    计算机网络技术涵盖了许多关键概念,这些概念构成了网络通信的基础。首先,我们来深入理解传输技术。广播式链接,如广播网络和多播网络,适用于地理分布较小、需要一对多通信的场景,例如局域网中的信息广播。点到点...

    计算机网络复习总结计算机网络复习总结.docx

    网络通信分为面向连接和无连接两种方式。面向连接通信在数据传输前需建立连接,保证可靠性,而无连接通信则不预先建立连接,可能面临数据丢失或乱序的问题。 计算机网络按地理范围可分为个人区域网(PAN)、局域网...

    数据通信与计算机网络 杨心强

    根据提供的标题、描述以及标签,我们可以推断出文档主要讲述的是“数据通信与计算机网络”的相关内容,作者为杨心强。尽管部分内容似乎是一些重复的网址链接,并没有提供实际的知识点,但基于标题和描述,我们可以...

    网络技术知识点总结

    ### 网络技术知识点总结 #### 计算机基础 **计算机的四个特点:** 1. **信息处理特性:** 计算机能够高效地处理各种类型的信息,包括文字、数字、图像、声音等。 2. **程序控制特性:** 通过编写特定的程序,...

    全国软件设计师个人总结

    全国软件设计师个人总结 在信息技术领域,软件设计师的角色至关重要,他们负责规划、设计和实现复杂的软件系统。软件设计师不仅需要深厚的编程技能,还需要对软件工程的全生命周期有深入理解,包括需求分析、系统...

    PCSC协议错误代码总结

    ### PCSC协议错误代码总结 #### 一、概述 在智能卡领域,PC/SC (Personal Computer/Smart Card) 协议是连接智能卡与个人计算机的重要标准之一。该协议定义了智能卡读写器与操作系统之间的交互方式,使得应用程序...

    计算机网络个人概要总结.doc

    计算机网络是信息技术领域的重要组成部分,它是指多个独立的计算机通过通信设备和线路相互连接,以实现信息交换和资源共享的系统。网络的主要功能包括数据通信、资源共享、并行和分布式处理、提高系统的可靠性和良好...

    JAVA学习历程(基础知识个人总结1,2,3)

    这份"JAVA学习历程(基础知识个人总结1,2,3)"的文档集合,显然是一位热情的学习者在探索JAVA世界时,逐步积累并整理出的心得体会。这些文档可能包含了从入门到进阶的各类关键知识点,旨在帮助读者构建全面的JAVA...

    TomCat服务端部署与Android与服务端通信.rar

    总结起来,"TomCat服务端部署与Android与服务端通信"是一个涵盖Web服务器部署和移动应用网络通信的重要主题。通过理解Tomcat的部署配置,以及Android客户端与服务器通信的各种方式,开发者可以构建出稳定、高效的跨...

    Java基础各章节个人总结代码

    "Java基础各章节个人总结代码"是一个针对Java初学者或有经验的开发者的学习资源,它涵盖了Java SE(标准版)的基础知识。在这个压缩包中,你可能会找到关于变量、数据类型、控制流、类和对象、封装、继承、多态性...

    远程通信协议原理.rar

    总结来说,远程通信协议是网络通信的基石,它们定义了数据传输的规则,确保了信息在网络中的准确、安全和高效流动。了解并掌握这些协议的工作原理,对于理解互联网运作机制以及开发和维护网络应用至关重要。在不断...

    (强烈推荐)自考计算机网络原理复习资料经典总结.doc

    以下是对自考计算机网络原理复习资料的详细总结: 1. 网络发展阶段: - 面向终端的计算机网络:早期网络主要用于大型主机与终端之间的通信。 - 计算机-计算机网络:随着个人计算机的发展,网络变为计算机间的直接...

    网络基础知识总结.pdf

    常见的子网掩码如255.255.255.0和255.255.248.0分别对应不同规模的网络,子网掩码的设置应根据网络大小进行合理配置,以避免网络传输错误或效率下降。 路由器是网络中的关键设备,它连接不同的网络并负责数据包的...

    2013年软考前的个人总结

    - **IPSec**(Internet Protocol Security):用于保护网络通信安全的协议。 ### 8. 数字签名验证 - 用户B收到用户A带有数字签名的消息N时,首先需从证书颁发机构(CA)获取用户A的数字证书,并验证证书的真实性,随后...

    浅析计算机网络通信协议

    计算机网络通信协议是确保不同设备之间能够有效交换信息的一系列规则和标准。这些协议定义了数据传输的方式、格式以及通信过程中的错误检测和纠正机制。本文主要探讨了三种常见的局域网通信协议:NetBEUI协议、IPX/...

    仓管员的个人工作总结.pdf

    9. 无线通信技术:在一些自动化程度较高的仓库中,使用无线通信技术进行设备之间的数据传输是常见的,比如使用WIFI、蓝牙等技术。 10. 电子支付与结算系统:仓管员在进行销售和采购过程中,可能需要使用电子支付和...

Global site tag (gtag.js) - Google Analytics