哦,总结 !( 通信阶段前期总结)
看了下上一次写的的总结,还是11年10月份的……
一直都不太喜欢写,或者说,总是以一副淡定,慵懒静默的姿态在学着。每次有所感悟心得,想写一篇的时候,也还是过后就觉得没必须的。其实没什么让自己的生活忙成了这样,国家总统都还有工作和生活。现在感知这不是一个很好的习惯,下决心尽量去改善。\(^o^)/~
下面是对这7天以来,对通信阶段所学知识的一个小总结:
一、完成的任务:
(1)实现服务器和客户端的互联:当有一个客户端连接进来的时候,服务器端启用一个线程来处理客户端发送过来的请求。
抽象出来,要做的有:
1.创建服务器对象,分配好实现连接时的端口号
2.在服务器端建立连接,返回连接套接S
3.在客户端建立连接,要指明所要连接的服务器的IP地址和端口号port
服务器端:
(3)简单的服务器和客户端的画板交互:在客户端和服务器端分别创建一个显示界面,给界面窗体添加鼠标监听器,当点击释放鼠标后,可以实现画直线,并且在任一端画直线,另一端可以同步显示出来。
交互画板的实现和客户机服务器的对讲原理相同,差别只在于读取数据类型的不同,交互画板需要创建一个基本数据输入输出流—ataInputStream/DataOutputStream)来输入输出一条直线的两个坐标点位置。// 得到套接的输出流,创建原始数据类型输出流OutputStream ous = s.getOutputStream();DataOutputStream dos = new DataOutputStream(ous); // 创建基于文件的原始数据类型输出流OutputStream ous = new FileOutputStream(ServerThread.path);DataOutputStream dos = new DataOutputStream(ous);
二、在完后该阶段任务中遇到的一些错误:
(1)关于服务器客户端连接的异常分析:
1.java.net.BindException:Address already in use: JVM_Bind:该异常发生在服务器端进行new ServerSocket(port)操作时。异常的原因是以为与port一样的一个端口已经被启动,并进行监听。即上一次的运行还没关闭,又重新点击了运行。
2.java.net.ConnectException: Connection refused: connect:该异常发生在客户端进行new Socket(ip, port)操作时,发生的原因或者是具有ip地址的机器不能找到,或者是该ip存在,但找不到指定的端口进行监听。出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务器端把ping禁掉则需要另外的办法),则看在服务器端的监听指定端口的程序是否启动。
3.java.net.SocketException: Socket is closed:该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket的close方法)再对网络连接进行读写操作。
4.java.net.SocketException: (Connection reset或者Connect reset by peer:Socket write error):该异常在客户端和服务器端均有可能发生,引起该异常的原因有两个,第一个就是如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。另一个是一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。
5.java.net.SocketException: Broken pipe:该异常在客户端和服务器均有可能发生。在第4个异常的第一种情况中(也就是抛出SocketExcepton:Connect reset by peer:Socket write error后),如果再继续写数据则抛出该异常。这两个异常的解决方法是首先确保程序退出前关闭所有的网络连接,其次是要检测对方的关闭连接操作,发现对方关闭连接后自己也要关闭该连接。
(2)空指针异常:S获得输入输出流时候的空指针异常,连接对象s的异常,一般是因为重新new了一个S所在类的对象,故而在非建立连接的类中用S时候,要记得传值过去。
(3)服务器和客户端两端画线出来位置总是不对
一个原因可能是调用的读写方法不对,比如writeByte(),然后readInt()就有可能丢失数据,第二个原因就是写出和读取时候的变量顺序要保持一致,不能这边写出x1,x2,然后那边读取x2,x1,第三个原因就是变量的个数,类型一定要对应。这些都是处理IO流重要注意的细节问题。
三、小点感想
在完成次阶段的任务时候,费了不少时间,但是,进度并不是很快,算是很慢,尤其是文件传输写了两天。
犯了很多的错误,主要还是监听传值的错误,和IO的错误。
发现了自己很多的不足,对以前所学的知识并没有掌握的很好。突然的发现自己关于流的所有知识都忘干净了,连InputStream是抽象类,不能被实例化都记不着了o(□)o 故而,总结还真是很重要,以前太懒了,看到别人每学一个内容时候,都将知识要点和所犯的错误写的清清楚楚,很惭愧。所以,下决心改了。
收获也有不少,对自己而言的最重要的是兴趣慢慢提高了,因为兴趣对自己真的很重要。其余的,没什么能阻挡住自己。并且看到了很多人的优秀和努力,更有激情和动力了。
最后,这篇总结好像写的很是混乱,看的到的人,看的懂的人看不懂的人,都可以吱下声给个意见~~没意见下次我也会写的更好。