在Java中使用socket编程,如果没有人教导就直接来玩的话,会是非常痛苦的一件事情。笔者也没有人教,不是没有老师,而是老师也不太懂这玩意怎么玩,因为socket在B/S架构的开发中,用的地方不多。但是在学习Java的路途上,学会使用socket还是有必要的。以下是笔者经过几个项目下来,总结的使用socket的一些经验。希望能跟大家分享下(大神勿喷)。
1.使用Java编程,必须要有一个客户端、一个服务器端。在客户端的程序代码中,获取输入流输出流的顺序是有规律要遵循的。一定要是:一正一反。也就是说,如果客户端这边是先使用socket.getOutputStream()方法获取输入流,下面跟着使用socket.getInputStream()获取输出流。那么服务器端那边,就要先使用socket.getInputStream(),然后跟着使用socket.getOutputStream()。这两个顺序必须是交互对应,一正一反的。如果不这么做。你会看到控制台什么都没有执行,两端都在开着,但是什么都不干。其原因是因为两端的流都在互相等待对方的数据过来,就相当于死锁的情况。不清楚这一点,有时候出问题了找半天都找不到。
服务器端图片:
客服端图片:
2.除了上面的获取输入输出流要交互对应之外,调用这两个方法的最好就是紧挨着。也就是说,不要这里获取了输入流,然后中间写了些其他代码,然后下面再来获取输出流。这样看起来语法上是没有错的。但实际运行起来就是不行。客户端是怎么样的,服务器端也要是怎样的。具体的原因也说不清楚,不过实际应用起来就必须是这样。不然程序报错,而这种错误找半天都找不到。
3.使用socket编程的时候,肯定会涉及到流这个东西。必须要清楚一点,就是new了一个流出来,它只是执行一次任务的,就是说这条流只能输入,或输出一次。用完就没用了。当你还有其他数据再后续发送的时候,必须重新再new一条流出来。不然会报EOF异常、socket异常、或者IO异常这些。
4.补充上面一点,既然流只能使用一次,那么真正来做项目的时候,服务器端就肯定是要做成多线程的,不然当客户端这边还有下一次要收发数据的时候,服务器端已经执行完代码关闭了。
5.socket的shutdownInput或shutdownOutput方法,不一定是必须的。这两个方法的具体价值在哪里,笔者还没找到(如果有发现的请回复下,十分感谢),具体的用法就是用来关闭使用socket调出来的输入或输出流,而不把整个网络连接给关闭掉。笔者的意思是想告诉大家,如果不是很懂这个方法怎么用,最好不要用。因为这个方法有时候会引出另外一些问题。