1.ip错误 port错误 port已经占用
那。。这些问题,说穿了就是粗心,不仔细。
客户端的IP 和端口port与服务器的IP和端口port要能对的上号。没连接上会报什么错,我想这个就不用事例了。当然还要记住先运行服务器(额,我想是)。
port的值是在1~65535之间,所以不要超出,否则也会报错,并且前面的大约1000个端口号是被占用,因此一般使用数值较大的端口号。
2.内存溢出
这个错误就犯的多了,常常可以看见异常出现的----"OutOfMemoryError"。
代码事例
//等待客户机连入
java.net.Socket client = sk.accept();
while (true) { // 启动一个线程去处理:
ProcessThread pt = new ProcessThread(client);
pt.start();
}
这样的代码运行后呢,会报出这样的异常信息:
Exception in thread "main" java.lang.OutOfMemoryError: unable to create
new native thread
处理方法:
把java.net.Socket client =sk.accept();这行代码放入while(true)中
当然这个是在等待连接时,不同循环造方式导致的内存溢出。
3.通信协议的问题
主要原因是服务器和客户端的协议不一致,发送的消息,数据不能正常接受。
也能导致内存溢出:
比如我们先定义的协议是byte是1就是一张图片,然后加上数据长度,再加上数据,如果这时客户端接受时没有遵循协议,少读了几个字节,进行下一个循环,最终
同样将导致内存溢出。
4.read()和readFully()以及使用for循环来读取数据
这三个都用过,显然在使用read()来读取数据时容易造成数据的丢失,比如图片不能完整的传送。原因是我的数据读完 ,但是到了我接收的时间,我会先接收。
readFully()感觉上和for循环读取数据没什么区别。与read()不同的是,是读完数据,再接收。
5.死循环死递归
这个错误其实也是常和内存溢出一起出现
事例代码也同上:
//等待客户机连入
java.net.Socket client = sk.accept();
while (true) {
// 启动一个线程去处理:
ProcessThread pt = new ProcessThread(client);
pt.start();
}
这个要注意,再次提醒
6. EOFException:end of file exception
这段异常产生的原因是读到文件末尾没有数据了,发送100个数据,但是要读200个,显然是不可能的。主要主义读取的方法。不要发送是一张图片,而客户端却不停的循环读取。。
7.正常的报错
这个其实就是断开了连接,当你关闭了连接,或者停电了,网线掉了,等等情况都会报错,这是很正常的错误。
8.try catch 的位置不同
try catch的位置不同会导致死循环
还有try catch 和 throw 使用的时机---这个自己看着办
给自己处理的就用try catch 给别人(方法的调用着)处理就用throw
9.性能问题(提高效率)
其实可以提高性能的地方有很多方面,比如算法啊,属性的定义啊
比如在代码中多次重复创建的对象可以定义为属性
java.awt.Robot robot=new java.awt.Robot();
//要截取的区域大小
Rectangle rt=new Rectangle(0,0,300,300);
事例中,因为要不停的得到屏幕的截图,所以会不停重复的创建截取对象
我们将他定义为private私有属性,免除创建对象的重复性,大大提高效率。
代码的精简也是效率提高的途径。
10.自己的问题
(1) 屏幕传送的不稳定
有是很快,有是很慢。我想是因为截取了全屏图片,又没有进行压缩,最后迟早会报一个内存溢出。
(2)鼠标移动控制很慢----调试中,应该是代码的性能性不高。
今天在公司随便翻了本书,瞟到了一句话:一个优秀的程序员所具有的三大美德:懒惰、傲慢、缺乏耐心。我了个去,我乍一看这三种美德似乎都具备了,结果果然和自己想的一样是有深层意义的,这个就不详说了。总而言之,自己就是懒了,是心懒。我想这是自己最大的问题。