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

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

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的通信方式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值