`

JAVA实现SOCKET短连接[转]

阅读更多

先简单说概念: 1、socket就是TCP/IP实现的套接字,就是应用层调用下层服务的接口。

2、短连接指的是连接建立后,双方进行数据交互(通常是一个数据包,也可以是多个),交互完毕后立即关闭连接的TCP/IP实现方式就是常说的短连接,最常见的短连接例子就是HTTP协议。

3、长连接则指的是双方交互完毕后,不关闭连接,而让连接一直空闲着等待下一次交互,这样在一次交互前就免去了再重新建立连接的消耗,本机测试一次socket连接需要耗时23毫秒。

优点就是性能好。缺点有二,一是实现方式比较复杂,需要单独用线程收,发倒是无所谓;二是需要增加链路检测的机制,由于连接在空闲时双方都无法确认对端是否出现异常退出,因为根据TCP/IP,如果连接的一方正常退出,对端都会收到一个信号,而当一方异常退出时,对端是无法收到信号的,这时就会出现connection reset、connection reset by peer和broken pipe异常。

接下来说说JAVA如何实现短连接。一、先来看发送到方法,这个比较简单。直接获得socket的OutputStream流,然后用write方法,flush方法即可。这里要说明的就是,之前认为使用flush方法在底层就是一个TCP包,其实不然,上层何时按照上面策略封装TCP包上层根本无法知道,经过测试可知,下层封装的TCP包大小与flush无必然联系。这里有个参数可以设置,就是sock.setTcpNoDelay(true),如果设置为true,则对于缓冲区不进行拼接,立即发送。这里涉及nagle算法,用于解决小封包问题,感兴趣的朋友可以自己baidu。

二、接收时有多种方式。常用的两个类是InputStream和BufferedInputStream,下面简单说一下我看JDK的理解。这里的两个类都是阻塞的读取数据。

1、InputStream的read(byte[] b,offset,len)方法是直接从流中一个一个read()出来扔到b中的。此方法阻塞到某个事件发生,例如异常、超时、正常收到一个封包。要理解阻塞,就一定要理解好这里的事件退出,异常就不用解释了,比如对方异常关闭连接了;超时就是如果你手工设置了超时时间,当超时时间到时还没能从连接中读到任何数据,此时抛出一个Read Time Out异常;最后一个最难理解,就是从连接中读到一个数据包,此时不管数据包大小是否达到len大小,此方法都可以正常返回,当封包大于len时,只读取len长的数据,这也是它与BufferedInputStream的区别,此时方法结束。

2、BufferedInputStream的read(byte[] b);直接调用了父类InputStream的read(byte[] b,offset,len)方法,不推荐使用,因为其实并没有用到Buffer功能;

3、BufferedInputStream的read(byte[] b,offset,len);覆写了父类的方法,方法中用到了read1(byte[] b,offset,len)方法,read1方法中,如果缓冲数组中有数据则直接返回数据,如果缓冲队列中无数据则直接调用InputStream的read(byte[] b,offset,len)方法。可以得到一下推论,如果我调用了read(byte[] b,offset,len)方法,则将第一个封包所有内容全部缓冲到Buffer中,如果第一个封包大于Buffer,则先读取buffer大小的长度到buffer中,如果第一个封包小于Buffer,则全部读取到Buffer中。调用read(byte[] b,offset,len)方法时,如果len小于buffer大小则不用等待IO,直接从buffer中读取,免去IO等待。这里推荐用此方法。

4、BufferedInputStream 的available()方法返回当前不阻塞就能读到的数据。

 

分享到:
评论

相关推荐

    Java实现Socket长连接和短连接

    综上所述,Java实现Socket长连接和短连接涉及网络通信基础、连接管理、异常处理等多个方面,开发者需要根据实际需求权衡选择合适的方式。通过深入理解这些概念和技术,可以有效地优化网络服务,提升应用的性能和用户...

    socket长连接demo

    在Java中,我们通常通过`java.net.Socket`和`java.net.ServerSocket`类来实现Socket编程。以下是一些关键知识点: 1. **创建ServerSocket**:首先,服务器端需要创建一个`ServerSocket`对象,监听指定端口,等待...

    java socket

    Java实现Socket长连接和短连接的关键在于何时关闭Socket。在长连接中,通常需要设置合适的超时时间,并在超时后或者通信异常时关闭Socket;而在短连接中,通常在数据传输完成后立即关闭Socket。 以下是一个简单的...

    java编写socket服务端和客户端给予cmpp3.0

    Java 编写基于 CMPP3.0 的 Socket 服务端和客户端是移动通讯领域中常见的技术实践,主要用于实现与移动运营商的短信网关进行数据交互。CMPP(China Mobile Short Message Peer-to-Peer)是中国移动制定的一种短消息...

    Socket长连接demo

    实现Socket长连接的关键步骤包括: 1. **建立连接**:客户端通过调用`socket()`函数创建一个Socket对象,然后使用`connect()`函数连接到服务器端的指定端口。服务器端通过`socket()`和`bind()`绑定端口,再用`...

    socket通信,mina长连接通信

    2. **长连接**:与传统的Socket短连接不同,长连接保持在客户端和服务器之间长时间打开,避免了频繁的连接和断开,适用于需要持续交互的应用,如实时推送服务。 3. **MINA API**:MINA提供了一系列接口,如`...

    java Socket实现聊天程序

    当用户聊天时,将当前用户名、聊天对象、聊天内容、聊天语气和是否私聊进行封装,然后与服务器建立Socket连接,再用对象输出流包装Socket的输出流将聊天信息对象发送给服务器端 当用户发送聊天信息时,服务端将会...

    java socket 经典教程

    - 对于频繁的短连接,可以考虑使用连接池来提高性能。Java的`java.sql.DriverManager`就提供了连接池的支持,但需要第三方库如Apache Commons Pool来实现Socket连接池。 9. **SSL/TLS安全通信** - Java提供`SSL...

    基于java实现Socket套接字一对一聊天系统源码+项目说明.zip

    基于java实现Socket套接字一对一聊天系统源码+项目说明.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者...

    Java基于Socket文件传输示例

    Java基于Socket文件传输示例是一种常见的网络编程应用场景,主要用于实现两个网络节点间的文件共享和交换。Socket编程是Java网络通信的基础,它提供了低级别的、面向连接的、双向的数据传输通道。在这个示例中,我们...

    Socket连接池的简单应用

    在深入探讨Socket连接池之前,我们需要了解两种基本的Socket连接方式:长链接和短链接。 ##### 2.1 长链接(Long Connection) 长链接是指当数据发送完成后,Socket连接并不会立即断开,而是保持连接状态直到发生...

    利用socket连续发送与连续接收数据

    在IT领域,网络编程是不可或缺的一部分,而Socket编程则是实现网络通信的基础。本文将深入探讨如何利用Socket进行连续发送与连续接收数据,基于标题“利用socket连续发送与连续接收数据”以及描述中提到的实现过程。...

    socket连接.zip

    1. **Socket短连接**:短连接通常是一次性的,即客户端与服务器建立连接,完成数据传输后立即关闭连接。在Java中,这涉及到`Socket`对象的创建、连接、读写数据以及最后的关闭。短连接适用于一次性或低频率的数据...

    web_socket java版实时聊天室

    - `Web Socket Server`:这是一个可能的Java WebSocket服务器实现,包含处理WebSocket连接、解析和响应消息的逻辑。 综合上述信息,我们可以理解这是一个使用HTML5 WebSocket和Java技术构建的实时聊天室示例,包含...

    java Socket 长链接拔网线检测

    在Java中,Socket基于TCP协议实现,提供面向连接的、可靠的字节流服务。一旦客户端和服务端建立连接,就会保持该连接直到一方主动关闭。长连接的实现主要是通过设置Socket的超时时间,并且在每次读写操作后检查连接...

    Java实现的点对点短消息发送源码

    本文将深入探讨如何使用Java实现点对点(P2P)短消息发送系统,主要基于提供的标题和描述。 点对点通信是指两个或多个设备之间直接交换数据,无需通过中央服务器。在短消息发送场景下,这种模式可以降低对中心节点...

    Mina+Socket通信

    在Java中,`java.net.Socket` 和 `java.net.ServerSocket` 类是实现TCP通信的基础。Socket通信的基本步骤包括:创建ServerSocket,等待客户端连接,创建Socket对象,通过输入/输出流进行数据交换,最后关闭连接。 ...

    java实现流量控制流量控制

    总结来说,Java实现流量控制涉及多方面,包括基本的Socket缓冲区设置、NIO的选择器和通道、自定义协议以及线程管理和第三方库的支持。开发者可以根据实际需求选择合适的方法来实现流量控制,确保网络通信的稳定性和...

    Java实现的点对点短消息发送协议(smpp)开发包源码.rar

    Java实现的SMPP开发包源码为我们提供了理解和构建基于Java的短信发送系统的基础。这个开发包通常包含客户端和服务器端的实现,以及必要的工具和类库,用于处理SMPP连接、会话管理和消息传输。 1. **SMPP协议基础**...

    cmpp2.0 java实现

    1. 连接管理:使用Java的Socket或NIO(非阻塞I/O)建立与CMPP网关的连接,确保网络通信的可靠性。 2. 数据编码:CMPP协议采用GB2312编码,需要对字符串进行正确编码和解码,以避免乱码问题。 3. 报文结构:理解并...

Global site tag (gtag.js) - Google Analytics