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

题记

这不是一篇关于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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值