socket协议域.docx

上传人:b****5 文档编号:5971074 上传时间:2023-01-02 格式:DOCX 页数:8 大小:22.13KB
下载 相关 举报
socket协议域.docx_第1页
第1页 / 共8页
socket协议域.docx_第2页
第2页 / 共8页
socket协议域.docx_第3页
第3页 / 共8页
socket协议域.docx_第4页
第4页 / 共8页
socket协议域.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

socket协议域.docx

《socket协议域.docx》由会员分享,可在线阅读,更多相关《socket协议域.docx(8页珍藏版)》请在冰豆网上搜索。

socket协议域.docx

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}

  篇二:

socket协议

  socket协议

  术语:

  

(1)端口:

端口是一种抽象的软件结构。

应用程序通过系统调用与某端口建立连接后,传输层传给端口的数据都被响应的进行所接收,相应进程发给传输层的数据都通过该端口输出。

端口用一个整型标示符来表示。

端口号跟协议有关,tcp/ip传输层的两个协议tcp和udp是完全独立的两个软件模块,因此各自的端口号也相互独立。

  端口使用一个16位的数字来表示,它的范围是0~65535,1024以下的端口号保留给预定义的服务。

如http,80。

  

(2)socket:

windowssockets只支持一个通信区域:

国际域(aF_inet),这个域被使用网际协议簇通信的进程使用。

  (3)c/s模式:

客户机向服务器提出请求,服务器接收到请求后,提供相应的服务、

  1、服务器端

  

(1)、创建套接字socket

  

(2)、将套接字绑定到一个本地地址和端口号bind

  (3)、将套接字设为监听模式,准备接收客户请求listen

  (4)、等待客户请求到了;当请求到来后,接收连接请求,返回一个新的对应于此次连接的套接字accept。

  (5)、用返回的套接字和客户端进行通信rend/recv

  (6)、返回,等待另一客户请求

  (7)、关闭套接字

  2、客户端

  

(1)、创建套接字socket

  

(2)、向服务端发出连接请求connect

  (3)、和服务器发出连接请求rend/recv

  (4)、关闭套接字

  篇三:

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,针对于面向连接的tcp服务应用;数据报式socket是一种无连接的socket,对应于无连接的udp服务应用。

socket建立为了建立socket,程序可以调用socket函数,该函数返回一个类似于文件描述符的句柄。

socket函数原型为:

intsocket(intdomain,inttype,intprotocol);domain指明所使用的协议族,通常为pF_inet,表示互联网协议族(tcp/ip协议族);type参数指定socket的类型:

sock_stReam或sock_dgRam,socket接口还定义了原始socket(sock_Raw),允许程序使用低层协议;protocol通常赋值"0"。

socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。

socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。

调用socket函数时,socket执行体将建立一个socket,实际上"建立一个socket"意味着为一个socket数据结构分配存储空间。

socket执行体为你管理描述符表。

两个网络程序之间的一个网络连接包括五种信息:

通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。

socket数据结构中包含这五种信息。

socket在测量软件中的使用也很广泛

  二socket函数

  thesocketfunctioncreatesasocketthatisboundtoaspecificserviceprovider.

  socketsocket(

  intaf,

  inttype,

  intprotocol

  );

  parameters

  afaddressfamilyspecification.

  type

  typespecificationforthenewsocket.

  thefollowingaretheonlytwotypespecificationssupportedforwindowssockets1.1:

typeexplanation

  sock_stReamprovidessequenced,reliable,two-way,connection-basedbytestreamswithanoobdatatransmissionmechanism.usestcpfortheinternetaddressfamily.

  sock_dgRamsupportsdatagrams,whichareconnectionless,ueliablebuffersofafixed(typicallysmall)maximumlength.usesudpfortheinternetaddressfamily.

  inwindowssockets2,manynewsockettypeswillbeintroducedandnolongerneedtobespecified,sinceanapplicationcandynamicallydiscovertheattributesofeachavailabletransportprotocolthroughthewsaenumprotocolsfunction.sockettypedefinitionsappearinwinsock2.h,whichwillbeperiodicallyupdatedasnewsockettypes,addressfamilies,andprotocolsaredefined.

  protocol

  protocoltobeusedwiththesocketthatisspecifictotheindicatedaddressfamily.

  ReturnValues

  ifnoerroroccurs,socketreturnsadescriptorreferencingthenewsocket.otherwise,avalueofinValid_socketisreturned,andaspecificerrorcodecanberetrievedbycallingwsagetlasterror.

  errorcodemeaning

  wsanotinitialisedasuccessfulwsastartupcallmustoccurbeforeusingthisfunction.

  wsaenetdownthenetworksubsystemortheassociatedserviceproviderhasfailed.

  wsaeaFnosuppoRtthespecifiedaddressfamilyisnotsupported.wsaeinpRogRessablockingwindowssockets1.1callisinprogress,ortheserviceproviderisstillprocessingacallbackfunction.

  wsaemFilenomoresocketdescriptorsareavailable.

  wsaenobuFsnobufferspaceisavailable.thesocketcannotbecreated.

  wsaepRotonosuppoRtthespecifiedprotocolisnotsupported.wsaepRototypethespecifiedprotocolisthewrongtypeforthissocket.

  wsaesocktnosuppoRtthespecifiedsockettypeisnotsupportedinthisaddressfamily.

  Remarks

  thesocketfunctioncausesasocketdescriptorandanyrelatedresourcestobeallocatedandboundtoaspecifictransport-serviceprovider.windowssocketswillutilizethefirstavailableserviceproviderthatsupportstherequestedcombinationofaddressfamily,sockettypeandprotocolparameters.thesocketthatiscreatedwillhavetheoverlappedattributeasadefault.Formicrosoftoperatingsystems,t

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1