`
任我随风
  • 浏览: 14298 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

远程控制中容易出现的十大错误

阅读更多
远程控制十大常见错误分析及解决方法

1、 IP \ port 出错
这个错误主要是由于粗心引起的。落实到具体,主要存在这样一些问题:
1.1、 在创建服务器的时候,所所使用的端口号port已经被占用
解决方案:尽量使用6000以上的端口号,但不可以超过65535。如果端口被占用,就重新设置一个端口。   
1.2、在服务器端创建ServerSocket的时候,没有传参数port           
解决方案:传入参数port
1.3、在创建客户端时,作为参数的服务器IP地址不存在
解决方案:确定服务器正确的IP地址
1.4、在创建客户端时,服务器IP地址正确,但作为参数的端口号port和服务器所占的端口号不同,导致连接失败
解决方案:让客户端的端口号和服务器创建时所用的端口号保持一致
2、保持连接时不同的循环方式
在网络通信时,服务器端和客户端之间传递信息往往会用到循环,当一端写数据的时候,另一方一定要在读数据,这样数据才能在网络上传送起来。如果循环方式不同,很可能会导致客户端和服务器端都在等待对方,使得整个通信停滞。
解决方案:弄清楚服务器端在创建连接对象时的正确流程。
代码实例:
public void SetupServer(int port) {
try {
java.net.ServerSocket server = new java.net.ServerSocket(port);
System.out.println("服务器创建成功!!");
while (true) {
java.net.Socket client = server.accept();
clientAddr = client.getRemoteSocketAddress().toString();
System.out.println("有客户机连接"+clientAddr);
ServerThread st=new ServerThread(client);
st.start();
}

} catch (Exception ef) {
ef.printStackTrace();
System.out.println("服务器创建失败!!");
}
}
运行结果:
服务器创建成功!!
public void SetupServer(int port) {
try {
java.net.ServerSocket server = new java.net.ServerSocket(port);
System.out.println("服务器创建成功!!");
java.net.Socket client = server.accept();
clientAddr = client.getRemoteSocketAddress().toString();
System.out.println("有客户机连接"+clientAddr);
while (true) {
ServerThread st=new ServerThread(client);
st.start();
}

} catch (Exception ef) {
ef.printStackTrace();
System.out.println("服务器创建失败!!");
}
}
运行结果:
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at version2.server.Server.SetupServer(Server.java:15)
at version2.server.Server.main(Server.java:34)
服务器创建失败!!

3、服务器和客户端的协议不同
网络通信的关键就是通信协议的制定,服务器、客户端对“字节流”处理的规则就是通信协议。要服务器与客户端之间完成通信,就必须制定相应的协议,以区别不同类型的信息。
解决方案:要明确的制定好通信协议,并保证服务器、客户端能保持一致。
代码实例:
服务器端:
// 1代表这条消息是一张图片
dous.writeByte(1);
//图片的格式:1为jpg,2为gif
dous.writeInt(1);
// 图片字节的长度
dous.writeInt(imageData.length);
// 发送图片数据
dous.write(imageData);
运行结果:
服务器创建成功!!
有客户机连接/127.0.0.1:1092
第 1 张图片发送完毕!!
第 2 张图片发送完毕!!
第 3 张图片发送完毕!!
第 4 张图片发送完毕!!
客户端:
byte type = dins.readByte();// 得到消息类型
while (1==type) //接收到图片信息
{             int len = dins.readInt();// 图片数据的长度
byte[] data = new byte[len];
// 读取字节数组
for(int i=0;i<len;i++){
data[i]=dins.readByte();
}
}
运行结果:
收到一条错误信息,。。。。
收到一条错误信息,。。。。
收到一条错误信息,。。。。
收到一条错误信息,。。。。
4、read(data[])和readfully(data[])的区别
read(data[])
将数据读取到data[]数组中,如果要读取的数据长度小于数组的长度,则先将所有数据读取到数组中,剩下的数组空间用\0填充。返回读取int型的字节的长度。 如果流位于文件末尾而不能读取字节,或者流已关闭,其他I/O错误,会抛出IOException.
readfully(data[])    
同样是将数据读取到data[]数组中,但是必须输入数据的data.length个字节是有效的。没有返回值。若检测到文件末尾,而数组却没有取满,则会出现EOFException异常。如果流位于文件末尾而不能读取字节,或者流已关闭,其他I/O错误,会抛出IOException.
代码示例:
java.io.FileInputStream ins = new java.io.FileInputStream(src);
java.io.DataInputStream dins = new java.io.DataInputStream(ins);
dins.readFully(data)读取:
readfully(data[]):
byte[] data = new byte[10];
dins.readFully(data);
如果读取的src文件源中的内容小于10个字节 :rtrrthgre
运行结果:出现EOFException异常
read(data[])读取:
    for(int i=0;i<data.length;i++){
      read(data[i]);}
返回值为int型。若如流中读取的字节为空,则返回-1;
5、异常内存的处理
5.1、程序占用内存过大,电脑不能支持运行程序所需的内存。
代码示例:
while(true){
ServerThread st = new ServerThread(client);
st.start();
}
5.2、死循环启动线程,导致内存溢出
5.3、当服务器和客户端协议不匹配时,也有可能造成内存溢出。
服务器
byte 代表信息的类型 byte  接受信息的条件 int 信息的长度 data[]  信息内容
客户端
读取一个byte    确定信息内容 读取int  得到信息长度 Data[]  读取信息内容
协议不匹配,程序运行下去,会造成内存溢出。
解决方案:在while(true){}中,谨慎的创建对象;再者,尽量避免“死循环”;服务器和客户端的协议要保持一致。
6、EOFException
要读取n个字节,输入流中传来了小于n个字节。就会产生EOFException异常
解决方案:仔细。
7、断开
在通信的时候,客户端或服务器突然断开,而另一端还在发送或等待接收消息。
8、try-catch 放的位置不同
throws异常  还是用try-catch处理异常。
try-catch放的位置不同,导致出现不同的异常。
解决方案:分析清楚特定代码会抛出什么异常,正确使选用throws还是try-catch处理异常。
9、性能问题
程序创建了很多不必要的对象,或是不必要的初始化,降低了程序的运行效率。
代码实例:
public static byte[] printScreen(){
       try{
           java.awt.Robot robot=new java.awt.Robot();
           Rectangle rt=new Rectangle(0,0,1440,900);
           //取得截屏图片
           BufferedImage image= robot.createScreenCapture(rt);
          
           //改变全屏截图的大小
           AffineTransformOp op = new AffineTransformOp(AffineTransform
                  .getScaleInstance(1.0/2.0, 1.0/2.0), null);
           image = op.filter(image, null);

           //转为字节数组
           byte[] imageGet=imageToBytes(image);
           return imageGet;   
       }catch(Exception ef){
           ef.printStackTrace();
           System.out.println("截取屏幕图片失败!!");
       }
       return null;
    }
解决方案:尽量少的创建对象和初始化对象。
10、自己的问题
10.1、TCP/IP和UDP的区别
TCP/IP通信方式又被称为“面向连接的,可靠的”通信方式,在传送数据之前,必须先在客户端与服务器之间创建通信管道,数据在这些通信管道中传输的过程中不会丢失,因此是“可靠的”。
与TCP/IP通信方式相对的是UDP通信方式,该通信方式又称数据报通信,它是不可靠的,不面向连结的。在于发送消息的一方不管接收方有没有收到消息,都会持续不断的发送消息。因此,这种通信方式很容易丢失数据。但是它节约资源,对于不必保证数据完整性的信息来说,使用UDP通信方式是较好的选择。比如远程控制中,服务器将截到的屏幕图片发送给客户机时,就可以选择UDP的通信方式。


1
4
分享到:
评论

相关推荐

    IIS6.0 IIS,互联网信息服务

    请在其上单击右键,选“属性”,再进入“安全”窗口,看列表中是不是默认的允许“Everyone”组完全控制的状态,如不是,请改回 。 [编辑本段]IIS之FTP服务器  第二篇 IIS之FTP服务器 一、建立你的FTP站点 第一个FTP...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    最新版Radmin3.4完美破解版-隐藏任务栏图标

    Radmin (Remote Administrator)是一款屡获殊荣的远程控制软件,它将远程控制、外包服务组件、以及网络监控结合到一个系统里,提供目前为止最快速、强健而安全的工具包。  它有以下特点:  1.运行速度快。  2....

    McAfee 8.0 简体中文

    使用此功能可以阻挡在共享文件夹中放置了含有已感染病毒文件的远程计 算机的进一步访问。您可以指定阻挡这些连接的时间长短。如果您希望在指 定的时间限制之前取消阻挡所有的连接,您可以在按访问扫描统计...

    vfp6.0系统免费下载

    已发布的应用程序中,由于带有这些表单,而在最终用户的机器上出现表单 OLE 错误,因此无法正常工作。 答案: 在 6.0 版中,包含有以下 ActiveX 控件的文件,其名称已从 Comctl32.ocx 更改为 Mscomctl.ocx: ...

    破解版为最新完美版。支持WIN7隐藏任务栏图标

    Radmin (Remote Administrator)是一款屡获殊荣的远程控制软件,它将远程控制、外包服务组件、以及网络监控结合到一个系统里,提供目前为止最快速、强健而安全的工具包。  它有以下特点:  1.运行速度快。  2....

    基于S7-200PLC的自动洗车机控制系统设计毕业设计.doc

    (3)数据处理功能 (4)监控、故障诊断功能 (5)步进控制功能 (6)A/D、D/A转换功能 (7)停电记忆功能 (8)远程I/O功能 (9)通信连网功能 (10)扩展功能 2.4 PLC的结构与工作原理 PLC的基本组成为四部分:中央...

    C#微软培训资料

    18.2 在 C #代码中调用 C++和 VB 编写的组件 .240 18.3 版 本 控 制 .249 18.4 代 码 优 化 .252 18.5 小 结 .254 第五部分 附 录 .255 附录 A 关 键 字.255 附录 B 错 误 码.256 附录 C .Net 名字空间...

    DotNetTextBox所见即所得编辑器控件 v3.3.1

    4) 修正控件在Opera浏览器使用中出现的一些BUG。 5) 修正了控件右键菜单判断选择状态不正确的BUG。 6) 优化了非IE浏览器下的脚本性能。 7) 将编辑器设置为在缩放或移动过程中持续更新元素外观,以达到更...

    海康威视4004驱动级软件

    8、在电子地图中,由于考虑到当图片尺寸较大时,BMP图片耗用的内存太多,容易引起异常,所以今后将仅支持JPG图片,以确保系统的稳定性;同时改正了电子地图中存在的一些BUG。不便之处,敬请新老客户多多谅解。 3.1....

    Oracle9i的init.ora参数中文说明

    说明: (如果值为 TRUE) 当在隐式转换中丢失数据时返回错误的参数。 值范围: FALSE | TRUE 默认值: TRUE nls_numeric_characters: 说明: 指定将用作组分隔符和小数位的字符。组分隔符就是用来分隔整数位组 (如千, ...

    手术机器人发展现状及趋势.doc

    您的答案:BCD 回答错误 12 以下哪些是光学定位系统的特点 [ 多选题:5分 ] A 工作体积大 B 测量精度高 C 视野范围内不能有遮挡 D 容易受其他金属的干扰 试题解析 您的答案:ABC 回答正确 13 以下哪些是手术...

    注册表修改大全(作者:Sunny)

    “控制面板”和“打印机”是Windows98系统配置的一个重要组成部分,为了避免让别人随便修改,可以将“设置”菜单中的“控制面板”和“打印机”选项禁用。 打开HKEY_CURRENT_USER\Software\Microsoft\Windows\...

    易语言程序免安装版下载

    修改BUG:矢量动画支持库中的“矢量编辑框”组件在光标位于组件左上角时按左光标键进入前一行可能会导致显示错误或内存申请失败。 11. 修改BUG:网络传送支持库在使用代理下载时可能会导致程序崩溃。 12. 修改BUG...

    asp.net知识库

    ASP.NET 2.0, 想说爱你不容易 SqlDataSource WEB控件:当DeleteCommandType= 遭遇 ASP.NET 2.0 只读 TextBox 回发后信息丢失的 bug asp.net2.0:扩展ImageButton控件定制自己需要的功能 ASP.NET 2.0 正式版中无刷新...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    安装 SUSE Linux Enterprise Server --服务器版

    2.3 远程控制安装. . . . . . . . . . . . . . . . . . . . . . . . . . . 8 部分 2 在 IBM POWER 上安装9 3 安装注意事项11 3.1 安装类型. . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.2 IPL 选项...

    ExtAspNet v2.2.1 (2009-4-1) 值得一看

    -修正绑定到Tree的XMLDocument中Icon属性映射错误(feedback:nopnop9)。 -修正HtmlEditor不能编辑的BUG(feedback:TheBox)。 -修正IE下有时会出现空白页面的情况(feedback:olivia919)。 +2009-12-06 v2.1.8 -...

    幻彩博客(v12.3.1 水墨冰蓝作品).zip

    首页远程图片大小控制 日志页栏目名称控制 修复日志不能翻页功能 修复连续字符串不能的BUG√(本BUG吙煋提供修正) 去掉标题栏默认的标题后缀 在站长简介中增加代码按钮 去掉版权信息的编辑器

    Toad 使用快速入门

    在运行出现错误时,存储过程停止到有问题的语句。用户可以使用快捷方式或模板来快速编写PL/SQL,也可以根据需要生成自己的模板。使用Toad可以非常方便地进行编辑工作,可如设置书签、取消注释、格式化SQL语句等等。 ...

Global site tag (gtag.js) - Google Analytics