`

Socket 编程原理小结

 
阅读更多

Socket server 和 client 通信流程图:

Socket三次握手连接图:

Socket 四次握手断开连接图:  

Socket套接字:

  Socket 提供了在主机之间传递原始字节的功能,以比较底层的方式访问tcp/ip协议层,可以在类似的文件i/o的方式实现这一功能。

 

Flush/刷新

  如果向一个Socket 写入数据,通常需要调用Flush 方法去把这个数据发送到网络。如果操作失败,可能由于完整的请求未曾发送成功而导致持续等待响应,如果使用稳定的数据流方式,不需要调用flush方法,因为数据流把先前的数据发送到了网络。

 

Blocking Read /读堵塞

  由socket读取数据时,如果使用堵塞的读操作,可能会导致永久的等待。Socket的setSotimeOut方法控制了超时的期限,在socket连接失败的情况下,读取数据的操作最终会被停止。

 

这种情况通常发生以下几种情况:

    1:本地关闭socket

    2:远程主机/终端发送了断开连接的信号;

    3:tcp协议实现在尝试多次重发数据仍无法获取的对方针对已发数据包的确认信息,或者无法获取得keep_alive的信息(如果tcp协议的keep-alive选项已经被启用)。另外不要和http协议的keep_alive参数相混淆(http的keep-alive选项是指客户端和服务器之间建立有效的长连接,避免重复建立连接的消耗,尤其对提供静态资源访问的网站能够很大的提高访问效率)

 

Timeouts/超时

 

  Socket 的java实现接口提供了setSoTimeout方法设置,希望等待完成读取操作的时间期限,提供了setSoLinger方法控制关闭等待期限(等待尚未发送的数据,然后关闭连接)。当一方关闭连接时,另外一方仍会在读取到缓冲区中的通知关闭连接数据以后关闭连接(理解存在误差)setSoTimeout 和对方发送响应数据是否超时有关和对方何时接受数据无关。

 

KeepAlive/探测连接包

  当网络繁忙的时候,tcp/ip无法发送数据包,如果没有设定socket 的setKeepalive(true),我们无法获悉一个连接是否已经关闭除非师徒再次进行发送操作(或者进行某些接受操作)。Java通过设定socket的setKeepalive为true的方式要求tcp/ip协议进行心跳检测,不需要发送任何数据包或者应用级别的编程。然而不幸的是我们不知道tcp/ip协议以怎样的频率发送心跳探测信号,如果另一方无法及时响应,当你师徒进行读取操作的时候就会产生socket的异常,心跳包使双方都能获知对方是否保持连接,心跳包只是一个普通的tcp/ip的ack报文不需要搭载任何的其他数据.

 

  当应用处于闲暇状态的时候,你的而应用可以剪短的向彼此发送晓得心跳信息,接受者可以完全忽视他们,但是他们强制tcp/ip协议去核实另一方是否存活,这不是tcp/ip协议通信规范的一部分,你需要建立自己的心跳协议,然而使用socket内置的setkeepalive方法去要求tcp/ip进行心跳探测不使用任何数据包或者应用级别的编程实现看起来更加容易一些,每个终端只需间歇的发送一个包含当前些列的空的数据包,确认信息和滑动口号就可以了。

 

  应用级别的心跳有点在于他们能够使你了解两端的应用都是否存活,而不在于只是通信软件。

 

  我们知道,TCP有一个连接检测机制,就是如果在指定的时间内(一般为2个小时)没有数据传送,会给对端发送一个Keep-Alive数据报,使用的序列号是曾经发出的最后一个报文的最后一个字节的序列号,对端如果收到这个数据,回送一个TCP的ACK,确认这个字节已经收到,这样就知道此连接没有被断开。如果一段时间没有收到对方的响应,会进行重试,重试几次后,向对端发一个reset,然后将连接断掉。

  在Windows中,第一次探测是在最后一次数据发送的两个小时,然后每隔1秒探测一次,一共探测5次,如果5次都没有收到回应的话,就会断开这个连接。但两个小时对于我们的项目来说显然太长了。我们必须缩短这个时间。

 

  还有我发现我使用这API有点误用,因为getKeepAlive()的作用是返回:指示是否启用?SO_KEEPALIVE?的?boolean?值。这明显不是我的本意,看来我只能自己写心跳包了,各路英雄好汉,你们有什么好的办法吗?

 

客户端Socket

  Socket socket = new Socket();

  SocketAddress remoteAddr = new InetAddress(“192.168.137.155”,8080);

  Socket.connet(remoteAddr,60000);//等待建立连接的超时时间为1分钟;

 

  这里做一个解释:连接到IP是192.168.137.155机器上监听8080端口的服务器程序,等待连接的最长时间为1分钟。如果一分钟内连接成功则connet()方法顺利返回。如果一分钟内出现某些异常,则抛出异常 SocketTimeOutException

 

客户端连接服务器可能抛出的异常:

 

  当Socket的构造方法请求连接服务器时,可能抛出一下异常:

 

    1:UnKnownHostException :无法识别主机的名字或者IP地址,就会抛出这种异常。

    2:ConnectException :没有指定的端口或者服务器进程禁止连接,就会抛出何种异常;

    3:SocketTimeoutException :等待连接超时,

    4:BindException 无法把scoket对象与指定IP和port进行绑定

 

获取Socket 信息

  在一个Socket对象中同时包含了远程服务器的IP地址和端口信息,以及客户本地的IP地址和端口信息,此外,从Socket对象中还可以获得输出流和输入流,分别用于向服务器发送数据,以及接受从服务器发来的数据,一下方法用于获取socket的有关信息:

    1:getInetAddress(): 获取远程服务器的IP地址

    2:getPort():获取远程服务器的端口

    3:getLocalAddress():获取客户端本地的IP地址;

    4:getLocalPort():获取本地Port

    5:getInputStream():获取输入流

    6:shutdownInputStream():关闭输入流,此方法会抛出IOExceptin

    7:getOutputStream():获取输出流

    8:shutdownOutputStream():关闭输出流

 

Socket 类提供了三个状态测试方法:

    1:isClosed()是否已经关闭

    2:isConnected():是否已经连接上

    3:isBound():是否绑定一个端口

  • 大小: 22.6 KB
  • 大小: 13.4 KB
  • 大小: 13.9 KB
分享到:
评论

相关推荐

    socket编程原理[总结].pdf

    Socket编程原理是软件开发中涉及网络通信的重要技术,尤其在分布式系统和互联网应用中不可或缺。在UNIX系统中,Socket作为网络应用编程接口,为开发者提供了一种通用的机制来处理多种网络协议,使得进程间(无论是...

    Linux socket编程原理

    ### Linux Socket编程原理详解 #### 一、引言 Socket编程是现代计算机网络通信的核心技术之一,尤其是在基于Linux的操作系统中。它为不同主机上的进程提供了高效、灵活且可靠的通信手段。本文旨在深入探讨Linux...

    实验一_SOCKET编程实验

    本实验旨在帮助学生深入理解SOCKET编程的概念、原理及其实现过程,以便于掌握网络通信的核心技术。 **1. SOCKET编程基础** SOCKET是操作系统提供的接口,它为应用层提供了访问传输层服务的能力。在TCP/IP协议栈中...

    socket编程原理.pdf

    Socket编程是计算机网络中进程间通信的重要方法,尤其在分布式系统和互联网应用中扮演着核心角色。在UNIX系统中,Socket API是实现TCP/IP协议族的主要...理解和掌握Socket编程原理,对于开发和维护网络应用至关重要。

    [精华] socket编程原理.doc

    总结来说,socket编程原理是理解网络通信的关键,它提供了一种标准的、通用的接口,使得进程可以通过网络进行交互。无论是开发服务器程序还是客户端应用,掌握socket编程都能极大地提升开发效率和应用的可靠性。通过...

    socket编程原理

    ### Socket编程原理详解 #### 一、Socket编程基础概述 Socket编程是计算机网络通信中的一种基本方式,它基于TCP/IP协议栈实现数据在网络中的传输。Socket可以被理解为应用程序与网络之间的接口,通过这个接口,...

    socket编程原理及计算机网络协议

    ### Socket编程原理及计算机网络协议 #### 一、Socket编程概览 在计算机网络中,Socket编程是一项核心技能,它允许程序通过网络进行通信。在深入探讨Socket编程之前,我们首先需要了解它背后的一些基本概念。 ###...

    Socket编程例子

    总结,Socket编程是构建网络应用的基础,理解其工作原理和操作步骤对开发者来说至关重要。通过"TestSocket"这个例子,你可以更深入地学习如何在实际项目中运用Socket,从而实现跨网络的高效通信。

    socket编程实验报告

    通过实验,不仅加深了对Socket编程原理的理解,还锻炼了实际编程和问题解决的能力。无论是C++还是Java,实现Socket通信都需要对TCP/IP协议有深入的理解,以及对操作系统网络编程接口的熟练运用。 总的来说,Socket...

    socket 编程原理和实现

    Socket编程是计算机网络中应用层与传输层之间的...理解Socket编程的基本原理和步骤,对于开发基于网络的应用至关重要。通过学习和实践,开发者可以熟练掌握这一核心技术,为各种分布式系统和互联网应用提供坚实的基础。

    socket编程 socket编程

    Socket编程是计算机...总结,Socket编程是网络编程的基础,无论是TCP还是UDP,都需要理解其工作原理并熟练掌握相关API的使用。通过Socket编程,开发者可以构建出功能强大的网络应用程序,实现不同设备间的高效通信。

    socket编程实验报告1

    【socket编程实验报告1】 本实验报告探讨了一个基于Python3实现的简单聊天系统,系统主要由服务器和用户程序两部分组成。系统利用socket库进行网络通信,通过多线程技术来处理并发连接,确保服务器的稳定性和安全性...

    socket 编程 网络编程资料大全 给力

    网络通信协议,网络通信基础知识,socket网络编程的一些基础知识,Socket网络编程学习笔记,网络编程总结,2011-学习资料大全:java_socket编程,学习网络编程的十个步骤,socket编程入门(经典版),Unix_网络编程...

    Socket编程简单例子

    总结一下,这个“Socket编程简单例子”涵盖了以下知识点: 1. Socket的基本原理和作用 2. 在Android客户端创建Socket连接 3. 数据传输:客户端发送和服务器接收 4. 服务器端的请求处理与响应 5. 客户端接收服务器...

    Linux socket 编程入门

    总结起来,Linux Socket编程入门的关键在于理解网络通信的基本原理和TCP协议的特点,然后利用套接字API实现服务器端和客户端的交互。通过创建一个简单的echo服务器,我们可以更好地理解TCP服务器的工作流程,为...

    c语言SOCKEt编程指南.pdf

    ### C语言SOCKET编程指南知识点概述 ...以上是对《C语言SOCKET编程指南》中的知识点进行了详细的总结和解释,旨在为初学者提供一个全面而深入的理解框架,帮助他们更好地掌握Socket编程的核心概念和技术细节。

    三步学会Java_Socket编程

    总结来说,Java Socket编程涉及网络通信的基本原理和Java I/O流的使用。通过理解Socket的概念,掌握ServerSocket和Socket的关键API,以及实践Server-Client模型,就能基本掌握Java Socket编程。在实际项目中,还需要...

    C语言Socket简单编程指南

    C语言Socket编程是网络编程中的一项重要技术,它允许程序之间通过网络进行通信。Socket编程通常涉及到了解套接字(Socket)的基本概念、网络理论、各种网络编程函数以及如何处理IP地址等问题。以下是从提供的文件...

Global site tag (gtag.js) - Google Analytics