1、 IP、Port错误,或者Port被占用
这个问题就是粗心引起的了,客户端必须通过用服务器的IP地址才能访问进行,而一台机器的端口值为1到65535之间,很多端口是机器内部已经被占用了的,所以我们应该选择较大的端口。这个问题在更换机器的时候很容易发生,因为机器变了,IP地址就变了,如果不改过来的话是跟本无法进行访问的。
2、 等待连接时,不同循环方式可能导致内存溢出,关键在于whlie(true)的放置位置(这个通过代码来说明)
代码示例1:while (true ) {
java.net.Socket client=server.accept(); //3.启动一个线程 ProcessThread st=new ProcessThread(client);
st.start(); }
示例代码2:
java.net.Socket client=sever.accept();
while(true){
ProcessThread st=new ProcessThread(client);
st.start();
}
比较两个示例代码我们可以发现,示例二中在不停的创建用户对象,不停的启动线程;而代码一中创建了一个用户对象之后就启动了线程;毫无疑问代码一编写的代码很容易产生内存溢出。
3.自定义通信协议时,对不上。
我们都知道在远程通讯的时候发送数据必须符合TCP/IP和UDP协议
假如服务器在发送图片的格式是:byte(表示数据的类型)+int(表示数据的长度)+byte(表示发送的文件)
而假如客户端接收的读取的数据格式是:byte(表示数据的类型)+byte(表示发送的文件)
显然客户端读取完数据的类型之后,根本就无法读取数据,导致错误的发生
TCP/IP和UDP协议是远程通讯中最为关键的一部分。
4. read() 和readFully() 的区别
read()和readFully() 的区别的区别在于:前者是一读取立马发送而后者则是读满之后再发送,如果服务器在发送数据的过程中出现了连接超时等现象,使用前者客户端就读只取到了一部分数据,无法还原,导致出错,使用后者就可以避免这种情况的发生
5.内存溢出问题
电脑的内存是有限的,分配给一个程序的内存更是有限的,如果发送了一个过大的数组数据就会产生内存溢出的情况。一定要避免死循环的产生。
6.EOFException
7.正常的异常
客户端和服务器建立一个连接之后就在两者之间建立了一个管道,一旦其中的一方断开,另一方在发送或者接受数据的时候就会失去对象报错,这个是一个无法避免的错误,所以叫做正常的异常
8.try Catch和 throw的用法
throws是将异常抛给方法的调用者处理,try catch 则是将自身的异常截住自行处理,个人认为一般情况下使用try Catch,因为在catch的后面可以打印所发生的情况,对测试分析程序大有裨益。
9.性能问题
一个程序好与坏的一个重要标准是是否具有高性能。在能少写的地方尽量少些。其中很重要的一点是在循环中不停创建对象的时候,可以把创建的对象作为一个属性加在前面,这样就不用反复创建对象了,大大提升了性能
10.自己的问题
自己在做远程通讯的过程中(客户端和服务器放在同一台电脑上),发现的一个问题就是在截图的时候,在客户端用鼠标控制服务器鼠标移动的同时发现自己的鼠标一放到客户端的截图现实界面上立马被弹开,测试了很多次多是这样,到底什么原因呢?我开始以为是自己在设计的过程中使客户端在截图的时候不能运行其他的指令。结果调试了半天依然没得到解决,后来通过打印鼠标的移动坐标才发现在鼠标移动到显示界面的时候打印出了鼠标的坐标,立马弹开,这才发现自己设计的是客户端将鼠标移动显示界面的某一位置时服务器做出相应动作也移至在己端电脑上的统=同一位置,这才明白为什么鼠标一移到显示界面立马被弹开了,因为在同一台电脑上运行的啊,服务器端肯定要做出相应移到相应位置啦!换台电脑运行服务器,果然......哎~~都怪自己把事情的方向给搞错了!
分享到:
相关推荐
本文主要探讨了Java领域中常见的几种远程通讯技术,包括RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等。这些技术各有特点,适用于不同的场景。 **RMI(Remote Method Invocation)** RMI是Java平台特有的一种...
RMI提供了一种有效的方式来解决分布式系统中的远程调用问题。 #### 二、RMI的核心概念 **1. 远程方法调用的体系结构** RMI的体系结构主要包括三个关键组件:客户端存根(Stub)、服务器端框架(Skeleton)和远程...
在Java USB串口通讯中,还需要关注一些关键概念和问题,如异常处理、流控制、多线程同步,以及如何处理硬件中断。此外,对于Modbus协议,理解其数据结构、功能码和错误处理也非常重要。在实际应用中,通常需要结合...
Java串口通讯在物联网(IoT)设备通讯中扮演着重要的角色,特别是在使用DTU(Data Transfer Unit,数据传输单元)进行远程数据交换时。DTU通常被用于将物联网设备与GPRS/3G/4G等无线网络连接,实现远程数据传输。本...
Java作为一种广泛使用的编程语言,在实现远程图片批量下载方面具有以下优势: 1. **多线程机制**:Java提供了强大的多线程支持,可以高效地处理并发任务,比如同时下载多个图片。 2. **HTTP协议支持**:Java内置了...
Java远程通讯技术是Java开发中不可或缺的一部分,它使得运行在不同网络环境下的应用程序能够相互通信,实现数据交换和功能调用。这份“Java远程通讯技术及原理分析共18页.pdf”文档很可能是深入探讨了Java在分布式...
Java远程通讯技术是分布式服务框架中的关键组成部分,它允许不同机器上的应用程序相互通信,实现服务的远程调用。在Java领域,有多种技术可以实现远程通讯,包括RMI(Remote Method Invocation)、XML-RPC、SOAP、...
因此,如何通过Java程序与西门子PLC进行直接通讯,成为一个值得探究的技术问题。 JMatic是一个Java库,它专门用于帮助Java应用程序与西门子PLC进行通讯。利用JMatic,开发者可以在不需要安装额外的驱动或第三方软件...
四、IO流在远程通讯中的应用 1. 输入流与输出流:Socket对象的getInputStream()方法返回一个InputStream对象,用于读取服务器发送的数据;getOutputStream()方法返回一个OutputStream对象,用于向服务器发送数据。...
在IT行业中,485通讯通常指的是使用RS-485接口进行通信的方式,它是一种广泛应用于工业控制、远程监控等领域的串行通信标准。RS-485提供了一个多点、半双工的通信环境,允许在一条总线上连接多个设备。自由协议则是...
Java远程通讯技术是构建分布式系统的关键,涉及到多种技术如RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等。这些技术在不同的场景下有着各自的优势和适用范围,理解它们的工作原理对于优化系统性能至关重要。 ...
Java远程调用Kettle说明与代码 Java远程调用Kettle是一种基于Java的ETL(Extract、Transform、Load)工具,能够对数据进行提取、转换、加载,以满足不同业务需求。Kettle提供了名为Carte的Web Server程序,也被称为...
java进程间通讯机制代码 RMI(Remote Method Invocation)是一种基于Java的分布式编程模型,为java程序提供远程访问服务接口。
本项目利用Java的Socket编程技术,实现了一个简单的类QQ即时通讯程序,旨在提供基本的聊天功能。下面我们将深入探讨相关知识点。 首先,Java Socket编程是Java网络编程的基础,它提供了在网络之间两台计算机进行...
在IT行业中,Java程序与PLC(可编程逻辑控制器)之间的通信是一个重要的技术领域,尤其在工业自动化系统中。这个主题涉及到如何利用编程语言与硬件设备进行数据交换,以实现远程控制、监控或数据采集等功能。以下是...
在工业自动化领域,Java语言与PLC(可编程逻辑控制器)的通信是常见的需求,用于实现远程监控、数据采集和设备控制。本示例代码利用了Modbus协议,这是一种广泛应用于工业设备间通信的开放标准协议。Modbus4J是一个...
在JAVA部分,示例代码可能会包含如何在JAVA应用程序中导入和使用HslCommunication库的步骤。这通常涉及设置依赖、初始化通信对象、建立连接、发送读写请求以及处理响应。JAVA代码示例可能涵盖了基本的MODBUS RTU或...