公务员期刊网 精选范文 socket通信范文

socket通信精选(九篇)

socket通信

第1篇:socket通信范文

关键词:Socket编程;Java;C#;Json;数据同步

1 引言

随着Android智能手机市场的扩大,基于Android系统的应用程序也越来越多。Android程序多以Java语言为基础进行开发,而在Windows平台上,c#已经成为开发桌面程序的主流平台。在一些应用场景中,需要Android设备与装有Windows系统的计算机通过USB连接,用C#编写客户端,java编写服务器,实现跨平台的通信。

而标准的Socket方法可以实现任何平台和任何进程之间的Socket通信,在PC和Android手机通过USB连接的情况下,可用Android系统的ADB工具进行端口的转发,从而使两端设备的Socket连通。

2 实现通信的关键技术

基于以下技术,实现满足需求的Socket通信系统框架:

2.1 Socket通信技术

Socket是一种套接字规范,利用客户/服务器模式,解决了进程之间建立通信连接的问题。安装了TCP协议软件和实现了套接字规范的设备之间即可通过Socket进行通信。套接字之间连接的过程需要经过这三个步骤:服务端开启监听,客户端发出请求,服务端通过监听收到请求后再确认连接。两端连接上后即可进行数据传输的操作。

Socket有两种操作方式,一种使用TCP协议,在本系统中要求数据传输的准确性,因此采取使用TCP协议的来传输数据的方法。

2.2 C#中的套接字编程

.Framework的名字空间和.Socket包含丰富用以网络编程的类,其中Socket类为实现套接字网络编程提供了大量方法。

通过Encoding.UTF8.GetBytes(String),C#可以将将字符串转换为UTF-8字节数组,通过Encoding.UTF8.GetString(bytes[],0,Length)将UTF-8字节数组转换为字符串。

在创建Socket对象后,可通过Send方法发送字节数组形式的数据,或使用Receive方法接收字节数组数据,再用以上方法转换为相应字符串进行处理。

2.3 Java中的套接字编程

Java在包中提供了两个类,Socket和ServerSocket。服务端和客户端之间先建立Socket之间的连接,之后进行通信。在服务端新建ServerSocket对象,循环执行accept方法来监听设备指定的端口,当客户端有Socket来连接它时,它会接受该Socket的连接请求,同时在服务端建立一个对应的Socket对象并和它进行通信。这样两边各一个互相连接的Socket对象,通过两个socket传递数据实现了通信。

Java同样提供了字节数组和字符串之间的进行转换的方法,将字节数组转换为字符串的过程如下:

String string = new String(charArray, 0, length);

字符串转换为字节数组的过程如下:

byte[] byte = strContent.getBytes("UTF-8");

2.4 用Json将对象序列化

除了传输文件数据外,在面向对象编程中,发送的数据要用实体类封装,将封装的对象存入List()泛型集合中,可以通过序列化List对象来灵活的封装和传递大量数据。

因为跨语言的需要,用Java或C#一方自己的序列化方式是行不通的,而Json提供了一个通用的序列化格式。

C#可以用开源的项目,在项目中添加引用:using Newtonsoft.Json;和using Newtonsoft.Json.Converters即可使用以下方法:

序列化:

JsonConvert.SerializeObject(string);

反序列化:

JsonConvert.DeserializeObject(obj);

Java可以用开源项目google-gson,在项目中导入这个项目的第三方jar包,然后添加引用:import com.google.gson.Gson;就可使用以下方法:

序列化:

Gson gson=new Gson();

String s=gson.toJson(obj);

反序列化:

Gson gson=new Gson();

Object obj=gson.fromJson(s,Object.class);

2.5 C#启动cmd调用Android系统的调试工具ADB

通过C#名字空间System.Diagnostics提供的Process类调用Windows系统

的cmd.exe,在USB连接的情况下,执行“adb forward tcp:12581 tcp:10087”命令转发端口信息,并通过“adb shell am broadcast -a”命令发送一个广播给Android应用程序,以启动Android程序相应的service,在service中编写socket实现通信。

3 数据同步方法实现流程

根据以上列举的关键技术来设计一个实现Android应用程序和桌面程序通信的模型,分为C#客户端和Java服务端两部分:

3.1 客户端程序编写流程如下

⑴C#通过ADB发送Android系统的BroadCast广播,来启动Android的Service后台程序。

⑵新建一个Socket对象,Android默认手机端的IP为“127.0.0.1”,因此以“127.0.0.1”和指定的端口号为参数,执行该对象的Connect方法。

⑶发送对象时将要传递的对象用Json序列化函数JsonConvert.SerializeObject()序列化为字符串,再将字符串转换为字节数组,最后通过Socket对象的Send方法发送数据。

⑷接收数据时执行Socket对象的Receive方法,将得到的字节数组转换为字符串,再用JsonConvert.DeserializeObject()方法反序列化字符串得到对象。

⑸程序关闭时执行Socket对象的close()方法关闭socket连接,并发送关闭service的广播。

3.2 服务端程序编写流程如下

⑴编写一个Android端继承了Service类的后台运行的程序,作为服务器端,再编写一个继承BroadcastReceiver类的程序来接收广播,当接收到客户端发来的广播时来打开或关闭Service。

⑵Service启动的时候以固定端口号作为参数新建一个SocketServer的对象,当有客户端的socket连接时,通过SocketServer的accept方法新建Socket类的对象。

⑶新建BufferedOutputStream对象来发送Socket要发送的数据,新建BufferedInputStream对象来接收Socket对象接收的的数据。

⑷新建Gson对象,执行该对象的序列化和反序列化方法,将要发送的数据转换为字节数组,将接收的字节数组转换为对象。

⑸Service关闭时关闭通讯流和Socket。

4 结语

给出了解决C#平台和基于java的Android平台的同步通信的一个方案,总结了实现该方案所用到的技术基础,即Java和c#系统具有基于Socket的灵活通信机制,并在格式方面可以通过Json进行转换。

[参考文献]

[1]周培.基于Socket的即时通信系统的研究与实现[D].广州:华南大学,2010.

第2篇:socket通信范文

Socket AM2

Socket AM2是2006年5月底的支持DDR2内存的AMD64位桌面CPU的接口标准,具有940根CPU针脚,支持双通道DDR2内存。虽然同样都具有940根CPU针脚,但Socket AM2与原有的Socket 940在针脚定义以及针脚排列方面都不相同,并不能互相兼容。目前,采用Socket AM2接口的有低端的Sempron、中端的Athlon 64、高端的Athlon 64 X2以及顶级的Athlon 64 FX等全系列AMD桌面CPU,支持200MHz外频和1000MHz的HyperTransport总线频率,支持双通道DDR2内存,其中Athlon 64 X2以及Athlon 64 FX最高支持DDR2 800,Sempron和Athlon 64最高支持DDR2 667。按照AMD的规划,Socket AM2接口将逐渐取代原有的Socket 754接口和Socket 939接口,从而实现桌面平台CPU接口的统一。

图1Socket AM2

图2Socket AM2接口CPU

Socket S1

Socket S1是2006年5月底的支持DDR2内存的AMD64位移动CPU的接口标准,具有638根CPU针脚,支持双通道DDR2内存,这是与只支持单通道DDR内存的移动平台原有的Socket 754接口的最大区别。目前采用Socket S1接口的有低端的Mobile Sempron和高端的Turion 64 X2。按照AMD的规划,Socket S1接口将逐渐取代原有的Socket 754接口从而成为AMD移动平台的标准CPU接口。

图3Socket S1

图4Socket S1接口CPU

Socket F

Socket F是AMD于2006年第三季度的支持DDR2内存的AMD服务器/工作站CPU的接口标准,首先采用此接口的是Santa Rosa核心的LGA封装的Opteron。与以前的Socket 940接口CPU明显不同,Socket F与Intel的Socket 775和Socket 771基本类似。Socket F接口CPU的底部没有传统的针脚,而代之以1207个触点,即并非针脚式而是触点式,通过与对应的Socket F插槽内的1207根触针接触来传输信号。Socket F接口不仅能够有效提升处理器的信号强度、提升处理器频率,同时也可以提高处理器生产的良品率、降低生产成本。Socket F接口的Opteron也是AMD首次采用LGA封装,支持ECC DDR2内存。按照AMD的规划,Socket F接口将逐渐取代Socket 940接口。

图5Socket F

图6Socket F接口CPU

Socket 771

Socket 771是Intel 2005年底的双路服务器/工作站CPU的接口标准,目前采用此接口的有采用LGA封装的Dempsey核心的Xeon 5000系列和Woodcrest核心的Xeon 5100系列。与以前的Socket 603和Socket 604明显不同,Socket 771与桌面平台的Socket 775倒还基本类似,Socket 771接口CPU的底部没有传统的针脚,而代之以771个触点,即并非针脚式而是触点式,通过与对应的Socket 771插槽内的771根触针接触来传输信号。Socket 771接口不仅能够有效提升处理器的信号强度、提升处理器频率,同时也可以提高处理器生产的良品率、降低生产成本。Socket 771接口的CPU全部都采用LGA封装。按照Intel的规划,除了Xeon MP仍然采用Socket 604接口之外,Socket 771接口将取代双路Xeon(即Xeon DP)目前所采用的Socket 603接口和Socket 604接口。

图7 Socket 771

图8Socket 771接口CPU

Socket 939

Socket 939是AMD公司2004年6月才推出的64位桌面平台接口标准,具有939根CPU针脚,支持双通道DDR内存。目前采用此接口的有面向入门级服务器/工作站市场的Opteron 1XX系列以及面向桌面市场的Athlon 64以及Athlon 64 FX和Athlon 64 X2,除此之外部分专供OEM厂商的Sempron也采用了Socket 939接口。Socket 939处理器和与过去的Socket 940插槽是不能混插的,但是Socket 939仍然使用了相同的CPU风扇系统模式。随着AMD从2006年开始全面转向支持DDR2内存,Socket 939被Socket AM2所取代,在2007年初完成自己的历史使命从而被淘汰,从推出到被淘汰其寿命还不到3年。

图10Socket 939接口CPU

Socket 775

Socket 775又称为Socket T,是目前应用于Intel LGA775封装的CPU所对应的接口,目前采用此种接口的有LGA775封装的单核心的Pentium 4、Pentium 4 EE、Celeron D以及双核心的Pentium D和Pentium EE等CPU。与以前的Socket 478接口CPU不同,Socket 775接口CPU的底部没有传统的针脚,而代之以775个触点,即并非针脚式而是触点式,通过与对应的Socket 775插槽内的775根触针接触来传输信号。Socket 775接口不仅能够有效提升处理器的信号强度、提升处理器频率,同时也可以提高处理器生产的良品率、降低生产成本。随着Socket 478的逐渐淡出,Socket 775已经成为Intel桌面CPU的标准接口。

Socket 754

Socket 754是2003年9月AMD64位桌面平台最初时的CPU接口,具有754根CPU针脚,只支持单通道DDR内存。目前采用此接口的有面向桌面平台的Athlon 64的低端型号和Sempron的高端型号,以及面向移动平台的Mobile Sempron、Mobile Athlon 64以及Turion 64。随着AMD从2006年开始全面转向支持DDR2内存,桌面平台的Socket 754将逐渐被Socket AM2所取代从而使AMD的桌面处理器接口走向统一,而与此同时移动平台的Socket 754也将逐渐被具有638根CPU针脚、支持双通道DDR2内存的Socket S1所取代。Socket 754在2007年底完成自己的历史使命从而被淘汰,其寿命反而要比一度号称要取代自己的Socket 939要长得多。

图13Socket 754

图14Socket 754接口CPU

Socket 478

最初的Socket 478接口是早期Pentium 4系列处理器所采用的接口类型,针脚数为478针。Socket 478的Pentium 4处理器面积很小,其针脚排列极为紧密。英特尔公司的Pentium 4系列和P4 赛扬系列都采用此接口,目前这种CPU已经逐步退出市场。

但是,Intel于2006年初推出了一种全新的Socket 478接口,这种接口是目前Intel公司采用Core架构的处理器Core Duo和Core Solo的专用接口,与早期桌面版Pentium 4系列的Socket 478接口相比,虽然针脚数同为478根,但是其针脚定义以及电压等重要参数完全不相同,所以二者之间并不能互相兼容。随着Intel公司的处理器全面向Core架构转移,今后采用新Socket 478接口的处理器将会越来越多,例如即将推出的Core架构的Celeron M也会采用此接口。

图15Socket 478

Socket 462

Socket 462接口,也叫Socket A,是AMD公司Athlon XP和Duron处理器的插座接口。Socket A接口具有462插空,可以支持133MHz外频。

图17Socket 462

图18Socket 462接口CPU

第3篇:socket通信范文

关键词:IPv6;KAME协议栈;Socket;VxWorks操作系统;嵌入式系统

中图分类号: TP316.2

文献标志码:A

Research and extension of Socket in KAME stack based on VxWorks

ZHANG Yan-yan1, RAN Xiang-jin2

(

1. Institute of Command Automation, PLA University of Science and Technology, Nanjing Jiangsu 210007 China;

2. Institute of Nanjing, Zhongxing Telecommunication Equipment, Nanjing Jiangsu 210012, China

)

Abstract:

This paper researches the socket mechanism of KAME protocol stack, and mentions an approach to extend the KAME stack, which modifies the mechanism of socket’s implement. It increases the number of IPv6 socket effectively, and improves the effective of IPv6 in high performance embedded system, and it is reliable to run in VxWorks operating system, and it can also be used in IPv6 network as extension of KAME stack.

This paper researched the Socket mechanism of KAME protocol stack, and proposed an approach to extend the KAME stack, which modified the implementation mechanism of Socket. It increases the number of IPv6 Socket effectively, and improves the efficiency of IPv6 in high performance embedded system, and it is reliable to run in VxWorks operating system, and it can also be used in IPv6 network as extension of KAME stack.

Key words:

Internet Protocol version 6 (IPv6); KAME protocol stack; Socket; VxWorks operating system; embedded system

0 引言

随着网络的飞速发展,目前的IPv4协议在许多方面已经显得不太适应,如IPv4地址严重不足,缺乏服务质量(QoS)控制,安全性差等。因此,为了满足人们对地址空间、性能以及安全性等方面的新需求,Internet工程任务工作小组(IETF)的IPng工作组确定了IPng的协议规范,并称之为“IPv6”[1]。IPv6是为适应未来对于网络基础设施的数量和质量的需求而设计的下一代互联网协议,解决了地址不足的问题,更好地实现了端到端的通信,能够更容易地实现QoS控制[2]和网络安全[3]。

KAME协议栈是日本一个因特网社团――WIDE项目组研究并实现的一个IPv6协议栈,它是一个开源的项目[4],最初实现在BSD系统上,目前已经在越来越多的系统上(包括各种BSD系统的变种:BSD/OS、FreeBSD、NetBSD和OpenBSD等以及VxWorks[5]等实时嵌入式操作系统)得到了应用。

与IPv4协议栈类似,KAME协议栈同样实现了Socket套接字,应用层通过Socket描述符来与协议栈进行交互[6-8]。在一些路由器或网关设备上,随着IPv6的应用越来越多,IPv6的Socket个数明显不足,因此研究一种新的IPv6 Socket实现方案,具有较高的实用价值。

1 KAME协议栈的Socket实现

1.1 实现原理

KAME协议栈以文件描述符的方式实现了Socket描述符。具体的实现原理如图1所示。从图1可以看出KAME协议栈与操作系统内核之间的紧密关系,其中虚线所表示的

是KAME协议栈与操作系统内核之间Socket描述符和Socket控制块的查找和保存操作。

图片

图1 KAME协议栈中的Socket实现

在图1中,KAME协议栈实现了如下的操作。

1)创建Socket描述符(Socket系统调用)。

从操作系统内核中获取一个Socket套接字,然后动态申请一个struct atd_socket结构体变量,用于保存与网络连接相关的成员。如果内存申请成功,就把变量指针保存在Socket套接字所指向的内核资源中。

2)关闭Socket描述符(close系统调用)。

将Socket描述符传入内核,由内核执行KAME协议栈的关闭函数――atd_soo_close函数,对Socket所指向的连接进行关闭操作,然后调用VxWorks中的文件描述符释放函数,释放该Socket描述符资源。

3)使用Write操作通过Socket描述符发送数据(Write系统调用)。

将Socket描述符传入内核,由内核执行KAME协议栈的发送数据函数――atd_soo_write函数,进行数据的发送。

4)使用Read操作通过Socket描述符接收数据(Read系统调用)。

与Write操作相似,将Socket描述符传入内核,由内核执行KAME协议栈的接收函数atd_soo_read,接收数据。

在上面所描述的操作中,atd_soo_close、atd_soo_read、atd_soo_wirte等这些KAME协议栈提供的函数是在系统初始化时,通过调用iosDrvInstall函数注册在内核中的。

1.2 存在的缺陷

这种Socket的实现机制受文件描述符个数的限制,适用于Socket比较少的系统,不适用于需要较多连接、内存有限的(如嵌入式服务器)系统。

嵌入式系统所提供的文件描述符比较少(一般提供512

个左右),虽然可以通过修改配置文件来扩大描述符的个数,但是由于获取描述符是通过循环来查找空闲资源,其效率在资源数比较多时下降很快。另外,对于嵌入式系统来说,将文件描述符扩展为几万个,会给系统带来安全隐患。

┑4期 澎挽偷:基于VxWorks的KAME协议栈Socket描述符的研究与扩展

┆扑慊应用 ┑30卷

2 IPv6 Socket描述符的扩展

本方案摒弃了KAME协议栈的Socket实现机制,创建了新的IPv6 Socket资源池,并以链表的方式来管理资源:空闲链表和忙链表。具体的资源管理方式如图2所示。

图片

图2 扩展后的IPv6 Socket资源的管理方式

2.1 Socket描述符资源池的初始化

Socket描述符对于使用者来说是一个整型数字,但是对于协议栈来说,它是协议栈中资源的索引,协议栈通过这个描述符来找到相应的资源。为了使Socket套接字与struct atd_socket该结构体关联起来, Socket描述符资源定义如下:

程序前

typedef struct tagIPV6_SOCKET_FD

{

int so_fd;

struct atd_socket *ptso;

} IPV6_SOCKET_FD;

程序后

so_fd是一个Socket描述符,在申请一个套接字资源时,把该值返回给调用者。

Socket描述符资源池定义为:

程序前

IPV6_SOCKET_FD *g_ptFdPool;

程序后

g_ptFdPool作为IPV6_SOCKET_FD类型的全局变量指针,在系统初始化时申请指定容量的内存,形成一个套接字资源池,并且定义链表来管理Socket描述符的申请和释放。具体定义的链表结构体如下:

程序前

typedef struct tagLISTNODE

{

UINT32 dwPrev;

UINT32 dwNext;

} LISTNODE;

程序后

该链表定义为一个双向链表,在资源的申请和释放过程中,形成忙链表和闲链表,通过忙链表可以对当前Socket资源的使用情况进行查看。另外定义一个全局变量用于保存链表的头和尾,其结构如下:

程序前

typedef struct tagMNG

{

UINT32 dwFreeHead;

UINT32 dwFreeTail;

UINT32 dwBusyHead;

UINT32 dwBusyTail;

UINT32 dwBusyNum;

UINT32 dwFreeNum;

LISTNODE *ptSocketFdList;

} MNG;

程序后

使用该MNG结构体定义一个全局变量g_tIpv6ListMng,在系统初始化时,对该变量的成员进行初始化,并申请LISTNODE类型的内存,保存在ptSocketFdList成员中,然后将链表初始化形成一个空闲链表,如图2所示。

2.2 Socket描述符的申请

在申请Socket描述符时,通过MNG结构体中的dwFreeHead成员从ptSocketFdList链表池中得到一个空闲资源,将其从空闲链表中摘除,然后添加到忙链表中,并修改dwBusyTail的值。在申请到描述符并得到atd_socket结构变量后,把atd_socket变量保存在Socket描述符所对应的g_ptFdPool资源池中,以备后续操作使用。具体实现流程如图3所示。

图片

图3 申请Socket描述符流程 图4 关闭Socket流程

2.3 关闭Socket描述符

关闭操作把该描述符对应的连接关闭,并释放连接相关的信息资源。根据Socket描述符调用IPv6_Fd_GetSock函数

来获取到atd_socket结构体,接着调用关闭连接函数atd_soo_close来释放那些与连接信息相关的资源,然后再将Socket描述符从忙链表中删除,添加到空闲链表中。具体实现流程如图4所示。

2.4 读取数据

在有数据到达时,IPv6协议栈已经成功地接收了数据,并保存在atd_socket结构体中。在上层应用调用IPv6_Read函数读取数据时,通过参数iFd给出了Socket描述符的值,找到协议栈中保存的与连接信息相关的资源,然后调用读取数据的函数atd_soo_read,把目的缓冲区指针和缓冲区长度作为入参传入,由KAME协议栈把数据内容取出,保存在缓冲区中。具体实现流程如图5所示。

图片

图5 读取数据流程

2.5 发送数据

发送数据时,把源缓冲区中的内容和长度作为入参传入,通过Socket描述符的值调用IPv6_Fd_GetSock函数得到atd_socket结构体,然后调用atd_soo_write函数将数据写入底层驱动,发送出去。具体实现流程与图5相似。

3 实验与结果分析

3.1 实验环境及方法

实验采用的配置为MIPS CPU 400@MHz,512@MB内存,VxWorks操作系统,采用C语言实现。为了测试当前支持的Socket个数,在系统中编写了一个测试函数,该函数通过循环来申请最大个数的Socket,直到申请不到为止。申请完成后,使用每个申请到的IPv6 Socket发送一个UDP报文给服务器端,服务器端在收到UDP报文后,回复一个响应;客户端收到响应后,认为该Socket有效,如果长时间收不到响应(此处设置为2@min),则认为该Socket无效,然后再测试下一个Socket,直到测试完所有的Socket。测试结束后,给出测试结果。在测试代码中,分别就申请Socket、关闭Socket、发送数据、接收数据的耗时进行了测量。

实验中服务器端采用Windows XP操作系统,安装IPv6协议栈后,使用VC 6.0编写一个UDP监听程序,在收到UDP报文后,给发送者回复一个响应。

3.2 实验结果

实验针对KAME协议栈原有的Socket个数及扩展后的Socket个数进行测试,给出两种方法在Socket个数、资源使用效率方面的实验结果。实验结果如图6、7所示。从图6、7可以看出,扩展后的Socket实现机制大大增加了IPv6 Socket的个数,并且在数据收发效率方面好于原有的Socket机制;原有的Socket机制随着Socket个数增加,对Socket进行操作的耗时也随之增加。但是修改后的Socket机制不仅扩大了Socket的个数,而且在进行Socket操作时,不受Socket个数的限制,耗时比较均匀,适合于嵌入式系统的应用。

图片

图6 KAME协议栈原有的Socket机制测试结果

图片

图7 扩展后的Socket机制测试结果

4 结语

改造后的IPv6 Socket描述符的实现可以按照所需要的容量进行配置,不再受文件描述符个数的限制,而且申请和释放Socket套接字时,避免了循环查找的操作,满足嵌入式系统高效率的要求,在宽带网关设备上运行稳定。

参考文献:

[1]张云勇,刘韵洁,张智江.基于IPv6的下一代互联网[M].北京:电子工业出版社,2004.

[2]张云勇,张智江,刘韵洁,等. IPv6业务技术研究[J].计算机科学,2005, 32(1):8-12.

[3]李信满,赵宏. IPv6的安全体系结构[J].中兴通讯技术,2002, 8(3):4-7.

[4]LI QING, JINMEI T, SHIMA K. IPv6 core protocols implementation[M]. San Fransisco:Morgan Kaufmann Publishers,2006:10-12.

[5]孔祥营,柏桂枝.嵌入式实时操作系统VxWorks及其开发环境Tornado[M].北京:中国电力出版社,2002.

[6]刘利强,吴永英,王勇智. IPv6下Socket网络编程的研究与实现[J]. 计算机技术与发展,2006, 16(6):201-203.

第4篇:socket通信范文

本文介绍了Socket通信机制,采用C/S模式,使用Java语言SocketAPI(套接字接口)以及多线程技术实现多客户端远程监控服务器的功能,实现了上传、下载、截图、远程关机、远程输入dos命令等功能。

【关键词】Java 远程监控 Socket通信

1 引言

Java语言具有跨平台性,是一门丰富的面向对象的程序设计语言,同时具有强大的网络编程接口,这使得Java在网络通信方面游刃有余,网络上的计算机如果进行通信,一方面要准确定位计算机在网络中的位置,另一方面则是要进行数据的传输。而这些功能的实现则要依靠Java强大的网络编程接口,如Socket类、ServerSocket类等。

2 Socket通信

在数据传输过程中按照传输的协议我们分为TCP和UDP两种,其中TCP是面向连接的传输控制协议,传输信息过程中确保数据的有序性、可靠性,为流式Socket通信。UDP是用户数据报协议,不保证数据的可靠性,为数据报式Socket通信。

在java中为实现TCP,Socket提供了两个基础的类(Socket和ServerSocket),Socket类有两个作用:1、作为客户端向服务器发出请求。2、在服务器端生成一个与客户端对等的通信实体,实现一对一的通信。ServerSocket主要用于在TCP传输的服务器端建立一个监听端口,监听本地服务器是否接受到客户机端的连接请求(当接收到请求的时候,采用accept方法确认连接,并在本地返回一个Socket对象,利用该Socket对象与客户端的Socket实现建立通信)。

3 软件设计开发

在实际应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要利用多线程实现多客户机制。用一个实现了runnable的severworker类来实现多线程。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。

4 程序实现

4.1 服务器端程序编写

ServerSocket server=null;

Socket theSocket=null;

server=new ServerSocket(PORT_NUMBER);//监听端口

ServerWorker worker;

Thread thread;

while(true){ //循环监听客户端的请求

theSocket=server.accept();

worker=new ServerWorker(theSocket);//将请求交给worker线程处理

thread=new Thread(worker);

thread.start();}//运行worker里面相应的操作

线程类的实现:

public void run ()

String message;

try{

FileWriter client=new FileWriter("client.txt",true);

theReader=new DataInputStream(theSocket.getInputStream());

//获得客户端输入的相关信息

theWriter=new DataOutputStream(theSocket.getOutputStream());

//获得服务器端的输出信息

String inputStr,outputStr;

theWriter.writeUTF("欢迎进入网络远程监控系统");

theWriter.flush();//清空缓冲区,保证客户端接收到相关信息

do{

inputStr=theReader.readUTF();

System.out.println(inputStr);

if (inputStr.equals("bye"))

break;

String[] Array=inputStr.split("#");

client=new FileWriter(Array[0]+".txt",true);

//建立相关文件,将客户端执行的操作写入相关日志文件中

if(Array[1].equals("upload")){}//你想进行的上传操作}}}

4.2 客户端的程序实现

String str=JOptionPane.showInputDialog("1.输入你想连接到服务器端的IP地址");

String sr=JOptionPane.showInputDialog("输入你想连接到服务器端的端口号");

try{

theSocket=new Socket(str,a);//将服务器ip地址和端口号传进

theReader=new DataInputStream(theSocket.getInputStream());

theWriter=new DataOutputStream(theSocket.getOutputStream());

}catch(Exception e){System.out.println("can not access to port "+sr); }

5 程序运行结果

主程序显示界面:通过选择相应的数字来实现不同的功能

6 注意事项

应注意到:(1)当传一个较大的文件时,需要分段传,因为tcp包最大为64kb,往往我们需要传的是一个很大的文件。还有注意输入输出流的正确关闭,以及套接字socket的正常关闭。(2)总是先启动服务器程序,在启动客户端程序,因本测试服务器和客户端为一台机器,所以Ip地址选择为127.0.0.1。

参考文献

[1]author.(美)Kenneth L.Calvert Michael J.Donahoo.Java TCP/IP Socket编程.

第5篇:socket通信范文

(吉林大学物理学院,吉林长春130012)

摘要:为了适应在复杂实验条件下对多个电源单元的管理控制,设计基于Socket网络通信的多电源单元管理系统。为了对多电源单元的高效管理,Socket网络通信采用的是异步通信连接,同步通信的通信模式,同时存储电源数据(电压、电流)到excel文件,方便查阅与记录。实验证明这种方式比单独异步或者单独同步通信方式都高效、准确。

关键字:C#;Socket;异步通信;同步通信;数据保存

中图分类号:TN86?34 文献标识码:A 文章编号:1004?373X(2015)20?0137?03

收稿日期:2015?05?12

Multi?power management system based on Socket communicationXI Yongguang,FU Chengwei

(School of Physics,Jilin University,Changchun 130012,China)

Abstract:To suit the management and control of multi?power units under the complex experiment condition,a multi?powerunit management system based on the Socket network communication was designed. For the efficient management foe multi?powerunit,the asynchronous communication connection and synchronous communication are adopted in Socket network communica?tion,and the power data(voltage,current)are stored in Excel file. It is convenient to check and record. The experimental re?sults show that this method is more efficient and accurate than only asynchronous communication mode or synchronous communi?cation mode.

Keywords:C #;Socket;asynchronous communication;synchronous communication;data preservation

为了适应在复杂实验条件下对多个电源单元的有效管理,运用C#语言编写了基于Socket 网络通信的多电源管理系统,并且能把每台电源单元的数据保存到Excel 表格中,方便查阅与记录。Socket 通信的同步通信方式是在客户端在发送请求之后必须等到服务器回应之后才可以发送下一条请求,是阻塞通信方式。这样的方式对于电源单元的管理比较准确。但对于多个电源单元同时管理时,就会出现连接长时间通信不上的问题。而异步连接就能很好的解决多个单元的连接问题,但是异步通信的缺点是对多电源单元管理时会出现数据错乱的问题。本系统使用面向对象C#编程,采用了Socket 异步连接电源,同步通信收/发数据方式进行设计,很好地满足了多电源管理系统的要求。

1 系统设计

1.1 Socket通信原理

1.1.1 服务器端的步骤

(1)在实用Socket之前,要首先初始化Socket,就是实用Socket初始化函数;

(2) 在初始化完成以后,就可以建立服务端的Socket,然后实用该Sokcet开始侦听整个网络中的连接请求;

(3)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端的连接;

(4)在通信的过程中,服务器端产生的Socket会通过一个消息响应函数OnReceive来接收到达的数据,数据的发送可以使用Send()来完成;

(5)当完成通信后,服务器关闭与客户端的Socket连接。

1.1.2 客户端的步骤

(1)同样的,初始化Socket,并建立客户端的Socket,确定要连接的服务器的主机名和端口;

(2)发送连接请求到服务器,并等待服务器的回馈信息;

(3)连接成功后,与服务器进行数据的交互;

(4) 数据的读取同服务端一样,也是通过OnRe?ceive函数来完成的,数据的发送通过Send函数即可;

(5)数据处理完毕后,关闭自身的Socket连接。

1.2 Socket异步通信与同步通信

(1)异步通信方式

程序执行到发送、接收和监听语句的时候,不论工作是否完成,都会继续往下执行。并且在服务端不存时,仍然能继续进行后继工作的。

(2)同步通信方式

Socket 通信用TCP 协议进行编程时程序执行到发送、接收和监听语句时,在未完成工作前不再继续往下执行,即处于阻塞状态,直到该语句完成某个工作后才继续执行下一条语句。并且服务端不存、从而在抛出异常之前,是无法继续进行后继工作的。

1.3 主要设计思路

1.3.1 采用同步通信方式

同步通信方式如图1所示。

1.3.2 采用异步通信方式

异步通信方式如图2所示。

1.3.3 采用异步连接,同步通信的方式

电源管理系统界面,根据每个电源的IP 地址,端口,通过网口进行异步通信的连接,然后在界面上输入需要的电源电压电流数据,通过同步通信方式进行收/发数据,进而完成对电源的控制。管理界面还能保存电源的电压电流变化的数据,方便以后查验。

(1)Socket异步连接电源部分程序

2 实际测试

2.1 采用同步通信方式

测试过程中出现,在一个电源单元数据通信完成后,才能和下一个电源单元进行通信的情况。这样的管理系统只能每次处理一个电源单体,不能实现对多电源管理的问题。

2.2 采用异步通信方式

在实验测试过程中,能够同时和多个电源单元进行通信,但是在通信过程中出现数据错乱和数据发送延迟的问题。

2.3 采用异步连接,同步通信的方式

实验测试,对电源单元和多电源单元进行多批次长时间的测试,系统是高效、准确的,数据保存也是实时准确的,如图4所示。

3 结语

多电源单体管理系统能对多台电源进行高效准确地管理,优点有:

(1)在复杂的实验条件下,能实时高效准确地管理多个电源单元,能极大地简化实验过程,让实验更加高效精确。

(2)能在远距离条件下,方便实验人员操作复杂的电路实验。

(3) 能实时精确地保存数据,方便数据的记录和计算。

参考文献

[1] 周晟,金瓯,贺建飚,等.基于Socket的异构形平台的网络通信研究[J].计算机与数字工程,2006(5):4?8.

[2] STEVENS W R.TCP?IP 详解卷一:协议[M].北京:机械工业出版社,2000.

[3] 张文,赵子铭.P2P网络技术原理与C++开发案例[M].北京:人民邮电出版社,2008.

[4] 马骏.C#程序设计及应用教程[M].北京:人民邮电出版社,2009.

[5] JONES A,OHLUND J.Windows网络编程[M].北京:清华大学出版社,2002.

[6] 任柯.ZigBee多媒体教室电源管理系统设计与实现[J].西南民族大学学报:自然科学版,2012(4):669?673.

[7] 赵勇,黄东,张天开,等.基于μIP和Socket的远程机房电源控制系统设计[J].电子设计工程,2015(4):40?43.

第6篇:socket通信范文

关键词:Socket; 数据库; Java; 查询

中图分类号:TP311 文献标识码:A

文章编号:1004-373X(2010)11-0138-03

Design and Implementation of Books Inquiry System Based on Java

TIAN Xu-an1, SU Lin-mao1, WANG Hong-mei2

(1. Xi’an Communications Institute, Xi’an 710106, China; 2. The Second Communication Corps of the Lanzhou Military Region, Urumqi830002, China)

Abstract: The design of the books information inquiry system is realized by the Socket, according to the advantages and shortcomings existed in the various books inquiry systems, and the network library files of the object-oriegnted network programming language Java is researched.The realization of books information inquiry system, the key technique in the design process and the problems in development, the driven and joint means of database were given, according to the characteristics of the database and network programming means. It is more convenient and prompt. The core code of the server-side and client-side are showed for reference.

Keywords: Socket; database; Java; inquiry

基于Java查询系统的开发目的是为了提高查询效率。选用Java开发工具可以提高查询系统的移植性和兼容性。 系统主要功能是实现读者对图书信息进行准确、快速查阅。

1 系统结构

系统采取B/S结构,利用服务器端和客户端的 Socket通信机制完成信息的传递,如图1所示。数据库用来统计图书信息,主要涉及的是信息表格,选用Access实现。

2 Socket通信分析

2.1 Socket应用

网络通过双向通讯连接实现数据交换。Socket用来实现客户端和服务端的连接,它是TCP/IP协议的编程界面,由一个IP地址和一个端口号惟一确定。在Java环境下,Socket编程是基于TCP/IP协议的网络编程。

2.2 Socket通信过程

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

图1 系统结构

采用Socket套接字把网络连接作为一个流(Stream),通过流读写字节。

2.3 网络客户和网络服务器的设置

客户端与服务器端使用约定一致的协议或标准来通信。由于在一个机器上同时运行了多个相同的或不同的网络服务器,因此,端口号可作为约定的标准或协议的一部分,以便客户机定位服务器。

网络服务器绑定在某一端口上,监听新的连接。服务器允许客户端建立一个相对持久的连接,在这个链接的生命周期中,客户端不断请求服务器的服务,直到客户端显示断开这个连接。

3 查询系统的设计方案

查询系统分为服务器端和客户机端两部分。首先执行服务器端程序,然后监听本地IP地址上指定的端口,并发生阻塞,等待客户端程序的连接请求;接着,客户端程序启动,向指定的服务器发送连接请求;当服务器端得到客户端程序的连接请求后,与客户端程序建立连接,并向客户端程序返回其IP地址。

3.1 服务器端的设计步骤

(1) 创建一个等待连接的ServerSocket对象。

(2) 调用ServerSocket对象的accept()方法侦听接受客户端的连接请求。当侦听到一个客户的请求时,连接成功,并返回一个Socket对象。

(3) 创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流。

(4) 通过数据输入输出流与客户端进行数据读写,完成双向通信。

(5) 当客户端断开连接时,关闭各个流对象,结束通信。

3.2 服务器端的设计步骤

(1) 创建指定服务器上指定端口号的Socket对象。

(2) 创建与Socket对象绑定的输入输出流,并建立相应的数据输入输出流。

(3) 通过数据输入输出流与服务器端进行数据读写,完成双向通信。

(4) 通过调用close()方法关闭与服务器端的连接,并关闭各个流对象,结束通信。

4 数据库的驱动和连接

采用jdbc-odbc桥实现库的驱动和连接,完成数据库的连接并返回该连接。如图2所示。

4.1 建立Access数据库

(1) 建立Access数据库db.mdb并创建bookform表。

(2) 打开控制面板管理工具数据源(ODBC),选择“系统DSN”,单击“添加”,选择“Driver do Microsoft Access (*.mdb)”,点击“完成”,弹出的对话框里将“数据源名”一项给数据源取名,点击“选择”,找到刚刚建立的数据库文件db.mdb,即ODBC数据源配置完成。

图2 库的驱动和连接

4.2 Access数据库的连接

第7篇:socket通信范文

[关键词] socket tcp协议 服务器 客户端 线程

一、引言

随着信息技术的高速发展,网上交谈已成为人们学习和工作的重要手段,那么如何设计合理的、人性化的网上交谈工具就成为当务之急。使用visual c#.net中的socket编程技术,以及多线程的知识可快速、方便地设计理想的网上交谈工具。一个socket通信无论功能多么齐全、程序多么复杂,其基本结构均应包括以下步骤:创建socket对象,建立连接;打开连接到socket的输入/输出流;对socket进行读写操作;关闭socket套接字,关闭流。

二、tcp协议通信的流程

tcp协议是面向连接的协议,它的实现需要数据发送方和数据接收方建立数据通信连接,它的具体流程如下:

1.服务器端首先创建服务器套接字

2.服务器套接字监听一个端口,等待客户端的请求

3.客户端创建一个客户端套接字

4.客户端向服务器发送连接请求

5.服务器确认与客户端的连接

6.客户端和服务器利用建立的连接进行通信

7.通信完毕后,客户端和服务器关闭各自的连接

三、socket编程简介

1.利用socket建立服务器程序

要用socket建立一个tcp服务器程序,一般需要以下几个步骤:

(1)创建一个服务器套接字,用ip地址和端口初始化服务器

(2)监听服务器端口

(3)确认与客户端的连接

(4)处理客户端的请求并回应客户端

(5)断开客户端的连接,释放客户端的连接

(6)关闭服务器,释放服务器连接

2.利用socket建立客户端程序

要用socket建立一个tcp客户端程序,一般需要以下几个步骤:

(1)创建客户端套接字

(2)连接服务器

(3)得到与服务器通信的流通道

(4)向服务器发送数据

(5)接收从服务器发回的数据

(6)断开连接

四、设计方案

1.服务器端的设计

服务器端管理着交谈任务,它维持着一张当前在线用户的列表,转发用户发送来的信息,主要功能如下:

监听本机ip地址中的一个指定的端口。

当有客户端向该端口发出请求时,服务器程序立即建立一个与该客户端的连接并启动一个新的线程来处理该客户端的所有请求。

根据客户端发送来的各种不同的请求,执行相应的操作,并将处理结果返回给该客户端。服务器能识别4种请求命令:conn(建立新的连接)、chat(聊天)、priv(私聊)和exit(离开),服务器接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。

2.客户端的设计

客户端应用程序包含用户登录窗口和用户交谈的主窗口,它允许用户登录到服务器,可以向服务器发送信息,同时可以接收从服务器返回的信息,设计的主要功能如下:

向远程服务器发送连接请求。

得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道(networkstream)。

通过网络流通道与服务器端的程序进行数据通信。向服务器发送服务器能够识别的以上4种命令请求,同时也接收服务器发回的命令。客户端能够识别的命令有join(通知当前在线用户有新的用户进入聊天室)、list(更新当前在线用户)和quit(关闭客户端程序)。客户端程序接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。

五、解决方案

1.服务器端的实现

服务器端是一个windows窗体应用程序,命名为chatserver。当运行服务器程序时,单击服务器窗体上的“启动”按钮后,便启动了服务器进程。为了使用socket对象和thread对象,在代码文件中加入名字空间system.net、system.net..socket、system..threading的引用。

在服务器端使用了多线程,每个用户通过一个单独的线程进行连接,当服务器开始运行时,它就启动一个线程等待客户连接(在方法startlisten()中实现)。当接收到一个请求时,服务器立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。自定义了一个client类,它用于保存每个当前在线用户的用户名和与服务器连接的socket对象。当socket连接一旦建立,就马上将其保存在一个client对象中,以便让每个用户有自己的socket,以后可以对不同用户的socket对象进行操作,实现与客户端的数据交换。

在服务器窗口中,单击“启动”按钮,进入btnstart_click处理程序。在该处理程序中,创建了一个服务器套接字并且监听本机ip地址中的一个指定的端口,同时启动一个线程等待用户连接(在方法startlisten()中实现)。startlisten()方法是在新的进程中进行的操作,它主要用于当接收到一个客户端请求时,确认与客户端的连接,并且立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。serviceclient()方法用于和客户端进行数据通信,包括接收客户端的请求,根据不同的请求命令,执行相应的操作,并将处理结果返回到客户端,此方法完成了服务器的主要的工作。sendtoclient()方法实现了向客户端发送命令请求的功能,它利用不同用户保存的socket对象,向对应的用户发送命令请求。getuserlist()方法实现了获取当前在线用户列表的功能,它通过对clients数组的遍历,获取当前在线用户的用户名,用字符串发回。

2.客户端的实现

客户端是一个windows窗体应用程序,命名为chatclient。当运行客户端程序时,首先进入登录界面,输入用户名,单击“登录”按钮后,进入交谈主窗口(命名为login),在主窗口中可以向服务器发送信息,同时可以接收从服务器返回的信息。

(1)login.cs文件的实现

login.cs文件是登录窗体的代码文件,为了使用socket对象,在代码文件中加入名字空间system.net 、system.net..socket的引用,它主要实现了创建客户端套接字同时连接到服务器指定端口,把用户名和创建的客户端套接字传递给chatclient窗体。

(2)chatclient.cs文件的实现

chatclient.cs文件是客户端窗体(chatclient)的代码文件,在该文件中,首先获得与服务器通信的流通道,在用户登录后,向服务器发送conn命令以此说明有新的用户进入交谈室,服务器将返回所有的当前在线用户的呢称,选择不同的人,就可以与他们交谈了,如果选中“悄悄话”复选框,则具有私人交谈的功能。

当加载chatclient窗体时,便会进入chatclientform_load处理程序。在该处理程序中,首先显示用户登录窗口。如果登录成功,那么获取与服务器的连接并得到与服务器数据交互的流通道,向服务器发送conn请求命令,同时启动一个新的线程用于响应从服务器发回的信息(在方法serverresponse()中实现)。serverresponse()方法用于和服务器进行数据通信,主要是接收从服务器发回的信息,根据不同的命令,执行相应的操作。当需要进行“私人交谈” 时,便进入pricheckbox_checkedchanged处理程序。在该处理程序中主要对privatemode的布尔属性进行设置。当需要发送信息时,便会进入btnsend_click处理程序。在该处理程序中,如果privatemode的布尔属性值为false(不是私人交谈),将chat命令发送给服务器;否则(为私人交谈),将priv命令发送给服务器。当用户需要离开时,便进入了btnexit_click处理程序。在该处理程序中,将exit命令发送给服务器,停止交谈。

六、结束语

使用socket编程的关键技术可以方便地实现网上交谈工具。利用socket可以创建服务器程序和客户端程序。服务器监听本机ip地址中的一个指定的端口,建立与客户端的连接并启动一个新的线程来处理客户端的所有请求,执行相应的操作,并将处理结果返回给该客户端。客户端向远程服务器发送连接请求,得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道并通过网络流通道与服务器进行数据通信。我们可以进一步进行功能完善,进而编译成组件应用到自己的应用程序中,开发更完美的通信软件。

参考文献:

[1]谭桂华魏亮等:visual c#高级编程范例.北京:清华大学出版社,2004年5月

第8篇:socket通信范文

本系统总体设计是客户端实现用户的注册和登陆界面设计与美化工作,利用Socket编程实现和服务器通信,服务器能处理客户端发出的请求,并能实现消息反馈。服务器实现与数据库连接,实现添加、删除和修改用户信息,实现多线程支持多个客户端用户同时在线。具体流程如下图:

2系统功能与实现

2.1功能设计

系统要求用户在登陆界面可以随时浏览企业的通知等动态信息,提供用户在日常生活中用到的日历、计算机等小工具,用户可以收藏自己感兴趣的网站并查看网页排名。用户在登陆前进行注册,为维护用户信息安全,需邮箱确认。为保证数据的安全性,采用C/S模式,通过服务器获取数据信息,减少客户端PC的运行负荷,充分发挥客户端PC的处理能力,提高响应速度 。

2.2模块分析

系统主要实现的功能模块有四个,分别是:用户桌面模块、系统管理模块、数据库模块、后台服务器模块。下面对这几个模块进行分析。用户桌面模块:用户桌面模块即客户端,用来显示主界面、注册界面、登录界面。主界面提供输入用户名、密码的登录操作;注册界面提供用户注册时需注册的姓名、性别、手机等基本信息;登录界面提供用户成功登录后显示企业的动态信息、用户日常使用的小工具及用户可以自己收藏的网站等。

系统管理模块:系统管理模块实现对系统进行维护和管理。数据库模块:数据库模块实现对整个系统的数据信息的存放和更新。后台服务器模块:后台服务器模块实现各模块之间数据的转发,实现多线程,完成数据更新,实现客户端、数据库及服务器三者的交互。

3系统实现的主要技术

3.1数据库设计

系统数据库配置是采用ODBC数据源加载SQL2008数据库,使用SQL数据库查询语言。数据库设计按照确定建立数据库目的和收集数据、建立概念模型、建立数据模型、实施与维护数据库四个步骤。

数据库模型采用关系(E-R)模型,关系模型是以二维表形式展现,对数据进行划分分析后,优化的关系数据模型的数据结构可分为3张表:表1(用户表)存放用户姓名、密码、邮箱等基本信息、表2(企业表)存放企业的通知等相关信息、表3(产品表)存放企业产品的编号、价格、库存等基本信息。

3.2客户端与服务器连接

客户端与服务器的连接是实现的难点。客户端是C#编写,客户端用C++编写。可以采用Socket编程。服务器端采用C++的Socket编程,完成对数据库SQL2008的登陆连接,保证数据库只存在于服务器端,通过对于不同权限的用户,设定不同的SQL执行权限,从而保证数据的安全性。客户端采用C#的Socket编程,利用TCP协议、与服务器端统一端口号与IP地址进行连接。具体步骤如下:服务器端:

(1)加载套接字库,创建Socket;

(2)绑定Socket到一个IP地址和端口;

(3)将Socket设置为监听模式等待连接请求;

(4)请求到来接受连接请求,返回一个新的对应于此次连接的Socket;

(5)用返回的Socket和客户端进行通信;

(6)关闭Socket,关闭加载的套接字库。

客户端:

(1)用指定的端口号和服务器IP创建一个EndPoint对象

(2)创建一个基于TCP协议的套接字;

(3)利用Socket对象的Connect()方法向服务器发送连接请求;

(4)如果连接成功,利用Socket对象的Send()方法向服务器发送消息;

(5)利用Socket对象的Receive()方法接收服务器发来的消息;

(6)通信结束,关闭Socket。控制流程:

4结束语

第9篇:socket通信范文

[关键词] socket tcp协议 服务器 客户端 线程

一、引言

随着信息技术的高速发展,网上交谈已成为人们学习和工作的重要手段,那么如何设计合理的、人性化的网上交谈工具就成为当务之急。使用visual c#.net中的socket编程技术,以及多线程的知识可快速、方便地设计理想的网上交谈工具。一个socket通信无论功能多么齐全、程序多么复杂,其基本结构均应包括以下步骤:创建socket对象,建立连接;打开连接到socket的输入/输出流;对socket进行读写操作;关闭socket套接字,关闭流。

二、tcp协议通信的流程

tcp协议是面向连接的协议,它的实现需要数据发送方和数据接收方建立数据通信连接,它的具体流程如下:

1.服务器端首先创建服务器套接字

2.服务器套接字监听一个端口,等待客户端的请求

3.客户端创建一个客户端套接字

4.客户端向服务器发送连接请求

5.服务器确认与客户端的连接

6.客户端和服务器利用建立的连接进行通信

7.通信完毕后,客户端和服务器关闭各自的连接

三、socket编程简介

1.利用socket建立服务器程序

要用socket建立一个tcp服务器程序,一般需要以下几个步骤:

(1)创建一个服务器套接字,用ip地址和端口初始化服务器

(2)监听服务器端口

(3)确认与客户端的连接

(4)处理客户端的请求并回应客户端

(5)断开客户端的连接,释放客户端的连接

(6)关闭服务器,释放服务器连接

2.利用socket建立客户端程序

要用socket建立一个tcp客户端程序,一般需要以下几个步骤:

(1)创建客户端套接字

(2)连接服务器

(3)得到与服务器通信的流通道

(4)向服务器发送数据

(5)接收从服务器发回的数据

(6)断开连接

四、设计方案

1.服务器端的设计

服务器端管理着交谈任务,它维持着一张当前在线用户的列表,转发用户发送来的信息,主要功能如下:

监听本机ip地址中的一个指定的端口。WwW.133229.cOM

当有客户端向该端口发出请求时,服务器程序立即建立一个与该客户端的连接并启动一个新的线程来处理该客户端的所有请求。

根据客户端发送来的各种不同的请求,执行相应的操作,并将处理结果返回给该客户端。服务器能识别4种请求命令:conn(建立新的连接)、chat(聊天)、priv(私聊)和exit(离开),服务器接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。

2.客户端的设计

客户端应用程序包含用户登录窗口和用户交谈的主窗口,它允许用户登录到服务器,可以向服务器发送信息,同时可以接收从服务器返回的信息,设计的主要功能如下:

向远程服务器发送连接请求。

得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道(networkstream)。

通过网络流通道与服务器端的程序进行数据通信。向服务器发送服务器能够识别的以上4种命令请求,同时也接收服务器发回的命令。客户端能够识别的命令有join(通知当前在线用户有新的用户进入聊天室)、list(更新当前在线用户)和quit(关闭客户端程序)。客户端程序接收ascii字符信息,用“|”分隔信息的各个部分,一条信息包含一条命令,一个或多个信息参数。

五、解决方案

1.服务器端的实现

服务器端是一个windows窗体应用程序,命名为chatserver。当运行服务器程序时,单击服务器窗体上的“启动”按钮后,便启动了服务器进程。为了使用socket对象和thread对象,在代码文件中加入名字空间system.net、system.net..socket、system..threading的引用。

在服务器端使用了多线程,每个用户通过一个单独的线程进行连接,当服务器开始运行时,它就启动一个线程等待客户连接(在方法startlisten()中实现)。当接收到一个请求时,服务器立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。自定义了一个client类,它用于保存每个当前在线用户的用户名和与服务器连接的socket对象。当socket连接一旦建立,就马上将其保存在一个client对象中,以便让每个用户有自己的socket,以后可以对不同用户的socket对象进行操作,实现与客户端的数据交换。

在服务器窗口中,单击“启动”按钮,进入btnstart_click处理程序。在该处理程序中,创建了一个服务器套接字并且监听本机ip地址中的一个指定的端口,同时启动一个线程等待用户连接(在方法startlisten()中实现)。startlisten()方法是在新的进程中进行的操作,它主要用于当接收到一个客户端请求时,确认与客户端的连接,并且立即启动一个新的线程来处理和该客户端的信息交互(在方法serviceclient()中实现)。serviceclient()方法用于和客户端进行数据通信,包括接收客户端的请求,根据不同的请求命令,执行相应的操作,并将处理结果返回到客户端,此方法完成了服务器的主要的工作。sendtoclient()方法实现了向客户端发送命令请求的功能,它利用不同用户保存的socket对象,向对应的用户发送命令请求。getuserlist()方法实现了获取当前在线用户列表的功能,它通过对clients数组的遍历,获取当前在线用户的用户名,用字符串发回。

2.客户端的实现

客户端是一个windows窗体应用程序,命名为chatclient。当运行客户端程序时,首先进入登录界面,输入用户名,单击“登录”按钮后,进入交谈主窗口(命名为login),在主窗口中可以向服务器发送信息,同时可以接收从服务器返回的信息。

(1)login.cs文件的实现

login.cs文件是登录窗体的代码文件,为了使用socket对象,在代码文件中加入名字空间system.net 、system.net..socket的引用,它主要实现了创建客户端套接字同时连接到服务器指定端口,把用户名和创建的客户端套接字传递给chatclient窗体。

(2)chatclient.cs文件的实现

chatclient.cs文件是客户端窗体(chatclient)的代码文件,在该文件中,首先获得与服务器通信的流通道,在用户登录后,向服务器发送conn命令以此说明有新的用户进入交谈室,服务器将返回所有的当前在线用户的呢称,选择不同的人,就可以与他们交谈了,如果选中“悄悄话”复选框,则具有私人交谈的功能。

当加载chatclient窗体时,便会进入chatclientform_load处理程序。在该处理程序中,首先显示用户登录窗口。如果登录成功,那么获取与服务器的连接并得到与服务器数据交互的流通道,向服务器发送conn请求命令,同时启动一个新的线程用于响应从服务器发回的信息(在方法serverresponse()中实现)。serverresponse()方法用于和服务器进行数据通信,主要是接收从服务器发回的信息,根据不同的命令,执行相应的操作。当需要进行“私人交谈” 时,便进入pricheckbox_checkedchanged处理程序。在该处理程序中主要对privatemode的布尔属性进行设置。当需要发送信息时,便会进入btnsend_click处理程序。在该处理程序中,如果privatemode的布尔属性值为false(不是私人交谈),将chat命令发送给服务器;否则(为私人交谈),将priv命令发送给服务器。当用户需要离开时,便进入了btnexit_click处理程序。在该处理程序中,将exit命令发送给服务器,停止交谈。

六、结束语

使用socket编程的关键技术可以方便地实现网上交谈工具。利用socket可以创建服务器程序和客户端程序。服务器监听本机ip地址中的一个指定的端口,建立与客户端的连接并启动一个新的线程来处理客户端的所有请求,执行相应的操作,并将处理结果返回给该客户端。客户端向远程服务器发送连接请求,得到服务器程序的确认后,建立与服务器的连接,并获得与服务器交互的流通道并通过网络流通道与服务器进行数据通信。我们可以进一步进行功能完善,进而编译成组件应用到自己的应用程序中,开发更完美的通信软件。

参考文献:

[1]谭桂华魏亮等:visual c#高级编程范例.北京:清华大学出版社,2004年5月

精选范文推荐