Socket相关知识

简介:

Socket相关知识

     所谓socket通常也称作"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。 以Java为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例, 操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

     常用的Socket类型有两种:流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。 

1、socket通信方式

     socket通信方式主要有以下三大类:

     (一)SERVER/CLIENT方式

     1.一个Client方连接一个Server方,或称点对点(peer to peer):
     2.多个Client方连接一个Server方,这也是通常的并发服务器方式。
     3.一个Client方连接多个Server方,这种方式很少见,主要用于一个客户向多个服务器发送请求情况。
 
     (二)连接方式
     1.长连接
     Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。这种方式下由于通讯连接一直存在,可以用下面命令查看连接是否建立:
     netstat –f inet|grep 端口号(如5678)。
     此种方式常用于点对点通讯。

     2.短连接
     Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.
     (三)发送接收方式
     1.异步
     报文发送和接收是分开的,相互独立的,互不影响。这种方式又分两种情况:
     (1)异步双工:接收和发送在同一个程序中,有两个不同的子进程分别负责发送和接收
     (2)异步单工:接收和发送是用两个不同的程序来完成。
     2.同步
     报文发送和接收是同步进行,既报文发送后等待接收返回报文。同步方式一般需要考虑超时问题,即报文发上去后不能无限等待,需要设定超时时间,超过该时间发送方不再等待读返回报文,直接通知超时返回。

     实际通信方式是这三类通信方式的组合。比如一般书上提供的TCP/IP范例程序大都是同步短连接的SERVER/CLIENT程序。有的组合是基本不用的,比较常用的有价值的组合是以下几种:
     同步短连接Server/Client
     同步长连接Server/Client
     异步短连接Server/Client
     异步长连接双工Server/Client
     异步长连接单工Server/Client
     其中异步长连接双工是最为复杂的一种通信方式,有时候经常会出现在不同银行或不同城市之间的两套系统之间的通信。
2.socket报文处理方式
     socket通信报文格式多样,因此也必须设计对应的读写报文的接收和发送报文函数。
     (一)阻塞与非阻塞方式 
     1.非阻塞方式
     读函数不停地进行读动作,如果没有报文接收到,等待一段时间后超时返回,这种情况一般需要指定超时时间。
     2.阻塞方式
     如果没有报文接收到,则读函数一直处于等待状态,直到有报文到达。
     (二)循环读写方式
     1.一次直接读写报文
     在一次接收或发送报文动作中一次性不加分别地全部读取或全部发送报文字节。
     2.不指定长度循环读写
     这一般发生在短连接进程中,受网络路由等限制,一次较长的报文可能在网络传输过程中被分解成了好几个包。一次读取可能不能全部读完一次报文,这就需要循环读报文,直到读完为止。
     3.带长度报文头循环读写
     这种情况一般是在长连接进程中,由于在长连接中没有条件能够判断循环读写什么时候结束,所以必须要加长度报文头。读函数先是读取报文头的长度,再根据这个长度去读报文.实际情况中,报头的码制格式还经常不一样,如果是非ASCII码的报文头,还必须转换成ASCII,常见的报文头码制有:
     (1)n个字节的ASCII码
     (2)n个字节的BCD码
     (3)n个字节的网络整型码
     以上是几种比较典型的读写报文方式,可以与通信方式模板一起预先提供一些典型的API读写函数。当然在实际问题中,可能还必须编写与对方报文格式配套的读写API。在实际情况中,往往需要把我们自己的系统与别人的系统进行连接,有了以上模板与API,可以说连接任何方式的通信程序都不存在问题。

3、SOCKET连接过程

     根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。 

     服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。  

     客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
  
     连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套 接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

系统特殊要求说明
     系统采用的是同步短连接Server/Client方式,无论Server还是client在报文处理方式上,都采用一次直接读写报文+阻塞方式。通信由Client主动发起,一次性发送报文给Server后,主动关闭Socket输出,服务器收到Client的关闭输出响应后,停止socket输入,并开始处理业务,生成响应报文返回客户端。

     服务器处理流程如下:


     对于连入的客户端,服务器要求其设置连接超时时间、并在输入数据完成后,主动停止输出流;如果客户端没有主动停止输出流,则直到连接超时或者关闭输入流、输出流和socket时 服务器 才会返回数据。在Java中,主动停止输出流的函数为socket.shutdownOutput()。

各类语言客户端关闭输入输出流函数说明


1、C语言

int shutdown(int socket,int how)
 
函数说明  shutdown()用来终止参数s所指定的socket读取或者传输操作,参数how有下列几种情况: 
how=0 终止读取操作。 
how=1 终止传送操作 
how=2 终止读取及传送操作 

2、php语言
boolean socket_shutdown(resource socket, integer how)
socket_shutdown函数关闭一个socket的输入输出。设置how为0则中止接受数据,设置为1则停止发送数据,设置为2则中止二者操作。

3、LoadRunner的Socket协议语言

int lrs_disable_socket ( char *s_desc, int operation );
lrs_disable_socket函数关闭一个socket的输入输出。设置operation为SEND则中止接受数据,设置为RECEIVE则停止发送数据,设置为SEND-RECEIVE则中止二者操作。


4、Java语言

socket.shutdownInput():关闭Socket的输入流;
socket.shutdownOuput():关闭Socket的输出流。





     本文转自 cuiyingfeng 51CTO博客,原文链接: http://blog.51cto.com/cuiyingfeng/599825 ,如需转载请自行联系原作者
相关文章
|
9月前
|
网络协议 Unix 程序员
socket到底是什么?
socket到底是什么?
60 1
|
9月前
|
网络协议 安全 前端开发
socket到底是什么? 2
socket到底是什么?
85 0
|
网络协议
【Socket】实现MiniHttpServer
【Socket】实现MiniHttpServer
|
移动开发 缓存 网络协议
Socket总结
Socket总结
177 0
Socket总结
|
网络协议 Unix
一切皆Socket
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。 ——有感于实际编程和开源项目研究。   socket()函数介绍 socket函数介绍 函数原型 domain type protocol errno 示例   函数原型 socket()函数的原型如下,这个函数建立一个协议族为domain、协议类型为type、协议编号为protocol的套接字文件描述符。
1438 0
|
网络协议 Unix API
|
Unix Python 网络协议

热门文章

最新文章