`
QING____
  • 浏览: 2234178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Socket问题小结

    博客分类:
  • JAVA
 
阅读更多

1.    Socket(TCP/IP)通讯,需要两端的Socket都持有连接,当Client端去远端connect时(成功之前),首先会bind到本地的一个可用的端口(可以通过socket.bind(InetAddress)来手动指定),可以通过socket.boud()检测是否已经bind成功.

尽管Socket Client端建立连接时bind的端口通常我们不关心,但是这是TCP建立连接的条件.即每个Client建立一次连接,都会导致本地一个端口被"暂时"占用,直到Socket关闭,由此可见Client申请链接的个数也是有极限的.(客户端可以建立的连接数是有限的,65535)

可以通过socket.getPort()获取此socket维持的远端端口,socket.getLocalPort()获取当前socket本地bind的端口;对于serverSocket.accept()获取到的socket,那么其LocalPort即为serverSocket.bind指定的端口.

TCP连接的建立,需要对等端都能有效的维护Socket,双端都明确通讯的port是必须的.Server端需要知道client端的port,因为其需要向client端write数据.

 

参考:http://www.cnblogs.com/doctorqbw/archive/2011/12/13/2286063.html

 

Socket socket = new Socket();
socket.setSoTimeout(20000);
//socket.setTcpNoDelay(true);
socket.connect(new InetSocketAddress(port));//bind本地端口
if (!socket.isConnected()) {
System.out.println("Connect error!");
}
//获知socket的终端的port.
System.out.println("Connected:!RemotePort:" + socket.getPort() + "//LocalPort:" + socket.getLocalPort());
ServerSocket socket = new ServerSocket();
try{
	//socket.setSoTimeout(20000);
    socket.setReuseAddress(true);
    socket.bind(new InetSocketAddress(port));
    Socket accept = null;
    while ((accept = socket.accept()) != null) {
        accept.setTcpNoDelay(true);
		//客户端连接接收成功,那么此时Socket可以获取client端的端口,以及本机bind的端口
        System.out.println("Connected Server!RemotePort:" + accept.getPort() + "//LocalPort:" + accept.getLocalPort());
}
}catch (Exception e) {
    e.printStackTrace();
}finally{
	socket.close();
}

 

 

标记一个socket的通讯,通过组合"remote address" + "remote port" + "local port" + "local address"来唯一标记一个TCP连接,因此server端只需要一个端口,可以接受大量的链接请求(上诉四个组合中,对于server端socket而言,remote address + remote port组合的数量具有不确定性).但是对于客户端一个socket只能和一个server中断连接(上述四个组合值都是确定性的.),client端一个port只能维持一个连接.并非请求可以无限增长,因为每个链接就意味着一个IO文件描述符被打开.Server端的端口,即时serverSocket侦听连接的端口,也是数据传输的端口.

 

2.   理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭 连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客 户端交互,最终确定断开) 

 

3.    Socket中对TPC选项KEEP_ALIVE的设置,keepAlive经常用户连接需要被"维护为"长连接方式.TCP-socket两端都可以设置此值,其中设置为true的一端(或2端)负责维护连接的存活性.KeepAlive参数在高并发高/吞吐量/连接周期较短的应用中,应该被关闭,否则会因为其他原因导致socket没有关闭的情况下,仍然在消耗系统资源.在Socket上长时间没有write操作(以及read)时,socket将意识不到远端的连接是否还有效,如果此时调用write,将会发现连接已经被关闭.为了避免这种事情,KeepAlive为true的一端,keepAlive就是在一短时间空闲后,有一端主动发送"探测"数据包,如果数据包被接收,则表示连接仍然存活(且维持为存活),否则多次探测仍没有得到回应,此时socket将被异常关闭.

KeepAlive一旦开启,维持活性的一端,此socket将不会被轻易销毁,直到远端关闭位置.所以keepAlive对于维护端是一种性能上的开支.(长期占用资源,以及探测)

 

Socket两端只要有一端Close,那么另一端尝试去write将会抛出"connection error",尝试去read将会被无限阻塞.因为任何一端socket.close,都将导致底层TCP连接断开.

分享到:
评论

相关推荐

    SOCKET编程小结

    SOCKET编程小结

    TCP SOCKET用法小结v1.1.doc

    socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解socket了。网络的 socket数据传输是一种特殊的I/O,socket也是一种文件描述符。socket也具有一个类似于打开...

    Java Socket通信小结

    简单的群聊实现 博文链接:https://hnulanwei.iteye.com/blog/2219591

    socket编程小文档

    关于socket编程的基础知识的小结。。

    Delphi Socket 通信编程要点小结

    在项目实践中总结的一些要点,其中有些也是通信行业SOCKET通信程序设计的不成文标准。专门开发以电信业务为核心的通信类软件,所以本人在这方面是相当有经验的,其中许多的经验已经成为“定式”

    C# socket 框架例程

    本文介绍的EMTASS 2.0 是笔者一段工作的总结,也是学习基于.NET的类设计、组件设计、模式设计等的一个小结。笔者的目标就是不断修改和完善,设计与实现一个可靠与稳定的、有良好可扩展性的和易于使用的Socket数据包...

    C语言中socket相关网络编程函数小结

    主要介绍了C语言中socket相关网络编程函数小结,是C语言入门学习中的基础知识,需要的朋友可以参考下

    php使用socket调用http和smtp协议实例小结

    主要介绍了php使用socket调用http和smtp协议,结合实例形式总结分析了php使用socket发送http请求、post请求、SMTP请求、邮件发送等相关操作技巧,需要的朋友可以参考下

    精通Windows Sockets网络开发:基于Visual C++实现-带源码

    1.6小结 第2章tcp/ip简介 2.1开放系统互连参考模型 2.2tcp/ip协议概述 2.2.1tcp/ip模型 2.2.2udp 2.2.3tcp 2.2.4端口 2.3小结 第3章windows sockets基础 3.1windows sockets 3.1.1应用程序与windows sockets的关系 ...

    使用Python对IP进行转换的一些操作技巧小结

    Python Socket模块中包含一些有用IP转换函数,说明如下: socket.ntohl(x) // 类似于C语言的ntohl(x) 把32位正整数从网络序转换成主机字节序。 socket.ntohs(x) // 类似于C语言的ntohs(x) 把16位正整数从网络序...

    网络编程课程设计报告-Android-Socket-聊天室.doc

    六、小结 通过对Android Socket聊天室软件的开发,让我们对java的相关知识有了更深刻的理解,而且让我们的 java编程能力得到了很好的锻炼。同时,我们组齐心协力共同完成了Android Socket聊天室软件的开发,这使得...

    go语言web编程

    1.5. 小结 2.Go语言基础 2.1. 你好,Go 2.2. Go基础 2.3. 流程和函数 2.4. struct 2.5. 面向对象 2.6. interface 2.7. 并发 2.8. 小结 3.Web基础 3.1 web工作方式 3.2 Go搭建一个简单的web服务 3.3 Go如何使得web...

    HTML5用户指南

     小结 第2章 文本  构造主要内容区域  添加博客帖子和评论  使用html 5大纲  理解wai-aria  更多新结构  重新定义的元素  全局属性  本书中没有介绍的功能  小结 第3章 表单  我们爱html,现在它反过来...

    python在windows和linux下获得本机本地ip地址方法小结

    python的socket包含了丰富的函数和方法可以获得本机的ip地址信息,socket对象的gethostbyname方法可以根据主机名获得本机ip地址,socket对象的gethostbyname_ex方法可以获得本机所有ip地址列表 第一种方法:通过...

    Java CP/IP Socket编程

    5.6.4 Selector小结..........144 5.7 数据报(UDP)信道..........144 5.8 练习..........149 1. 使用定长的写缓冲区改写TCPEchoClientNonblocking.java。..........149 2.使用Buffer和DatagramChannel编写一个...

    TCPIP详解--共三卷

    1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU...

    Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】

    from socket import * #创建套接字 serSocket = socket(AF_INET, SOCK_STREAM) #重复使用绑定信息 serSocket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) localAddr = ('', 7788) #绑定端口ip serSocket.bind...

    linux服务器中的远程访问问题小结

    在php程序中运用fopen或者socket的时候,报一下错误: php_network_getaddresses: getaddrinfo failed: Temporary failure in name。 我的代码如下 $handle = fopen(“http://www.baidu.com/”, “r”); ...

Global site tag (gtag.js) - Google Analytics