您的位置:首页 > 理论基础 > 计算机网络

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

2017-01-13 17:39 183 查看

题记

这不是一篇关于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了(哪怕你说你可以等也会立即返回呢)。这个时候,你的右手还牵着对方的左手,你写的话他应该能读到(这个还没试过)。这个时候你也把右手撤回的话,那你俩就弦断无声各自天涯了。

其实都是常规问题,随手记叙好习惯!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java socket