Socket服务器

2024-09-23

Socket服务器(精选7篇)

Socket服务器 篇1

1. 什么是Socket

Socket在计算机行业通常称为“套接字”, 用于描述IP地址和端口, 是一个通信链的句柄。网络上的两个程序通过一个双向的通讯连接实现数据的交换, 这个双向链路的一端称为一个Socket。Socket通常用来实现客户端和服务端的连接, 一个Socket由一个IP地址和一个端口号唯一确定。但是, Socket所支持的协议种类也不是仅仅TCP/IP一种, 因此两者之间是没有必然联系的。在Android环境下, Socket编程主要是指基于TCP/IP协议的网络编程。

2. Socket通讯的过程

Server端Listen (监听) 某个端口是否有连接请求, Client端向Server端发出Connect (连接) 请求, Server端向Client端发回Accept (接受) 消息。一个连接就建立起来了。Server端和Client端都可以通过Send, Write等方法与对方通信。

对于一个功能齐全的Socket, 都要包含以下基本结构, 其工作过程包含以下四个基本的步骤:

(1) 创建Socket;

(2) 打开连接到Socket的输入/出流;

(3) 按照一定的协议对Socket进行读/写操作;

(4) 关闭Socket.

3. Android平台下Socket服务器程序设计

一般服务器端要处理多个客户端连接, 因此必须使用多线程技术, 首先, 服务器端调用Android Java提供的Server Socket的构造函数, 并赋予Server Socekt的侦听端口号, 连接数, 创建服务器端的套接字流, 同时完成在服务器端的侦听。在客户端进行连接时, Server Socket就调用Accept () 函数, 接受客户端的套接字流, 生成一个新的Socket, 用于和客户端的通信。而Server Socket则用于继续侦听客户端的连接。在新形成的Socket数据流中, 即Input Stream, Output Stream。利用Get Input Stream () , Get Output Stream () 创建输入输出流与客户端进行通信。最后每执行完一个客户端的请求数据流, 就用流对象的close () 进行关闭, 对于整个客户端的连接断开, 就用Socket的close () 进行关闭整个Socket连接。参考代码如下:

4. 注意问题和结束语

基于Android的Socket编程中, 特别要注意采用多线程机制来实现, 否则程序程序效率很差。为了保证双方之间在线, 必须固定频率发送心跳包, 否则由于网络突然断开, 则无法检测对方是否在线或者正常关闭Socket, 这样就解决了网络断开的问题导致一方没有及时关闭socket的问题。

网络通信功能是手机应用程序必不可少的部分, 通过服务器和其它客户端程序通信可以进行数据传输、网络聊天等功能, 本文仅介绍了基于Android的Socket编程, 并且给了示例代码, 可以通过其开发出功能更强大的网络应用程序。

参考文献

[1]陈南南.基于C#的对象间数据传递方法分析及实现[J].电脑与电信, 2011 (9) .

[2]张荣Android开发与应用人民邮电出版社, 2014.

[3]谷岩利用Java的Socket编程机制实现在线交谈计算机工程与设计2006.6.

[4]阎秀英, 周亚建, 胡正名.基于Java的网络实时远程监控系统设计.计算机工程, 2009.5

Socket服务器 篇2

大部分网络协议的实现都由客户端 (Client) 和服务器端 (Server) 来协作完成。这种模型本质上涉及两个不同的程序, 通常这两个程序在不同机器上运行。这些机器之间都有网络连接。服务器端程序提供服务并对来自客户程序的请求作成响应。而客户端程序则是在使用者和服务器端程序之间建立某种沟通的渠道, 或者是作为使用服务器端提供的某种网络服务的工具。

一个典型的服务器与客户机之间的交互可能如下所示:

(1) 客户机提出一个请求;

(2) 服务器收到客户机的请求, 进行分析处理;

(3) 服务器将运行处理的结果返回给客户机。

通常一个服务器需要向多个客户机提供服务。因此对服务器来说, 还需要考虑如何有效地处理多个客户的请求。

2 服务器与客户端的Socket通信类型

Socket的连接类型可以分为两种, 分别是面向连接的字节流类型 (Sock_stream) 和面向无连接数据报类型 (Sock_dgram) 。

面向无连接数据报类型的Socket工作流程比较简单, 双方不需要进行太多的沟通与交互。客户机直接将用户的请求打包发送到服务器端, 省略了建立一个固定信息通道的过程。服务器端也是直接将处理的结果发送给客户端。其工作流程如图1所示。

面向连接的字节流类型的Socket工作中有比较严格的操作次序, 工作的原理也比较复杂。在这种类型的Socket的工作过程中, 必须首先启动服务器端, 通过调用Socket () 函数建立一个Socket对象, 然后调用Bind () 函数将该Socket对象和本地网络地址绑定到一起, 再调用Listen () 函数使该Socket对象处于侦听状态, 并规定它的最大请求的数量。其工作流程如图2所示。

总的来说, 无连接和面向连接的通信方式各有长处和短处。在仅仅涉及少量的信息传递的场合可以使用无连接操作;如果涉及大量信息传递的场合可以采用面向连接操作。

3 Delphi的Socket组件

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

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

ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求, 并与每个ClientSocket组件建立单独的连接, 进行单独的通信。因此, 一个服务器端可以为多个客户端服务。

(1) ServerSocket的属性

Port是通信的端口, 必须设置。在本文实例中设置为95;

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

ThreadCacheSize, 客户端的最大连接数, 就是服务器端最多允许多少客户端同时连接。本文实例采用默认值10。

其他属性采用默认设置即可。

(2) ClientSocket的属性

Port, 是通信的端口, 必须与服务器端的设置相同。否则可能导致两个组件发送的目标端口和接收的端口不一致, 导致无法建立有效的信息传送连接。

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

Host, 客户端要连接的服务器的ip地址。必须设置, 当然也可以在代码中动态设置。

其他属性采用默认设置即可。

4 应用实例

4.1 设计思路

实例包括一个服务器端程序与一个客户端程序。客户端程序可以放到多个计算机上运行, 同时与服务器端进行连接通信。

(1) 服务器程序实现以下基本功能

1) 在用户登录的时候记录用户登录所在主机的IP、主机名称等。

2) 显示当前在线用户数量。

3) 可对当前在线用户执行注销、重启、关机等操作。

(2) 客户端程序实现一些基本功能

1) 显示当前程序的工作状况。

2) 实现服务器端发送的注销、重启、关机的操作。

4.2 程序说明

根据功能的实际需要, 服务端程序一运行, 窗体的String Grid控件就显示已在线用户的基本信息, 如图3所示。

代码如下:

在窗体上, “执行”按钮的Click事件负责向指定的在线用户或全体在线用户发送注销、重启、关机操作指令。代码如下:

客户端程序通过通信端口接收指令, 并作出响应, 弹出关机提示对话框, 如需要继续使用计算机的在线用户, 可点击“取消”按钮, 如图4、图5所示。

代码如下:

并在客户端程序通信失败、通信成功、通信断开等状态, 作出响应的处理, 代码如下:

5 结语

综上所述, Socket组件相比其他高级协议组件如Fast Net组件, 它的封装层次较低, 程序员可以在它们的基础上自己定义新的高级协议或者是规定自己的信息交互流程。利用以上代码, 进一步拓展的余地也很大, 还可以加入一些更细化的功能, 如关闭与指定的在线用户的连接、可以让在线用户自己设置指令的执行时间等。

摘要:介绍有关Socket通讯应用的基本知识, 并通过客户端和服务器端的Delphi编程实例, 说明两者是如何进行通信的。

关键词:Socket,Delphi,通信,客户端,服务器端

参考文献

[1]赵秀英.Delphi网络高级编程.人民邮电出版社, 2001.

Socket服务器 篇3

IT技术发展以及行业升级带来的理念更新, 使社会对信息化的要求已经不满足于计算机软件功能是否强大、齐全, 转而关注软件能够为人们带来什么样的帮助、对应提供的服务是否完善等。对于处在服务行业的电信领域、基于移动互联网的众多APP应用、相对于传统实体店的电商平台等, 他们对信息化系统要求莫不如是。在这个基础上, 本文探讨“基于Socket长连接的系统怎样实现升级过程不中业务服务”实现方案足以有体现实际应用价值的一面。

1 需求分析

XG (3G、4G) 时代, 网络无处不在, 智能手机、掌上电脑等便携终端设备, 让每个人都具有随性接入互联网的能力。在这些便捷通道的另一端, 基于各种信息化系统包装出来的产品和平台要想在众多竞争对手中脱颖而出, 摆脱因系统功能普遍同质化造成产品特点不突出的困境, 通过提供优质的个性化服务是必然的选择。

但是, 优质的服务必须基于稳定的产品之上, 作为评价产品稳定性的指标, 系统的不间断运营能力是其中最重要的一项内容。但实际情况是, 在软件系统升级维护过程中, 经常由于中断业务层面的网络链接, 造成不能提供业务服务的影响, 这也是长期困扰“基于Socket长链接” (下文简称长链接) 应用软件的问题之一。下文讨论的方案将可以帮助软件系统解决这个问题, 实现升级维护过程对用户透明, 将系统维护给客户带来的不良感知降到最低。

2 方案设计

为了简化方案描述, 在介绍详细内容前, 对软件系统升级维护过程中可能会出现的相关对象进行名称定义:

(1) 将升级前的程序定义为O;

(2) 将升级后的程序定义为N;

(3) 操作维护人员定义为U。

要实现系统升级不中断服务, 且用户对升级过程透明, 需要满足以下条件:

(1) 允许O与N同时运行在同一物理环境中;

(2) O可以确认自身在某个时间点所有业务会话已经完整结束;

(3) 需要将O中的相关变量值传递给N中的对应变量;

(4) 需要将O中已经建立的Socket套接字传递给N (注意:是套接字传递, 不是断链重连) 。

根据以上要求, 系统升级不中断业务的场景时序图如下:

方案优点:本方案适用基于长链接的C/S、对等端等系统使用, 因为采用套接字在新旧系统中传递的方式, 可以保持网络链路不中断, 从而使系统维护动作对客户端或对等端透明, 达到升级不影响客户感知、提升系统连续运营指标的目的。

方案缺点:虽然可以通过传递套接字的方式在网络链接上实现无缝升级, 但是在新旧系统切换的过程中, 理论上有极短暂的时延T (见时序图中红色字体标注内容;T值单位为毫秒;T值大小取决于具体的软件系统实现) , 在该时段内容系统不能提供服务。

3 应用

根据以上设计, 我们在中国电信智能数据交换平台上落地实现系统升级不离网方案, 具体实现时序图如下:

说明:上图中proxy-old对应方案设计章节中的O, proxy-new对应方案设计章节中的N;pxycmd对应方案设计章节中的U;dataq是用来在O和N之间交换数据的共享内存。

时序图说明如下:

(1) U向O发送升级通知;

(2) O收到升级命令后向监控模块发出进程注销通知;

(3) 启动N, 同时N向监控模块发出进程注册通知;

(4) O收到升级通知后:

1接收线程停止接收新的消息, 发送线程停止读取新的待发送数据;

2判断待处理消息数是否为0, 保证当前所有业务会话已经完成;

3进行socket的转移, 将自身承载的socket传输给N, 并close自身的socket;

4将自身的私有内存数据通过dataQ传输给N;

(5) N接收O的socket和私有内存数据后, 将其加载到自身私有内存, 实现对O的业务承接;

(6) 停止O, 升级完成。

4 结论

身处以客户为中心的IT市场环境, 只有深入挖掘客户潜在需求, 才能在服务客户过程中成就自己。本方案通过优化系统升级流程, 帮助那些想改善客户感知的产品实现7*24小时不间断运营目标, 从而提升产品个性化服务竞争能力, 其思想值得IT产品借鉴。

摘要:本文对基于Socket长连接的系统怎样实现升级过程不中断业务服务展开探讨, 并提出具体的解决方案, 从而使业务系统具备7*24小时不间断提供服务的能力。

关键词:Socket,长链接,升级,断网,网络,服务,中断

参考文献

[1]吴军著, 浪潮之巅, 电子工业出版社, 2011年8月.

[2][美]理查德·史蒂文斯、[美]拉戈著, 尤晋元、张亚英、戚正伟译, UNIX环境高级编程, 人民邮电出版社, 2006年5月.

Socket服务器 篇4

Action Script是Adobe公司的Flash Player和AIR运行时环境的编程语言。在Flash、Flex和AIR中可以使用Action Script编程以进行数据处理和交互。Action Script由Action Script虚拟机 (AVM) 执行, AVM是Flash Player和AIR的核心组成部分。Action Script的源码常被称为Action Script脚本, 它们总是被编译成字节码格式 (bytecond format) 并嵌入SWF (Shack Wave File) 文件中, 然后由AVM来执行[1]。Action Script 3.0是Action Script的最新版本, 相比于其之前的版本, 使用Action Script 3.0开发需要处理大数据集的高复杂度的应用软件更为方便和高效。

目前, 大量B/S结构的应用软件采用Flash Player作为其网页前端的展现平台, 这其中既有采用Flex开发的管理软件, 也有采用Flash开发的网页游戏软件。尤其是在网页游戏开发领域, Flash是主要的技术平台, 占据了绝大部份市场份额[2]。基于Flash Player的应用往往需要与服务器进行数据交互, 这些数据交互一般通过Socket套接字编程来完成。然而, 在Flash Player前端与服务器建立Socket连接时存在沙箱 (Sandbox) 问题。

2 Action Script 3.0的沙箱问题和解决方法

Action Script 3.0使用沙箱来隔离不同的数据组以及不同的代码运行过程。沙箱对于Flash的安全非常重要, 其作用在于确保在没有适当的信任授权的情况下处于不同沙箱内的内容不会有任何交互。

Flash Player的安全模型使用称为安全域的沙箱来分离内容。安全域在Flash中是顶级的沙箱。安全域链接到内容的来源域名, 或者是被加载的内容 (如SWF文件) 的来源域名。不同的安全域使得SWF文件在Flash Player中播放时运行在自身的沙箱内[3]。

当通过HTTP协议加载到网页中的FLASH (一个SWF文件) 需要与服务器进行Socket通信时, 该FLASH与服务器处于两个不同的安全域, 因此服务器需要给予该FLASH以适当的信任授权, 该FLASH才能与服务器建立起Socket连接。为给予FLASH前端信任授权, 服务器需要为FLASH提供一个跨域 (cross-domain) 策略文件, 该文件是一个XML格式的文本文件。一个简单的跨域策略文件如下所示:

该跨域策略文件的<allow-access-from>说明了服务器允许来自www.server.com域的SWF文件访问1235端口和2048至2100端口。也可以用通配符“*”来代替“www.server.com”以允许来自任何域的SWF文件访问本服务器。如果只想让本机的SWF文件访问, 则可以将“www.server.com”改为“localhost”。

当在Action Script代码中通过Socket类的connect () 方法向服务器发起连接时, Flash Player会自动尝试从843端口以及connect () 方法所指定的端口中检索策略文件。实际上, 调用一次connect () 方法会发起两次连接, 首次连接建立后Flash Player会自动向服务器发送字符串“<policy-file-request/>”以请求策略文件, 在获取到策略文件后该连接即被关闭, 第二次连接才是真正用于数据通信的主连接。此外, 也可以使用Security.load Policy File () 方法从其他端口获取策略文件, 然后再调用Socket类的connect () 方法建立主连接。Security.load Policy File () 方法使用特殊的“xmlsocket”协议, 其格式形如:

Security.load Policy File ("xmlsocket://server.com:1235") ;

3 通信的实现

下文将以一个实例来说明Action Script 3.0与服务器进行通信的具体实现方法。该实例完成一个简单的消息发送与响应功能, 界面如图1所示。整个窗口由一个<s:Panel>面板构成, 内嵌一个<mx:Grid>网格, 网格的第一行的两个文本输入框<s:Text Input>用于指定服务器的IP/域名和端口, 按钮“连接”用于向服务器发起连接请求。网格的第二行的文本输入框用于填写要发送的消息文本, 按钮“发送”用于向服务器发送所填写的消息。网格的最后一行的文本区控件<s:Text Area>用于显示连接结果信息和服务器的响应信息。

在连接建立后, 原先的“连接”按钮上的文本变成了“断开”, 单击该按钮即可断开与服务器的连接。发送两条消息后的通信结果界面如图2所示。

3.1 Flex前端的实现

Flex前端是一个MXML应用 (Application) , 由一个MXML文件构成。在文件的<s:Application标签中为creation Complete属性指定了初始化函数init () , 当应用启动时会调用该函数进行初始化处理。另外, 文件中还定义了一个全局的Socket变量。

在init () 函数中, 主要创建了socket变量, 并为其指定连接事件、接收数据事件和错误处理事件的回调处理函数。

Flex前端的“连接”按钮的事件处理函数如下:

在该函数中, 首先获取用户输入的IP和端口号, 然后将端口号转换为int型, 随后判断socket的连接状态, 若已连接则断开, 否则调用其connect () 方法尝试连接服务器。一旦连接上服务器, 在init () 方法中设置的连接事件的回调处理函数on Connected () 就会被调用, 该函数的实现如下:

在该函数中, 首先获取用户输入的待发送消息, 将其连接上一个换行符“n”后, 采用UTF-8格式放入socket的输出缓冲区, 然后调用socket.flush () 发送到服务端。这里应当注意的是文本末尾需要有换行符socket.flush () 才真正起作用。

当服务器发回响应消息的时候, 在init () 方法中设置的接收数据事件的回调处理函数on Socket Data () 就会被调用, 该函数的实现如下:

在该函数中, socket.bytes Available属性取得socket的输入缓冲中可用的字节数, socket.read UTFBytes () 则以UTF-8格式读入相应的数据, 随后所读数据被显示到结果文本区。

3.2 Java服务端的实现

服务端由一个Flex Server类构成, 该类的主要代码如下:

Flex Server类中的两个常量POLICY_REQUEST和POLICY_XML_CONTENT分别定义了Action Script的套接字请求字符串和服务端对其响应的套接字策略文件 (XML格式) 内容。主函数main () 中调用了类中的两个主要方法以分别完成策略文件的响应和数据请求的响应。在listen And Response Policy () 方法中, 一旦接收到前端发送的POLICY_REQUEST, 即调用pw.println (POLICY_XML_CONTENT) ;pw.flush () 语句向其发回POLICY_XML_CONTENT内容进行信任授权。值得注意的是是, 实际接收到的POLICY_REQUEST请求文本的末尾有一个空字符’’, 因此不能用readline () 方法来读取该请求。最后, 在listen And Reply () 方法中进行了常规的数据收发处理。

4 结语

鉴于在B/S应用中Flash前端的广泛应用以及FLASH中存在的安全域沙箱问题, 本文提出了一个精简的Action Script 3.0与Java服务器进行Socket通信的一个具体实现。实践结果证明, 该实现对学习Action Script 3.0网络编程具有较高的参考价值, 对采用Flash前端的网络应用软件开发也具有一定的指导意义。

摘要:ActionScript 3.0在网页应用的前端开发中有着大量的应用。本文就如何解决在这些应用中当使用ActionScript 3.0与服务器建立Socket连接时存在的沙箱问题展开讨论, 并介绍了ActionScript 3.0与Java服务器进行Socket通信的一个具体实现。本实现对提高Flash或Flex网页前端的开发效率具有一定的参考价值。

关键词:ActionScript,沙箱,Socket通信,Flex,Flash,Java

参考文献

[1]Adobe.http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7ff4.html[EB/OL].2014.04.02.

[2]吴少军.网页游戏开发新趋势与新技术漫谈[J].当代教育理论与实践, 2012, 06:175-176.

Socket服务器 篇5

即时通讯 (Instant Messenger) 是一种基于互联网的实时通讯方式[1]。早在1996 年, ICQ即在全球发布, 其发布之初只有简单的发送和接收消息功能。时至今日, 即时通讯工具早已成为互联网上成熟的软件, 它的功能不再局限于简单的收发信息[2,3]。像国内的腾讯QQ, 集语音视频聊天、文件传输、远程桌面、游戏、网上交友和空间社区于一身, 已不再是一个简单的聊天工具了。借助即时通讯软件, 人们可以不受地域限制的面对面交流, 在方便交流的同时也极大地提高了效率, 成为现代生活中不可或缺的一部分[4,5]。

1 Socket套接字编程

Socket简单来说就是通信双方的一种约定, 在应用程序和网络驱动中扮演桥梁角色, 用套接字中的相关函数来完成通信过程[6]。其具体使用方法是:在应用程序中创建Socket, 并绑定操作和驱动程序, 以此建立双方的联系;当要实现通信时, Socket接收应用程序的数据, 交给驱动程序通过网络发出, 另一端的主机接收该Socket所绑定的IP地址和端口号等数据, 再由驱动程序交给Socket, 此时应用程序从中提取接收到的数据 (主要是IP地址和端口号) , 然后确认连接。这样就完成了一次在网络上两台主机通过Socket发送和接收数据。由于在网络上通信存在两种通信方式, 即TCP/UDP通信方式[7]。在进行两个程序之间的通信时, 其使用的通信方式必须统一, 不能一端使用TCP协议, 一端使用UDP协议[8]。

2 系统设计与实现

2.1 系统设计

系统分两部分, 由客户端和服务器端组成。

2.1.1 服务器端

服务器端主要完成3 大功能:建立连接、断开连接以及监听客户请求。

(1) 建立连接。在系统启动时就要建立连接, 之后服务器端会绑定本地计算机的一个端口, 之后会监听是否有客户端进行请求连接的操作以及是否要断开连接。

(2) 断开连接。关闭监听窗体, 系统断开连接。

(3) 监听客户请求。服务器端在这里起到了信息快速处理和响应枢纽的作用, 客户端请求服务都要与服务器端发生信息交流, 向服务器端请求的客户端的信息都会被传到服务器端。服务器会对客户端的请求进行判断, 如果其合法的话, 服务器端会按客户端的要求发送出去, 这时客户端可以向服务器端发送操作请求, 如:添加好友、获取分组等;否则, 返回请求不合法。

2.1.2 客户端

客户端完成以下六大功能:

(1) 用户注册。客户端与服务器建立连接, 创建完成通信通道, 这时会接收服务器的监听。通过系统的注册界面, 输入账号和密码, 完成注册。

(2) 用户登录。客户端与服务器连接成功之后, 会通过通信通道进行信息上的交流。用户在系统软件的“登录界面”上输入账号以及密码, 在这个过程中, 服务器端一直对客户端实施监听并且判断其请求是否合理。如果服务器端对用户信息验证通过, 客户端会打开程序的主界面。

(3) 添加好友或分组。用户在登录系统之后可以进行添加好友和分组的相关操作。

(4) 删除好友或分组。用户可以选择进行删除好友和分组的相关操作。

(5) 聊天功能。客户在与好友建立通信连接后, 便可以与好友进行聊天, 聊天时发送的是文本信息。

(6) 文件传输。用户之间可以相互传送文件以实现文件共享。

图一所示为具体的系统功能模块。

2.2 系统实现

2.2.1 服务器实现

(1) 打开一个通信通道 (本机的某一端口地址) 并告知本地主机, 它将在某一公认端口号上接收客户请求。

(2) 等待客户请求到达该端口。

(3) 接收到重复服务请求, 处理该请求并发送应答信号。服务完成后, 关闭此进程与客户端的通信链路并终止。

(4) 返回第二步, 等待另一客户请求。

(5) 断开服务器。

2.2.2 客户实现

(1) 打开一个通信通道, 并连接到服务器所在主机的特定端口 (可以通过所在服务器的IP地址来进行连接) 。

(2) 向服务器发送服务请求。

(3) 等待服务器端做出相应的处理并接收应答;继续提出请求。

(4) 请求结束后关闭通信通道并终止连接。

2.3 基于UDP (面向无连接) 的Socket编程

2.3.1 服务端

(1) WSAStart加载套接字库;

(2) 创建Socket () 函数;

(3) 利用bind () 函数绑定本机的IP地址和端口号;

(4) recvfrom () 函数将接收来至客户端的请求;

(5) Sendto () 函数发送信息;

(6) close () 关闭Socket。

2.3.2 客户端

(1) WSAStart加载套接字库;

(2) 在客户端创建Socket () 函数;

(3) Sendto () 向服务端发送数据;

(4) 使用recvfrom () 函数接收服务端数据;

(5) 当连接需要中断时使用close () 函数断开连接。

图二所示为服务器端和客户端调用流程。

2.4 系统运行结果

系统主要采用MFC来完成。待双方添加好友成功后, 双击好友就可以进行即时通讯了。图三所示为通讯界面。

3 结束语

本文介绍了运用Socket套接字编程和网络编程完成即时通讯软件, 实现了局域网中即时聊天、聊天室聊天、视频聊天和文件传输等功能, 最后经过测试和优化, 该软件运行稳定。

参考文献

[1]RB Jennings, EM Nahum, DP Olshefski.A study of internet instant messaging and chat protocols[J].IEEE Network, 2006, (20) .

[2]谌颃.一种多功能网络即时通讯系统的设计[J].网络安全技术与应用, 2014, (11) :62.

[3]雷东升.网络即时通讯系统[J].计算机与现代化, 2008, (04) :51-53.

[4]张磊, 王贞化.基于TCP下多线程WINSOCK编程[J].科技广场, 2006, (07) :51-53.

[5]刘彬, 赵荣彩, 丛建刚.即时通信协议分析与监控技术研究[J].计算机应用研究, 2007, 24 (09) :260-262.

[6]李延松, 余隋怀, 吴博.基于Socket的安全即时通讯软件的设计[J].科学技术与工程, 2007, 7 (12) :2974-2977.

[7]赵辉, 邓正伟, 宋婵.基于局域网的即时通讯系统的设计与实现[J].兵工自动化, 2007, 26 (10) :52-54.

Socket服务器 篇6

Socket通常也称作"套接字", 主要用于描述IP地址和端口, 是一个通信链中的重要组成部分。应用程序通常通过"套接字"发出或者应答网络请求。Socket最初是由加利福尼亚大学Berkeley分校为UNIX操作系统开发的网络通信接口。90年代初, Sun, JJSB, Microdynnne和Mircosoft等几家公司共同制定了一套标准, 即Windows Soockets规范。Windows Socket是从U-NIX Socket继承发展而来。

1. 网络编程原理

1.1 C/S模型概述

网络应用已经融为日常生活的一部分, 如浏览网页, 发送邮件等。每个网络应用都可以简化为客户端-服务器模型。一个应用一般是由一个服务器端和一个或多个客户端组成。客户端提交请求, 服务端接收请求, 并向客户端提供相关的服务。例如, 一个ftp服务器管理了一组磁盘文件, 它会为客户端进行存储和检索。

客户端-服务器 (C/S) 模型中的基本操作可分解为以下四个步骤:

(1) 当客户端需要某种服务时可以向服务器提交一个请求。例如, 当ftp客户端需要下载一个文件时, 它需要先发送一个请求给ftp服务器。

(2) 当服务器收到请求后, 要对接收的命令进行相应的解析, 并以某种方式操作相关资源。例如, 当ftp服务器收到请求后, 它就读一个磁盘文件。

(3) 服务器解析完命令后, 给客户端发送一个响应, 并等待下一个请求。例如, ftp服务器将文件发送回客户端。

(4) 客户端收到响应并完成后续处理。例如, ftp客户端收到来自服务器的文件后, 就将其保存在本地磁盘的某个路径下。

1.2 套接字

在windows环境, 客户端和服务器的连接是通过使用套接字接口建立的。套接字是连接的端点。对于应用程序而言, 连接是以文件描述符的形式出现的。套接字接口提供了socket () , accept () , connect () 等函数, 这些函数用于打开和关闭套接字描述符。客户端和服务器通过读写这些描述符来实现彼此间的通信。在Windows环境下进行网络编程需要在程序中包含头文件WINSOCK2.H或MSWSOCK.H, 并引入WS2_32.LIB或WSOCK32.LIB。在windows下实现客户端-服务器模型基本遵循以下的编程步骤。

服务器端编程的步骤:

1:调用WSAStartup () 加载套接字库, 调用socket () 创建套接字;

2:调用bind () 将创建的套接字绑定到一个IP地址和一个端口上;

3:调用listen () 设置套接字为监听模式并等待连接请求;当监听到连接请求后, 调用accept () 接受请求并返回对应于此连接的新的套接字;

4:调用返回的套接字与客户端进行通信, send () 用于发送, recv () 用于接收;

5:当结束与某客户端的通信后, 服务器端返回监听模式, 等待下一个连接请求;

6:无连接请求时, 调用closesocket () 关闭套接字, 调用WSACleanup () 关闭加载的套接字库。

客户端编程的步骤:

1:调用WSAStartup () 加载套接字库, 调用socket () 创建套接字;

2:调用connect () 向服务器发出连接请求;

3:建立连接后, 调用send () 、recv () 完成与服务器端的通信;

4:客户端完成所需通信后调用closesocket () 关闭套接字, 调用WSACleanup () 关闭加载的套接字库。

2. window下网络编程实例

2.1 需求

C/S架构下服务器端监听某特定端口, 供客户端连接。客户端连接服务器端。客户端能够实现的功能如下:1.列出服务器端运行程序所在的目录的内容;2.从服务器端下载目录中的某个文件。

我们将实现一个类似ftp的简化模型, 在实现过程中, 要注意服务器与客户端的交互控制, 要注意服务器与客户端的负载, 尽量简化一端的功能, 提高效率。我们假定客户端能执行以下几个命令。

(1) dir:查询服务器所管理的资源文件的所有目录, 并在客户端显示。

(2) get文件名:从服务器端下载相应文件, 如不存在则给出错误提示。

(3) exit:客户端结束连接, 服务器端等待下一连接。

2.2 程序流程

服务器端开启端口监听连接请求, 客户端发送请求, 当双方建立起连接后, 服务器端接收客户端发送的命令, 并进行命令解析, 根据解析结果进行下一步的操作, 同时回送相应的响应到客户端。

2.2.1 服务器端主要代码

void main ()

{

……

WSAStartup (w Version Requested, &wsa Data) ;//加载套接字库

……

SOCKET sock Srv=socket (AF_INET, SOCK_STREAM, 0) ;//创建套接字

……

bind (sock Srv, (SOCKADDR*) &addr Srv, sizeof (SOCKADDR) ) ;//绑定套接字

listen (sock Srv, 5) ;//设定监听模式并等待连接

while (1)

{

……

SOCKET sock Conn=accept (sock Srv, (SOCKADDR*) &addr Client, &len) ;

//接受连接请求并返回对应的新的套接字

……

sprintf (send Buf, &quot;Welcome%s to here!&quot;, inet_ntoa (addr Client.sin_addr) ) ;

send (sock Conn, send Buf, strlen (send Buf) +1, 0) ;//发送信息

while (1)

{

接收客户端的指令, 若接收出错给出相应提示, 并关闭连接;

//完成指令解析, 将解析结果回传到客户端

strncpy (str, recv Buf, 4) ;

if (strcmp (recv Buf, &quot;exit&quot;) ==0)

{

closesocket (sock Conn) ;

……//与当前客户端的连接, 返回等待下一连接;

}

if (strcmp (recv Buf, &quot;dir&quot;) ==0)

生成相应目录结构并在客户端显示;

else

if (strcmp (str, "get") ==0)

查找文件并传送至客户端, 查找无结果则返

回提示;

else

错误命令, 给出相应提示;

}

closesocket (sock Conn) ;//关闭套接字

}

WSACleanup () ;//关闭加载的套接字库

}

2.2.2 客户端主要代码

void main ()

{

……

WSAStartup (w Version Requested, &wsa Data) ;//加载套接字库

……

SOCKET sock Client=socket (AF_INET, SOCK_STREAM, 0) ;//创建套接字

……

connect (sock Client, (SOCKADDR*) &addr Srv, sizeof (SOCKADDR) ) ;

//向服务器发出连接请求

……

recv (sock Client, recv Buf, 128, 0) ;//接收数据

……

while (1)

{

接收键盘输入的指令并发送至服务器进行指令解析;

if (strcmp (recv Buf, &quot;exit&quot;) ==0)

接收服务器返回的解析结果, 若接收出错给出相应提示, 并关闭连接;

//进行相应指令的操作

退出循环;

if (strcmp (recv Buf, &quot;dir&quot;) ==0)

接收目录并显示;

else

if (strcmp (recv Buf, &quot;get&quot;) ==0)

获取文件;

else

输入错误命令, 给出错误提示;

}

closesocket (sock Client) ;//关闭套接字

WSACleanup () ;//关闭加载的套接字库

}

程序基本实现了预期目标, 具备一定的容错能力。当程序提示"error!"时表示服务器与客户端在数据传输的过程中出现错误。根据recv () 函数的返回值我们可以判断服务器和客户端通信的过程是否正常完成, 避免出现客户端或服务器循环等待的情况。

3. 结束语

上述案例简单实现了一个C/S架构的网络文件传输模型, 在此基础上我们可进行扩充, 实现更完整的功能, 例如多用户连接、多线程数据传输等。

参考文献

[1].龚奕利、雷迎春译.《深入理解计算机系统》[M].北京:中国电力出版社, 2004.

Socket服务器 篇7

Linux是一个免费的类Unix操作系统,最初是由芬兰人Linus Torvalds于1991年开发。Linux操作系统具有良好的稳定性以及强大的网络功能。Linux系统平台被广泛应用到网络通信程序的开发中。网络通信编程要用到网络套接字(Socket)。Socket是一种描述符,它是网络通信的基本操作单元。数据传输是一种特殊的I/O,提供了不同主机间的进程互相通信的端点,这些进程在通信前各自建立一个Socket,并通过对Socket的读写操作实现网络通信的功能。

1 Socket工作原理

Socket为套接字,是一种双向的通信端口。网络程序设计全靠套接字接受和发送信息。Socket的英文原意就是“孔”或“插座”,现在,作为BSD UNIX的进程通讯机制,取其后一种意义。日常生活中常见的插座,有的是信号插座,有的是电源插座,有的可以接受信号(或能量),有的可以发送信号(或能量)。假如电话线与电话机之间安放一个插座(相当于二者之间的接口,这一部分装置物理上是存在的)则Socket非常相似于电话插座。

图1为使用socket进行通信的示意图。Socket通信与打电话具有相似之处,电话的通话双方相当于相互通信的两个进程;通话双方所在的地区(享有一个全局惟一的区号)相当于一个网络,区号是它的网络地址。例如,用户甲要给用户丁打电话,在通话之前,用户甲必须要使用一部电话机,这部电话机就对应有一个Socket号;同时要知道用户丁的电话号码,相当于对方有一个Socket。然后向用户丁拨电话,相当于发出连接请求。如果用户丁在场并且处于空闲状态(相当于通信的另一主机开机且可以接受连接请求),拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是向电话机发出信号和从电话机接受信号的过程,相当于向Socket发送数据和从Socket接受数据。通话结束后,一方挂起电话机,相当于关闭Socket,撤消连接。在电话系统中,通信的双方只需要知道本地电话机和对方电话号码就可以了,其他的相关通信设施并不需要知道,这一点与Socket机制非常相似。Socket利用网间通信设施实现进程通信,但它对通信设施的细节毫不关心。

通过以上的例子,可以得出Socket实质上是提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。但是这时候会出现一个现象:进程通信时,如何来确认接收到的数据所要发送的进程。譬如,当用户甲给用户丁打电话,当用户丁所在的电话响后,当接电话的不是用户丁时,用户甲肯定会说:“我找用户丁,请帮我转接一下”。那么在进程通信中是如何实现的呢?需要一种标识信息,用于描述网络通信数据发往的进程。TCP/IP协议提出了协议端口的概念,用于标识通信的进程。当进程与某个端口绑定后,操作系统会将收到的给该端口的数据发往该进程。与文件描述符类似,每一个端口都有被称为端口号的整数类型的标识符,该标识符用于区分不同的端口。不同的协议可以使用相同的端口号进行数据传输。例如,TCP使用了344的端口号,UDP同样也可以使用344端口号进行数据传输。端口号为一个16位的无符号整数,其取值范围为0-65535。低于256的端口被作为系统的保留端口号,主要用于系统进程的通信,不在这一范围的端口号被称为自由端口号,可以由进程自由使用。每一个Socket都用一个半相关描述:{协议,本地地址,本地端口},一个完整的Socket则用一个相关描述{协议,本地地址,本地端口,远程地址,远程端口}。每一个Socket有一个本地的惟一Socket号,由操作系统分配。最重要的是,Socket是面向客户-服务器模型而设计的,针对客户和服务器程序提供不同的Socket系统调用。客户随机申请一个Socket号(相当于一个想打电话的人可以在任何一台入网的电话上拨叫呼叫);服务器拥有全局公认的Socket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。

Socket利用客户-服务器模式巧妙的解决了进程之间建立通信连接的问题。服务器Socket为全局所公认非常重要。两个完全随机的用户进程之间,因为没有任何一方的Socket是固定的,就像打电话却不知道别人的电话号码,要通话是不可能的。

Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解Socket接口。

Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket。网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

2 Socket程序设计

套接字有三种类型,其中流式套接字可以实现可靠的数据传输。根据套接字类型的不同,套接字通信又分为面向连接的通信和无连接的通信。面向连接的套接字通信使用的协议为TCP协议。该协议可以保证数据的可靠传输,当然这一可靠性是以一定的性能损失为代价的。无连接的套接字通信方式使用UDP协议。对比面向连接的套接字通信,这一方式无需在客户机与服务器之间建立连接,所以使用这一方式无法保证数据的可靠传输。网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端。网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接。一般的来说是服务端的程序在一个端口上监听,直到有一个客户端的程序发来了请求,服务器端根据该请求提供相应的服务。图2为套接字的工作流程。为了实现服务器与客户机间的通信,服务器与客户机都必须创建套接字。服务器在创建套接字后,需要指定监听的端口来等待客户机,因此,还有绑定端口号的操作。之后,服务器将处于监听状态,等待客户机来连接指定端口。当接收到客户机的连接请求后,服务器调用Accept函数来建立与客户机间的通信。在成功建立通信后,就可以通过Read函数或Write函数进行通信。客户端处的流程与服务器相比,简单一些。客户端在创建套接字后,调用Connect函数去连接服务器指定的端口。在服务器接收连接后,客户机与服务器之间就可以通过Write函数和Read函数实现数据通信了。

3 程序实例分析

通过设计客户机/服务器模式程序来进一步深入分析socket通信原理。server.c和client.c使用流套接字将服务器的信息传递给客户机。server.c为服务端的实现。首先创造建套接字,通信域为PF_INET,然后调用bind函数将指定的端口等到信息与套接字关联起来,调用listen函数实现对指定端口的监听。当有连接请求时,通过调用accept函数建立与客户机的连接,最后调用write和read函数来与客户机进行信息交换。client.c为客户端程序,实现较为简单。首先调用connect函数来连接指定的服务器和端口,然后通过write函数和read函数来实现与服务器之间的通信。

使用gcc编译server.c和client.c,获得可执行文件serve和client。

先执行server,然后运行client。./server portnumber&(portnumber随便取一个大于1204且不在/etc/services中出现的号码就用8888好了),然后运行。

4 结束语

在Linux系统中,不同主机或相同主机之间的不同进程可以通过套接字实现通信。套接字通信是一种服务器/客户机模型的通信方式。面向连接的套接字通信使用的协议为TCP协议。该协议可以保证数据的可靠传输,当然这一可靠性是以一定的性能损失为代价的。通过设计服务器端和客户端程序,使用流套接字实现了网络中主机间的面向连接通信。

参考文献

[1]朱居正,高冰.Red Hat Enterprise Linux网络管理[M].北京:清华大学出版社.2005.

[2]张轶博,孙占峰.Linux应用大全[M].北京:机械工业出版社.2000.

[3]骆耀祖.Linux网络服务器管理教程[M].电子工业出版社.2007.

[4]陈忠文.Linux操作系统实训教程[M].中国电力出版社.2006.

[5]冯昊.Linux服务器配置与管理(第2版)[M].清华大学出版社.2009.

上一篇:中学生逆反期心理教育下一篇:商标注册的实务问题