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
- java的socket-tcp编程中需要注意的东西
- java中需要注意的东西(一)
- java中需要注意的东西(二)
- 需要注意的东西
- 关于Java的TCP编程中需要注意的一些坑,因为我踩过
- 上线中需要注意的东西
- 移动工作中需要注意的东西
- css中浮动需要注意的东西
- java上需要注意的东西!
- Android 系统中 socket 编程需要注意的
- socket编程需要注意的问题
- 需要注意的东西记录
- Java编程中那些需要注意的细节
- ListView中使用type需要注意的东西
- angularjs中使用ng-repeat需要注意的东西
- Java网络编程:TCP的socket编程
- 编程中需要注意的细节
- 编程题中需要注意的问题
- RecyclerView之ItemDecoration
- X-Ways WinHex 19.0 SR-6 x64 Multilingual
- 利用边框当碰撞框--boundingBox()的使用
- jq 饼状分析图
- [后缀数组]poj1743 Musical Theme
- java的socket-tcp编程中需要注意的东西
- jsp子页面(iframe)获取父页面(在另一个页面中用iframe)元素的方法
- Android studio中TextView改变字体的两种方式(如仿宋、隶书)
- 是从第一次发,不会割
- 读取文件中出现次数最多的字符串
- 蓝桥杯算法训练 未名湖边的烦恼
- Android studio 提示 setup sdk
- MySQL入门之动态SQL工具实现
- LoRaWAN介绍9 安全