java的socket-tcp编程中需要注意的东西

来源:互联网 发布:rust游戏购买知乎 编辑:程序博客网 时间:2024/05/30 23:46

题记

这不是一篇关于java的socket编程实例,而是记叙那些踩过的坑。

前言

java的socket编程最直接的就是用socket相关的API,还有就是结合NIO方式。socket的API使用起来还是略觉复杂。因此,使用中我还是习惯对其做些封装。比如:链接过程。
/**     *      * @param ip     * @param port     * @return     *  null, if fail.     */    public static Socket buildConnection(String ip, int port) {             if (ip==null || port<=0) {            return null;        }        Socket sock = new Socket();        try {            sock.connect(new InetSocketAddress(ip, port), TMO_CONNECTTION);            if (!sock.isConnected()) {                sock.close();                return null;            }        } catch (IOException e) {            e.printStackTrace();            try {                sock.close();            } catch (IOException e1) {                              e1.printStackTrace();            }            return null;        }               return sock;    }
用一行代码完成链接,代码会简洁的多。
    Socket sock = buildConnection(ip, port);    if (sock == null) {        //connect fail.    }
其它的write&read方法也同理。但在过程中,发现了一些有意思的坑。

InputStream&OutStream

在获取in和out的stream时,in:每次获取的都是同一个对象的引用,out:每次获取的都是不同的对象,这一点通过hashCode就能看出。

输入只会有一个来源,而输出可能会有多个。
实际使用中,也不会对单路socket并发地读和写,所以也没啥必要去涉及一类蛋疼问题——考虑到tcp的流概念,那对单路 socket的并发读写会是什么样。

in和out的关闭都会导致socket的关闭。

输入&输出流的关闭相当于顺带调用了socket的close方法。想想也应该,要是没关才奇怪呢。

socket的那些注意事项

对接时,常有人将socket说成是一种接口方式。socket是一类接口,但它只是编程接口,不是通信方式,http&tcp可以说成是通信交互的方式但socket不是。socket的重要状态属性:connected、closed。connected:表明链接状态;closed:表明开关状态。

connected&closed关系:
已经connected的socket close后,状态closed==true,但此时它此时connected状态还是true。也就是说:关闭链接后,socket还是已链接状态的。所以,在java中检测一个socket是否可用,这两个属性都需要检测。另外,此点肯定是java语言的socket编程自带特性,可能也是为了表明这个socket曾经链接过。。。

当Read返回-1时。

“-1”是个很有标志性的返回值。
Read返回-1表明:Reach the end of the stream,那何时才是end呢?那还得再提下tcp的流概念,tcp的流是双向的–就像两个对握双手的人,左右互牵。
左手代表读,右手代表写。当对方撤回右手的时候,你的左手形单影只,每次Read就立即返回-1了(哪怕你说你可以等也会立即返回呢)。这个时候,你的右手还牵着对方的左手,你写的话他应该能读到(这个还没试过)。这个时候你也把右手撤回的话,那你俩就弦断无声各自天涯了。
其实都是常规问题,随手记叙好习惯!

0 0
原创粉丝点击