基于Socket网络通信协议的应用研究最终修改Word文档格式.docx

上传人:b****6 文档编号:17201705 上传时间:2022-11-28 格式:DOCX 页数:13 大小:142.55KB
下载 相关 举报
基于Socket网络通信协议的应用研究最终修改Word文档格式.docx_第1页
第1页 / 共13页
基于Socket网络通信协议的应用研究最终修改Word文档格式.docx_第2页
第2页 / 共13页
基于Socket网络通信协议的应用研究最终修改Word文档格式.docx_第3页
第3页 / 共13页
基于Socket网络通信协议的应用研究最终修改Word文档格式.docx_第4页
第4页 / 共13页
基于Socket网络通信协议的应用研究最终修改Word文档格式.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于Socket网络通信协议的应用研究最终修改Word文档格式.docx

《基于Socket网络通信协议的应用研究最终修改Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于Socket网络通信协议的应用研究最终修改Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。

基于Socket网络通信协议的应用研究最终修改Word文档格式.docx

5.2.2创建服务器端9

5.2.3建立客户端9

6结论10

参考文献12

 

基于Socket网络通信协议的应用研究

马文超

摘要:

Socket简称套接字,用于实现网络上客户和服务器之间的连接,也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点称为套接字,套接字是在比较低的层次上通信的,不同的操作系统对Socket有不同的支持方式,不同的开发工具,对Socket的实现也均不相同,而且Socket在TCP与UDP两大协议族系中也有各自的工作方式。

关键词:

Socket;

网络连接;

网络通讯

StudyBasedontheApplicationofSocketNetworkCommunicationAgreement

MaWen-chao

Abstract:

Socketcalledsocket,fortherealizationofthenetworkconnectionbetweenclientandserver,meaningthattwoormorenetworkcommunicationduplexmodethereisalwaysaconnectionbetweentheprocess,knownasthesetoftheconnectionendpointreceivedword,thesocketisarelativelylowlevelinthecommunications,differentoperatingsystemsupportforSocketdifferentways,differentdevelopmenttools,implementationoftheSocketarenotthesame,butintheTCPandUDPSocketTwoprotocolfamilylinesalsohavetheirownwork.

Keywords:

Socket;

NetworkConnection;

Networkcommunication

前言

随着网络通信技术的不断发展,Socket开发和研究已成为人们关注的热点。

Socke既适用于同一台计算机上的进程间通信,也适用于网络环境中的进程间通信。

它已成为当前许多操作系统的网络API,也是网络操作系统中必不可少的基础功能。

套接字是通信的基本元件,两个进程为了进行通信,首先必须设置套接字。

通俗讲,套接字相当于由其名字连接起来的通信线路的端点,这种连接不仅适用于本地进程之间的通信,而且也使用语远地进程之间的通信。

用套接字连接的两个进程可双向通信,且两通信端点的工作方式是不同的,一端须工作于服务方,另一端须工作于客户方。

本文从多个方面介绍了Socket的应用开发、实现环境以及工作流程,并用JAVA开发工具在WindowsNT系统上实现网络通讯为例来对Socket套接字做了更加深入的介绍。

1Socket的定义和工作原理

Socket套接字,英文原义是插座的意思,是进程之间通信的抽象连接点,可以通过一个形象的例子来理解这个概念,现实生活中的电话是人们联系的常用工具,双方只要使用两部电话机就可以交谈,在计算机世界中,两个程序就是使用Socket进行通信的,一个Socket就好比一部电话机,两个程序在网络上通过一个双向链路进行通信,这个双向链路的每一端就成为一个Socket。

进程之间要通信,首先要建立各自的Socket就像要打电话一定要先有电话机一样,打电话时每部电话机都可以说和听。

与此类似,每个Socket也都可以进行读、写操作,读、写操作时分别要用到Socket中的输入流和输出流。

建立连接后,客户程序可以向Socket里写入请求,然后服务器会处理这个请求,并把处理结果通过Socket送回。

服务器应用程序一般监听一个特定端口以等待一个客户的连接请求,当一个连接请求到达时,客户和服务器建立一个通信连接。

在连接过程中,客户被分配一个本地端口号并且与一个Socket连接,客户通过写Socket来通知服务器,通过读Socket来获取信息。

类似地,服务器也获取一个本地端口号,它需要一个新的端口号来监听原始端口上的其它连接请求。

服务器也给它的本地端口连接一个Socket,读写来自客户的请求。

目前可以使用两种Socket,即流式Socket和数据报式Socket。

流式Socket提供了双向的、有序的、无重复并且无记录边界的数据流服务。

TCP即是一种流式Socket协议;

数据报式Socket支持双向的数据流,但并不保证可靠、有序、无重复也就是说,一个以数据报式Socket接收信息的进程有可能发送信息重复了,或者和发出的顺序不同。

数据报式Socket的一个重要特点是它保留了记录边界。

UDP即是一种数据报式Socket协议。

2支持Socket的操作系统

Socket是网络通讯的基本元件,所有涉及到TCP/IP应用层进程的操作系统都会对Socket有所支持,但不同的操作系统对Socket的支持方式均不相同。

2.1Linux环境中的Socket

2.1.1Linux的Socket的提出

Linux操作系统与网络联系密切,它不仅具有稳定、简易、高效、兼容性好等特点,并且支持多种网络协议,如IPv4、IPv6、X125、IPX、NETBIOS、DDP等,因此被广泛应用于网络服务领域。

而在Linux环境下开发出高性能的网络通信程序,也是充分发挥Linux网络特性的一个关键因素。

在Linux系统中,套接字(Socket)是介于应用层和传输层之间的编程接口,它提供了访问下层通信协议的大量系统调用和相应的数据结构功能。

套接字接口也是应用程序访问下层网络协议的惟一方法。

具体地讲,套接字在用户级实现了两个应用程序之间的网络连接和数据交换,所以Linux中的套接字意味着网络上的通信。

Linux套接字在网络模型中的地位如图2-1所示。

图2-1Linux套接字的网络模型

2.1.2Linux的Socket的工作方式

Socket在Linux中使用的是标准系统文件描述符(FileDescriptor)和其它程序通信的一种方式。

一个套接字描述作为一个通信连接的一端,在一个网络通信连接中的两端通信程序应各自有一个套接字来描述它们自己那一端,不同主机中的两个进程通过各自的套接字发送和接收消息,从而实现了进程间跨网络的通信。

Linux的套接字支持多种网络协议,不同类型网络协议的工作方式不同,所使用的地址格式也完全不同。

对于各种网络协议而言,使用相同地址格式的几个协议称为一个协议地址族,表2-1列出了套接字的常见地址族。

表2-1Linux套接字地址族的主要类型

Linux将套接字地址族抽象为统一的套接字接口,该接口是应用程序的开发接口,由各地址族专有的软件支持。

Linuxsocket支持以下常见套接字类型:

(1)SOCK_STREAM(数据流套接口):

提供一个面向连接的双工顺序数据流传输和可靠的数据传输服务。

这种套接字可以保证数据传输的可靠性,不会出现数据丢失、破损或重复出现等差错,而且通过流量控制可避免发送的数据流超限。

它是最常见的套接字类型,文件传输协议(FTP)即使用流式套接字,Internet中的TCP协议也支持流套接字。

(2)SOCK_DGRAM(数据报套接口):

提供一个无连接和不可靠的双工数据传输服务。

数据包以独立包形式被发送和接收,不对数据的传输提供无错保证,即数据可能被丢失、破坏,也可能被重复接收。

Internet中的UDP协议支持这种套接字。

(3)SOCK_RAW(原始套接口):

这种类型的套接字允许对低层协议,如IP或ICMP直接访问;

可以直接填充IP、TCP、UDP或者ICMP的包头,发送用户自己定义的IP包或者ICMP包。

它主要用于协议的开发。

2.2WindowsNT系统环境中对Socket的支持

2.2.1Winsock(WindowsSocket)的提出

90年代初,由Microsoft联合其他几家公司共同制定了一套Windows环境下的网络编程接口,即WindowsSocket规范。

它是BerkeleySockets的重要扩充,主要体现在它增加了一些异步函数和符合Windows消息驱动特性的网络事件异步选择机制。

WindowsSocket规范是一套开放的支持多种协议的Windows下的网络编程接口。

目前实际应用中的WindowsSockets规范主要有1.1版和2.0版,其中1.1版只支持TCP/IP协议,而2.0版支持多协议,并具有良好的向后兼容性。

目前Windows下的Internet软件基本都是基于WinSock开发的。

WindowsSockets规范定义并记录了如何使用API和Internet协议族(TCP/IP协议族)连接,尤其要指出的是所有的WindowsSockets实现都支持流套接口和数据报套接口。

应用程序调用windowsSockets的API实现相互之间的通讯。

WindowsSockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。

它们之间的关系如图2-2所示。

图2-2应用程序与WindowsSocket关系图

3.2.2Winsock的原理

Socket实际在计算机中提供了一个通信端口,可以通过这个端口与任何一个具有Socket接口的计算机通信。

应用程序在网络上传输,接收的信息都通过这个Socket接口来实现。

在应用开发中就像用文件句柄一样,可以对Socket句柄进行读、写操作。

3.2.3Winsock的通讯方式

使用Socket进行通讯的方式有3种:

字节流套接字(StreaSocket):

TCP/IP协议族中TCP协议使用此类接口,它提供面向连接的(建立虚电路)、无差错的、发送顺序致的、包长度不限和非重复的网络信包传输;

数据报套接字(DatagramSocket):

TCP/IP协议族中的UDP(User.DatagramProtoco1)协议使用此类接口,它是无连接的服务,以独立的信包进行网络传输,信包最大长度为32kB,传输不保证顺序性、可靠性和无重复性,通常用于单个报文传输或可靠性要求不高的场合;

原始数据包套接字(RawSocket):

提供对网络下层通信协议(如IP协议)的直接访问,一般不是提供给普通用户的,主要用于开发新的协议或用于提取协议较隐蔽的功能。

其中字节流套接字是最常用的套接字类型。

3Socket开发工具的讨论

套接字是通信的基石,是支待TCP/IP协议的网络通信的本操作单元,所以在各种网络应用程序中,凡是涉及到数据传送和接收,一般都会使用Socket.

3.1C#中socket编程实现

VisualC#主要网络功能主要使用.NetFrameWorkSDK中的提供的二个命名空间"

System.Net.Sockets"

和"

System.Net"

而实现Socket使用的是命名空间"

中的Socke类.在.Net中System.Net.Sockets命名空间为需要严密控制网络访问的开发人员提供了WindowsSockets(Winsock)接口的托管实现。

.Net类可以视为包含3个层次:

请求/响应层、应用协议层、传输层。

Socket类处于传输层。

System.Net命名空间中的所有其他网络访问类都建立在该套接字Socket实现之上。

VisualC#通过创建Socket类的实例来实现Socket的托管。

在VisualC#中首先创建Socket对象的实例,创建完Socket实例后,可以通过此Socket实例的Bind方法绑定到网络中指定的终结点,也可以通过其Connect方法向指定的终结点建立的连接。

连接创建完毕,就可以使用其Send或SendTo方法将数据发送到Socket;

同样使用其的Receive或ReceiveFrom方法从Socket中读取数据。

在Socket使用完毕后,请使用其的Shutdown方法禁用Socket并使用Close方法关闭Socket。

3.2Delphi中socket的操作方法

根据连接发起的方式以及本地Socket要连接的目标,Socket之间的连接可以分为:

客户端连接、监听连接以及服务器端连接。

Delphi分别使用ClientSocket组件和ServerSocket组件来操纵客户端Socket和服务器端Socket的连接和通信。

ClientSocket组件为客户端组件。

它是通信的请求方,也就是说,它是主动地与服务器端建立连接。

ServerSocket组件为服务器端组件。

它是通信的响应方,也就是说,它的动作是监听以及被动接受客户端的连接请求,并对请求进行回复。

ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的通信。

3.2.1ServerSocket的属性设置

(1)Port是通信的端口,必须设置。

(2)ServerType服务器端读写信息类型,设置为stThreadBlocking表示异步读写信息,本文实例中采用这种方式。

(3)ThreadCacheSize,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接。

3.2.2ClientSocket的属性

(1)Port,是通信的端口,必须与服务器端的设置相同。

否则可能导致两个组件发送的目标端口和接收的端口不一致,无法建立有效的信息传送连接。

(2)ClientType,客户端读写信息类型,应该与服务器端的设置相同,为ctNonBlocking示异步读写信息。

4Socket在TCP与UDP协议集中的工作方式

4.1传输层的TCP与UDP

TCP/IP协议体系结构中的传输层有两个并列的协议:

TCP和UDP。

其中TCP是面向连接的,它在两个TCP端点之间支持面向连接的、可靠的传输服务。

UDP是无连接的,用于在两个UDP端点之间支持无连接的、不可靠的传输服务。

一般情况下,TCP和UDP共存于一个网间网中,前者提供高可靠性服务,后者提供高效率服务TCP/IP协议族的层次结构如图4-1所示

图4-1TCP/IP协议族的层次结构

4.2传输层端口与Socket

在进程通信的意义上,网络通信的最终地址不仅仅是网络层提供的主机IP地址,还应该包括描述进程的某种标识符,因此TCP和UDP都提出了协议端口的概念,用于标识通信的进程。

具体地说,端口用来标识应用层进程。

每个端口都拥有一个称做端口号的整数标识符,用于区分不同端口。

由于TCP和UDP是完全独立的两个软件模块。

因此各自的端口号也相互独立,也就是说,TCP和UDP都有70端口,而两个端口都不会冲突。

根据TCP和UDP的报文格式的规定,两个协议分别提供65536个不同的端口值。

端口号分为两类:

一类是由因特网指派名字和号码公司I-CANN负责分配给一些常用的应用层程序固定使用的熟知端口,其数值一般为0~1023,其中TCP和UDP均规定小于

256的端口号作为保留端口。

例如FTP用1、Telnet用23、SMTP用25、DNS用53、HTTP用80、SNMP用161等。

当一个新的应用程序出现时,必须为其指派一个熟知端口,否则其它的应用进程就无法与其进行交互;

另一类是自由端口,端口分配使用动态联系方式,也称为本地分配。

进程需要访问传输服务时,向本地操作系统提出动态申请,操作系统返回一个本地惟一的端口号,进程在通过合适的系统调用将自己和相应端口号联系起来。

当进程要与远地进程通信前,首先申请一个自由端口,然后根据全局分配的公认端口号与远地服务器建立联系,才能传输数据。

Socket由4BSDUNIX首先提出,目的是解决网间网进程通信的问题。

进程通信前,双方首先各自创建一个端口,每一个Socket有一个本地惟一的Socket号,由操作系统分配,Socket包括IP地址(32位)和端口号(16位),共48位。

插口、端口和IP地址的关系如图4-2所示。

图4-2插口、端口和IP地址的关系

4.3用Socket实现基于TCP和UDP的原理

Socket有两种主要的操作方式:

面向连接的和无连接的。

面向连接的Socket操作就相当于电话,当两个人通话时。

他们必须建立一个连接,所有的事情在到达时的顺序与它们出发时的顺序是一样的,面向连接的BSDUNIXSocket的工作流程如图4-3所示。

无连接的Socket操作就像是一个邮件投递,多邮件可能到达时的顺序与出发时的顺序不一样。

图4-3面向连接的客户端/服务器时序图

使用哪种模式由应用程序的需要决定。

如果可靠性更重要的话,用面向连接的操作会好一些。

比如文件服务器需要它们的数据正确性和有序性。

如果一些数据丢失了,系统的有序性就会失去。

一些服务器,比如间歇性地发送一些数据块,如果数据丢了的话,服务器并不想再重新发送一次。

因为当数据到达的时候,它可能已经过时了。

确保数据的有序性和正确性需要额外的内存消耗,额外的费用将会降低系统的回应效率。

无连接的操作使用数据报协议。

一个数据报是一个独立的单元,它包含了所有的这次投递信息。

把它想象成一个信封,它有目的地址和要发送的内容。

这个模式下的Socket不需要连接一个目的的Socket,它只是简单地投出数据报。

无连接的操作是快速和高效的,但是数据的安全性不佳。

面向无连接的BSDUNIXSocket工作流程如图4-4所示。

图4-4面向无连接的客户机/服务器时序图

5Socket在Java编程语言中的应用以及实现

5.1Socket在Java中的工作流程

Java编程语言是现在Internet上最流行的一种编程语言。

一般来说,网络中互相通信的两端,其中提供服务的一端叫服务器,而请求服务的一端叫客户机。

Socket通常用来实现Client/Server设计过程,所谓Client/Server是指通信双方一方作为服务器(Server)等待客户(Client)提出请求并予以响应。

客户则在需要服务时向服务器提出申请。

服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应客户,同时继续监听服务端口,使其它客户的请求也能及时得到处理。

一般连接过程是:

Serve端Listen(监听)某个prot(端口)是否有连接请求,Client端向Server端发出

Connect(连接)请求,Server端向Client端发回Accept(接受)消息,一个连接就建立起来了。

Server端和Client端都可以通过Send、Write等方法与对方通信。

5.2在Java中实现Socket通讯

5.2.1创建Socket和ServerSocket对象

首先在服务器端,通过创建ServerSocket类对象,来创建服务器对象,其格式如下:

ServerSocket服务器对象名=newServerSocket(端口号);

然后通过调用accept()方法来创建一个Socket对象,其格式如下:

Socket对象名=服务器对象名accept();

()

服务器端可以利用这个Socket对象与客户端进行通讯,用下面的语句得到输入流和输出流:

BufferedReaderin=newBufferedReader(newInputStreamReader(Socke对象名.getInputStream()));

PrintWriterout=newPrintWriter(Socket对象名.getOutPutStream()true,);

随后就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据.从而可以根据程序的需要对客。

户端的不同请求进行回应。

在所有通信结束后,应该关闭输入流和输出流,释放系统资源.关闭的顺序是先关闭输入流和输出流,然后再关闭Socket,调用的方法均为close方法。

5.2.2创建服务器端

下面创建了一个简单的服务器端测试程序的部分语句:

ServerSocketthisServer=newServerSocket(8186);

SocketthisSocket=theServer.accept();

BufferedReaderin=newBufferedReader(newInputStreamReader(thisSocket.getInputStream()));

PrintWriteroutOut=newPrintWriter(newOutputStreamWriter(thisSocket.getOutputStream(),true);

Stringstr=in.readLine();

下面的程序段是服务器测试程序,服务器接收客户机发来的信息,并显示在屏幕上:

import.*;

importjava.io.*;

publicclassServerTest

{Publicstaticvoidmain(Stringargs[])

{

ServerSocketserversocket;

SocketclientSocket;

DataOutputStreamdataOutput;

DataInputStreamdataInput;

StringreceiveString;

clientSocket=serverSocket.accept();

dataOutput=newdataOutputStream

(clientSocket.getOutputStream());

dataInput=newdataInputStream(clientSocket.getInputStream());

dataOutput.writeUTF(sendString);

5.2.3建立客户端

与建立服务器端相比,客户端要简单一些,客户端只需用服务器所在机器的IP以及服务器的端口作为参数创建一个Sock

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

当前位置:首页 > 教学研究 > 教学案例设计

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

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