socket传输协议.docx
《socket传输协议.docx》由会员分享,可在线阅读,更多相关《socket传输协议.docx(9页珍藏版)》请在冰豆网上搜索。
![socket传输协议.docx](https://file1.bdocx.com/fileroot1/2022-11/26/66ff1ddb-47a0-473b-9a6c-dfc675632206/66ff1ddb-47a0-473b-9a6c-dfc6756322061.gif)
socket传输协议
竭诚为您提供优质文档/双击可除
socket传输协议
篇一:
socket开发之通讯协议及处理
socket开发之通讯协议及处理
在socket应用开发中,还有一个话题是讨论的比较多的,那就是数据接收后如何处理的问题。
这也是一个令刚接触socket开发的人很头疼的问题。
因为socket的tcp通讯中有一个“粘包”的现象,既:
大多数时候发送端多次发送的小数据包会被连在一起被接收端同时接收到,多个小包被组成一个大包被接收。
有时候一个大数据包又会被拆成多个小数据包发送。
这样就存在一个将数据包拆分和重新组合的问题。
那么如何去处理这个问题呢?
这就是我今天要讲的通讯协议。
所谓的协议就是通讯双方协商并制定好要传送的数据的结构与格式。
并按制定好的格式去组合与分析数据。
从而使数据得以被准确的理解和处理。
那么我们如何去制定通讯协议呢?
很简单,就是指定数据中各个字节所代表的意义。
比如说:
第一位代表封包头,第二位代表封类型,第三、四位代表封包的数据长度。
然后后面是实际的数据内容。
如下面这个例子:
前面三部分称之为封包头,它的长度是固定的,
第四部分是封包数据,
它的长度是不固定的,由第三部分标识其长度。
因为我们的协议将用在tcp中,所以我没有加入校验位。
原因是tcp可以保证数据的完整性。
校验位是没有必要存在的。
接下来我们要为这个数据封包声明一个类来封装它:
1publicclassmessage
2{
3privatebyte_class;
4privatebyte_flag;
5privateint_size;
6privatebyte[]_content;
7
91011{get{return_content;}set{_content=value;}12}1314publicintsize151617{get{return_size;}set{_size=value;}18}
19
20publicbyteFlag
21
22
23{get{return_flag;}set{_flag=value;}
24}
25
26publicbyteclass
27
28
29{get{return_class;}set{_class=value;}
30}
31
32publicmessage()
33
34
35}
36
37publicmessage(byte@class,byteflag,byte[]content)
38{{
39_class=@class;
40_flag=flag;
41_size=content.length;
42_content=content;
43}
44
46{47byte[]_byte;48using(memorystreammem=newmemorystream())49{50binarywriterwriter=newbinarywriter(mem);51writer.write(_class);52writer.write(_flag);53writer.write(_size);54if(_size>0)
55{
56writer.write(_content);
57}
58_byte=mem.toarray();
59writer.close();
60}
61return_byte;
62}
63
64publicstaticmessageFrombytes(byte[]buffer)
65{
66messagemessage=newmessage();
67using(memorystreammem=newmemorystream(buffer))
68{
69binaryReaderreader=newbinaryReader(mem);
70message._class=reader.Readbyte();
71message._flag=reader.Readbyte();
72message._size=reader.Readint32();
73if(message._size>0)
74{
75message._content=reader.Readbytes(message._size);76}
77reader.close();
78}
79returnmessage;
80}
8182
}我们可以用tobytes()和Frombytes()将封包转换成二进制数组和从二进制数组转换回来。
事情看起来已经解决了,但真的是这样子吗?
不然,我们知道,tcp数据是以流的形式被传送的,我们并不知道一个数据包是否被传送完毕,也不知道我们接收回来的数据包中是否有多个数据包,如果直接使用Frombytes()来转换的话,很可能会因为数据不完整而出现异常,也有可能会因为数据中含有多个数据包而导致数据丢失(因为你并不知道这些数据中含有多少个数据包)。
那我们该怎么办?
这也不难,我们先把接收回来的数据写入一个流中。
然后分析其中是否有完整的数据包,如果有,将其从流中取出,并将这部分数据从流中清除。
直到流中没有完整的数据为止,以后接收回来的数据就将其写入流的结尾处,并从头继续分析。
直到结束。
让我们来看看这部分的代码:
1publicclassmessagestream
2{
3privatebyte[]_buffer;
4privateint_position;
5privateint_length;
6privateint_capacity;
7
8publicmessagestream()
9{
10_buffer=newbyte[0];
11_position=0;
12_length=0;
13_capacity=0;
14}
15
16privatebyteReadbyte()
17{
18if(this._position>=this._length)
19{20return0;21}22returnthis._buffer[this._position++];23}2425privateintReadint()26{27intnum=this._position+=4;
28if(num>this._length)
29{
30this._position=this._length;
31return-1;
32}
33return(((this._buffer[num-4]|(this._buffer[num-3] 35
36privatebyte[]Readbytes(intcount)
37{
38intnum=this._length-this._position;
39if(num>count)
40{
41num=count;
42}
43if(num 44{
45returnnull;
46}
47byte[]buffer=newbyte[num];
48if(num 49{
50intnum2=num;
51while(--num2>=0)
52{
53buffer[num2]=this._buffer[this._position+num2];54}
篇二:
http、tcpip协议与socket之间的区别
http、tcp/ip协议与socket之间的区别
1、tcp/ip连接手机能够使用联网功能是因为手机底层实现了tcp/ip协议,可以使手机终端通过无线网络建立tcp连接。
tcp协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。
建立起一个tcp连接需要经过“三次握手”:
第一次握手:
客户端发送syn包(syn=j)到服务器,并进入syn_send状态,等待服务器确认;第二次握手:
服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入syn_RecV状态;
第三次握手:
客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=k+1),此包发送完毕,客户端和服务器进入established状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
理想状态下,tcp连接一旦建立,在通信双方中的任何一方主动关闭连接之前,tcp连接都将被一直保持下去。
断开连接时服务器和客户端均可以主动发起断开tcp连接的请求,断开过程需要经过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终确定断开).
2、http连接
http协议即超文本传送协议(hypertexttransferprotocol),是web联网的基础,也是手机联网常用的协议之一,http协议是建立在tcp协议之上的一种应用。
http连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。
从建立连接到关闭连接的过程称为“一次连接”。
1)在http1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。
2)在http1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。
由于http在每次请求结束后都会主动释放连接,因此http连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。
通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道客户端“在线”。
若服务器长时间无法收到
客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。
3、socket原理3.1套接字(socket)概念
套接字(socket)是通信的基石,是支持tcp/ip协议的网络通信的基本操作单元。
它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:
连接使用的协议,本地主机的ip地址,本地进程的协议端口,远地主机的ip地址,远地进程的协议端口。
应用层通过传输层进行数据通信时,tcp会遇到同时为多个应用程序进程提供并发服务的问题。
多个tcp连接或多个应用程序进程可能需要通过同一个tcp协议端口传输数据。
为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与tcp/ip协议交互提供了套接字(socket)接口。
应用层可以和传输层通过socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。
3.2建立socket连接
建立socket连接至少需要一对套接字,其中一个运行于客户端,称为clientsocket,另一个运行于服务器端,称为serversocket。
套接字之间的连接过程分为三个步骤:
服务器监听,客户端请求,连接确认。
服务器监听:
服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。
客户端请求:
指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:
当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。
而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
4、socket连接与tcp/ip连接
创建socket连接时,可以指定使用的传输层协议,socket可以支持不同的传输层协议(tcp或udp),当使用tcp协议进行连接时,该socket连接就是一个tcp连接。
socket则是对tcp/ip协议的封装和应用(程序员层面上)。
也可以说,tpc/ip协议是传输层协议,主要解决数据如何在网络中传输,而http是应用层协议,主要解决如何包装数据。
关于tcp/ip和http协议的关系,网络有一段比较容易理解的介绍:
“我们在传输数据时,可以只使用(传输层)tcp/ip协议,但是那样的话,如果没有应用层,便无法识别数据内容,如果想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有很多,比如http、Ftp、telnet等,也可以自己定义应用层协议。
web使用http协议作应用层协议,以封装http文本信息,然后使用tcp/ip做传输层协议将它发到网络上。
”
我们平时说的最多的socket是什么呢,实际上socket是对tcp/ip协议的封装,socket本身并不是协议,而是一个调用接口(api),通过socket,我们才能使用tcp/ip协议。
实际上,socket跟tcp/ip协议没有必然的联系。
socket编程接口在设计的时候,就希望也能适应其他的网络协议。
所以说,socket的出现只是使得程序员更方便地使用tcp/ip协议栈而已,是对tcp/ip协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。
网络有一段关于socket和tcp/ip协议关系的说法比较容易理解:
“tcp/ip只是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。
这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,tcp/ip也要提供可供程序员做网络开发所用的接口,这就是socket编程接口。
”
实际上,传输层的tcp是基于网络层的ip协议的,而应用层的http协议又是基于传输层的tcp协议的,而socket本身不算是协议,就像上面所说,它只是提供了一个针对tcp或者udp编程的接口。
socket是对端口通信开发的工具,它要更底层一些.
5、socket连接与http连接
由于通常情况下socket连接就是tcp连接,因此socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。
但在实际网络应用中,客户端到服务器之间的通信往往需要穿越多个中间节点,例如路由器、网关、防火墙等,大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致socket连接断连,因此需要通过轮询告诉网络,该连接处于活跃状态。
而http连接使用的是“请求—响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务器端才能回复数据。
很多情况下,需要服务器端主动向客户端推送数据,保持客户端与服务器数据的实时与同步。
此时若双方建立的是socket连接,服务器就可以直接将数据传送给客户端;若双方建立的是http连接,则服务器需要等到客户端发送一次请求后才能将数据传回给客户端,因此,客户端定时向服务器端发送连接请求,不仅可以保持在线,同时也是在“询问”服务器是否有新的数据,如果有就将数据传给客户端。
http协议是应用层的协义
有个比较形象的描述:
http是轿车,提供了封装或者显示数据的具体形式;socket是发动机,提供了网络通信的能力。
两个计算机之间的交流无非是两个端口之间的数据通信,具体的数据会以什么样的形式展现`是以不同的应用层协议来定义的`如http`Ftp`
篇三:
socket协议说明
socket
一socket协议
socket协议的形象描述
socket的英文原义是“孔”或“插座”。
在这里作为4bdsunix的进程通信机制,取后一种意思。
socket非常类似于电话插座。
以一个国家级电话网为例。
电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。
任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。
然后向对方拨号呼叫,相当于发出连接请求(假如对方不在同一区内,还要拨对方区号,相当于给出网络地址)。
对方假如在场并空闲(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。
双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程,相当于向socket发送数据和从socket接收数据。
通话结束后,一方挂起电话机相当于关闭socket,撤消连接。
在电话系统中,一般用户只能感受到本地电话机和对方电话号码的存在,建立通话的过程,话音传输的过程以及整个电话系统的技术细节对他都是透明的,这也与socket机制非常相似。
socket利用网间网通信设施实现进程通信,但它对通信设施的细节毫不关心,只要通信设施能提供足够的通信能力,它就满足了。
至此,我们对socket进行了直观的描述。
抽象出来,socket实质上提供了进程通信的端点。
进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。
正如打电话之前,双方必须各自拥有一台电话机一样。
在网间网内部,每一个socket用一个半相关描述:
(协议,本地地址,本地端口)
一个完整的socket有一个本地唯一的socket号,由操作系统分配。
最重要的是,socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的socket系统调用。
客户随机申请一个socket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个socket号;服务器拥有全局公认的socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。
socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。
服务器socket半相关为全局所公认非常重要。
读者不妨考虑一下,两个完全随机的用户进程之间如何建立通信?
假如通信双方没有任何一方的socket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。
-----
socket接口是访问internet使用得最广泛的方法。
如果你有一台刚配好tcp/ip协议的主机,其ip地址是202.120.127.201,此时在另一台主机或同一台主机上执行ftp202.120.127.201,显然无法建立连接。
因"202.120.127.201"这台主机没有
运行Ftp服务软件。
同样,在另一台或同一台主机上运行浏览软件如netscape,输入"http:
//202.120.127.201",也无法建立连接。
现在,如果在这台主机上运行一个Ftp服务软件(该软件将打开一个socket,并将其绑定到21端口),再在这台主机上运行一个web服务软件(该软件将打开另一个socket,并将其绑定到80端口)。
这样,在另一台主机或同一台主机上执行ftp202.120.127.201,Ftp客户软件将通过21端口来呼叫主机上由Ftp服务软件提供的socket,与其建立连接并对话。
而在netscape中输入"http:
//202.120.127.201"时,将通过80端口来呼叫主机上由web服务软件提供的socket,与其建立连接并对话。
在internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。
每种服务都打开一个socket,并绑定到一个端口上,不同的端口对应于不同的服务。
socket正如其英文原意那样,象一个多孔插座。
一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。
客户软件将插头插到不同编号的插座,就可以得到不同的服务。
-----
1.什么是socket所谓socket通常也称作"套接字",用于描述ip地址和端口,是一个通信链的句柄。
应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
以j2sdk-1.3为例,socket和serversocket类库位于包中。
serversocket用于服务器端,socket是建立网络连接时使用的。
在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话。
对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
不管是socket还是serversocket它们的工作都是通过socketimpl类及其子类完成的。
重要的socketapi:
.socket继承于java.lang.object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见jdk-1.3文档。
accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的socket对象实例。
"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
getinputstream方法获得网络连接输入,同时返回一个iutputstream对象实例。
getoutputstream方法连接的另一端将得到输入,同时返回一个outputstream对象实例。
注意:
其中getinputstream和getoutputstream方法均会产生一个ioexception,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
2.如何开发一个server-client模型的程序开发原理:
服务器,使用serversocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
客户端,使用socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭socket。
客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。
socket接口是tcp/ip网络的api,socket接口定义了许多函数或例程,程序员可以用它们来开发tcp/ip网络上的应用程序。
要学internet上的tcp/ip网络编程,必须理解socket接口。
socket接口设计者最先是将接口放在unix操作系统里面的。
如果了解unix系统的输入和输出的话,就很容易了解socket了。
网络的socket数据传输是一种特殊的i/o,socket也是一种文件描述符。
socket也具有一个类似于打开文件的函数调用socket(),该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过该socket实现的。
常用的socket类型有两种:
流式socket(sock_stReam)和数据报式socket(sock_dgRam)。
流式是一种面向连接的socket,针对于