前言:想要写出一篇令人眼前一亮的文章吗?我们特意为您整理了5篇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.
在Internet的通信协议中,TCP/IP协议是一组至关重要的协议,TCP和UDP又是TCP/IP中两个非常重要协议。TCP被称为传输控制协议,它是面向连接的通信协议,采用TCP协议通信的两台计算机必须首先建立连接,然后再进行数据传送,最后释放连接。TCP协议提供了端到端、全双工通信模式,这种通信模式能保证为应用程序提供可靠的、无差错的通信连接,使一台计算机发出的字节流准确无误地发送到网络中的其它计算机,对可靠性要求高的数据通信系统,一般采用TCP协议传送数据。UDP被称为用户数据报协议,是与TCP相对应的协议。它是面向无连接的协议,数据发送前不需要建立连接,而是直接就把数据包发送给接收方。
Socket被称为套接字,在计算机网络中以双工方式通信的两个进程,总要保持一个连接,从而实现服务程序和客户程序之间的稳健通信,这两个被连接的端点被称为套接字。Socket通信就是两个进程之间基于TCP连接的、端到端的通信,这种通信是双向的。TCP连接提供数据通信所需的字节流服务,这种服务是可靠的,一方发出的字节流确保能够到达对方并被接收,同时也能够保证数据的完整性。
套接字主要负责两个进程之间的通信,客户程序向套接字里写入连接请求和服务请求,然后服务器会接收连接请求,并处理这个请求,最后,服务器把处理结果写入套接字送回客户程序。具体来说,一个Socket服务器应用程序会监听某一特定端口,等待Socket客户程序的连接请求。当一个连接请求到达时,服务器和客户就建立一个通信连接。在连接过程中,客户被分配一个本地端口号,并通过该端口与Socket连接,客户通过读写Socket与服务器交换数据信息,同样,服务器也被分配一个新的端口号,它需要通过这个新的端口号,来继续监听原端口上的其它连接请求。服务器也给它的本地端口连接一个Socket,通过读写它与客户交换数据信息,以实现服务器和客户机的通信目的。
目前,用户可以使用两类套接字,即TCP协议采用的流套接字和UDP协议采用的数据报套接字。流套接字提供了双向的、有序的、无重复并且无记录边界的数据流服务。数据报套接字支持双向的数据流,但不保证是可靠的、有序的、无重复的。
2Socket通信工作原理[2]
Socket数据通信按照以下步骤进行:首先,建立Socket连接。通信正式开始之前,双方必须相互确认身份,在彼此认可对方后,建立一条专用的Socket虚拟连接通道。其次,数据通信。利用Socket虚拟连接通道发送和接收数据,从而实现服务器和客户端的通信。最后,关闭连接。通信任务完成后,将所建立的Socket虚拟连接将被拆除,释放系统资源。在Java面向对象程序设计语言中,开发包提供的ServerSocket类和Socket类及其方法,可实现上述操作。Socket工作原理如图1所示,服务器端的通信进程首先选择一个端口号,然后调用accept()方法对此端口进行监听,等待客户通信进程提出连接申请。客户端通信进程需要先创建Socket对象,在创建Socket对象时,必须指定服务器端的地址和通信端口号,这个地址和端口号必须与服务器监端保持一致。如果客户端的申请得到服务器端认可后,双方就建立了连接,那么服务器就利用accept()方法获取得客户端Socket对象,并通过该对象双方进行数据交换和数据通信。
3JavaSocket通信模型[3]
3.1建立Socket连接
首先,在服务器端创建一个ServerSocket类的实例对象,该对象用于监听客户端的连接请求,代码如下:ServerSocketserversocket;try{serversocket=newServerSocket(8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在服务器端建立ServerSocket对象实例时,必须使用try...catch语句进行异常处理,以防止程序出错时能及时处理。在生成ServerSocket对象时,必须选择一个合法的端口号,该端口号应在1024和65535之间选择,以免与常用服务程序的端口号发生冲突,上例中选用8888作为端口号。
其次,在服务器端调用ServerSocket类的serversocket对象的accept()方法进行监听,等待客户端程序的连接请求。在连接请求到达之前,线程一直处于阻塞状态,当一个连接请求到来时,初始化连接Socket类的socketobject对象,程序实现如下:Socketsocketobject;try{socketobject=serversocket.accept();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}如果连接成功,accept方法将返回客户端的socketobject对象实例。在一般情况下,通过必要的数据信息交换,将由另外的服务程序专门为该连接提供相应的信息服务,而serversocket对象实例将被释放出来,继续监听其它客户端的连接请求。
最后,在客户端建立一个Socket类的socketobject对象,请求建立连接:Socketsockettobject;try{socketobject=newSocket("Serveraddress",8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在客户端建立Socket类的socketobject对象实例时,必须处理可能发生异常情况,连接服务器的地址和端口号必须与服务器端保持一致,否则,连接将会失败。
3.2获得输入/输出数据流
连接成功后,用Socket类提供的getInputStream()和getOutputStream()方法创建输入输出数据流对象,同时要在trycatch块中进行异常处理,代码如下:try{InputStreaminputstr=socketobject.getInputStream();OutputStreamoutputstr=socketobject.getOutputStream();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}
3.3读写数据
在获取socket对象的输入输出流后,为了便于进行读写操作,需要在这两个流对象基础上建立易于操作的数据流DataInputStream、DataOuputStream或PrintStream,用下面的程序代码实现:DataInputStreamdatainstr=newDataInputStream(inputstr);BufferedReaderbufferrd=newBufferedReader(datainstr);DataOuputStreamdataoutstr=newDataOuputStream(outputstr);PrintStreamprintstr=newPrintStream(outputstr);要读取一字符串,然后将字符串的长度写入输出流,操作语句如下:Stringstring1=bufferrd.readLine();dataos.println(string1.length());
3.4断开连接
在通信结束时必须断开连接,释放所占用的资源,关闭socket。Java提供了close()方法来完成该项任务,语句如下:socketobject.close();//关闭Socket对象serversocket.close();//关闭ServerSocket对象
关键词:socket;TCP/IP协议;网络通信模式;并发响应
中图分类号:TP393.09
随着科学技术水平的不断快速提高,互联网的网络通信应用越来越广泛,已经成为人们日常生活中不可或缺的一部分,通过互联网络通信,人们彼此之间可以实现数据传输、信息共享等功能,从而提高现代人的生活质量。然而互联网的数据传输并不是漫无目的地随机传输,而是基于一定的通信协议和通信机制,TCP/IP通信协议以及Socket进程通信机制就是现代互联网络中常见的网络通信协议和通信机制。特别的,基于Socket的TCP/IP协议的网络通信模式是现代网络通信网络中常见的通讯模式,来实现服务器进程和客户端进行的相同通信,从而为互联网奠定了通信基础。所以对于基于Socket通信机制的TCP/IP网络通信模式的研究就有非常重要的现实意义,可以为我们对于网络设备的数据传输以及客户端服务器模型的构建打下坚实的基础。
1 TCP/IP通信协议以及Socket提供的编程接口
1.1 TCP/IP通信协议
一般的,互联网络通信模型有七个层次结构,分别为应用层,表示层,会话层,传输层,网络层,数据链路层以及物理层,而TCP/IP协议是应用在传输层和网络层的传输控制以及因特网的互联协议,用来规定网络设备如何接入到互联网以及设备之间的数据传输的标准。
在实际的互联网络中,当有两台计算机相互通信时,基于TCP/IP通信协议的要求,首先两台计算机要建立连接,然后进行数据通信。建立连接和数据传送的过程都是通过TCP/IP报文的形式发送的,首先发送计算机会将通信数据或者连接请求打包成TCP/IP报文的形式通过二者之间相连的互联网络电缆线以及路由网关等网络设备进行通信,而通信报文中会携带TCP/IP协议相关的识别字符串以及IP地址等在路由中进行选择,进而送至目标计算机。基于TCP/IP通信协议的报文格式如图1所示。
在互联网中发送的数据帧中,是包含各种协议的识别部分,其中TCP/IP协议的通信协议识别符就包含在数据帧中,并以图1.格式所示。每个数据帧中,去掉其他协议的头部识别数据,就可以得到TCP/IP协议的通信报文,该数据报文包括了IP协议的识别数据以及TCP协议的识别数据。通信报文中IP头数据包括了两台计算机的应用程式使用的IP协议版本以及IP头首部长度等等标示IP协议的信息,最重要的,包含了发送该条通信报文的源地址和目的地址,他们是以IP地址的二进制标示在数据报文中,通过该报文中的目的地址,通信数据就可以在互联网络中根据路由器中的路由列表来查找目的IP地址并自动选择路由,从而发送至目标计算机。同样的,将IP通信报文去除IP头数据后就可以得到TCP协议的通信报文,而TCP协议的头数据中,也包含了TCP通信的各种识别数据。在TCP协议头数据中包含了端口号、序列号、验证信息等内容,其中对通信来说比较重要的就是端口号数据,它包含了两台通信计算机的数据发送方的发送端口以及数据接收方的接收端口,从而使得这条TCP/IP通信报文在找到目标计算机后可以通过目的端口将该信息传送至应用程序,从而实现两台计算机的信息通信。所以对于两台计算机进行同时通信时,TCP/IP协议为发送的通信数据提供了通信识别符以及进行识别符,即目的IP地址和目的端口,通过识别符,通信数据就可以通过网络发送至目标计算机,从而实现互联网的通讯。
1.2 Socket
Socket是面向客户/服务器模型而设计的,针对客户与服务器程序之间的相互通信而提供的通信机制。Socket通常被称为“套接字”,通过Socket“套接字”的方式,计算机中的应用程序来向网络发送各种请求以及对网络的请求进行应答。Socket是独立于TCP/IP协议,工作在IP通信报文以及计算机应用层之间的网络编程接口,其中包含了流失套接字(SOCK_STREAM),数据包套接字(SOCK_DGRAM)以及原始套接字(SOCK_RAW)。流式套接字为应用层提供了一个面向连接的可靠的数据传输服务,可是使网络层的传输报文向应用层无差错、无重复地按照顺序接收;数据报套接字则提供了无连接服务,此时数据包可以独立的数据包进行发送而没有具体的保障措施;原始套接字则是为应用层提供了对IP、ICMP等网络协议的低层次的访问。
2 使用Socket实现TCP/IP网络通讯模式
由于TCP/IP通信协议的核心是在传输层、网络层以及物理接口层,但是他们只是向外提供了原始的不是直接的用户服务接口,开发者不可能直接编写TCP/IP协议头来发送具体的数据信息,而Socket则为TCP/IP通信协议提供了独立于协议的网络编程接口。通过Socket提供的网络编程接口,应用程式就可以通过Socket套接字接口来读取来自网络的IP通信报文,从而获取源计算机发送的数据信息,所以,可以根据TCP/IP协议和Socket来实现两台计算机的通信框架。
常见的请求响应的实现方案有两种,包括并发响应和重复响应。并发响应模型是处在等待状态的目标计算机在源计算机发送数据到达后通过产生子进程来响应源计算机请求而父进程继续等待请求,重复响应模型是维护请求列表并按照FIFO的原则对源计算机的请求进行处理。利用Socket创建并发响应模型时,首先创建新的Socket并将端口以及本地地址赋值给它,然后让Socket开始对端口进行监听,而此时,源计算机可以通过发送包含有目标计算机的IP地址和端口号的IP协议通信报文来向目标计算机发送请求,此时目标计算机的Socket就可以通过监听端口发现有请求到达,然后就可以产生新的Socket进行对源计算机发送的IP通信请求进行处理,而原有的Socket进行则继续对端口进行监听。重复响应的通信框架与并发响应通信框架不同的是在创建的Socket监听到端口有请求发送时会直接对请求处理而不会创建新的Socket进程,所以需要对源计算机的请求进行列表维护,来对所有监听到的请求进行相应。
总的来说,TCP/IP协议为传输数据提供了通信识别标示,这样通信数据可以在互联网中自动查询路由来到达目标计算机和目标端口,而Socket则对目标端口进行实时监听,当有发送数据到达时,Socket就可以将传输数据提供给应用层,从而实现两台计算机之间通过互联网络的通信。
参考文献
[1]刘骏,颜钢锋.基于Socket的网络编程技术及其实现[J].江南大学学报,2004(03).
[2]徐向东,周国祥,石雷.基于TCP/IP和Winsock文件上传的应用研究[J].合肥工业大学学报(自然科学版),2008(11).
[3]王静,曲凤娟.基于Socket的多用户并发通信的设计[J].福建电脑,2007(03).
[4]罗亚非.基于TCP的Socket多线程通信[J].电脑知识与科技,2009,03.
关键词:嵌入式;socket;串口通信;网络通信
本文的背景是研究通过对摄像头的远程控制从而对运动图像加以采集和处理。该系统的音视频编解码部分,是基于windows系统用vc进行的开发,实现对图像视频的编解码处理,摄像头的远程控制系统主要是通过linux系统设计。统通过串口和网络进行传输和控制。系统采用c/s模型,pc机作为client端,根据采集到的数据进行编解码后,发送出对摄像头的控制命令,通过网络传输到arm9平台上,arm平台作为server端在接收到client端发送的命令后,通过串口发送命令来控制摄像头。
1 串口通信
1.1 linux下串口通信基本原理
linux系统将设备和文件的操作都作为对文件的处理,所以对设备的操作,内核会返回一个文件描述符,需要将其作为参数传给相对应的函数。linux中所有的设备文件都放在“/dev”目录下,通过“ttys+编号”命名相应的串口资源,所以对应路径是“/devttys*”。因而可以相对文件读写那样访问一个串口设备。
1.2 linux下的串口设置
首先要对串口进行设置,在termios.h完成对波特率等的设置。
struct termios
{tcflag t c iflag;
tcflag t c oflag;
tcflag t c cflag;
tcflag t c lflag;
cc t c cc [nccs];
};
open()函数:int fd = open ("/dev/ttys *", o rdwr|o noctty|o ndela y);
然后调用read()和write()函数读写端口,返回实际读写的字节数,如果有错误发生则返回-1。
读取串口结束后,首先恢复串口原始属性,然后才可以关闭串口并退出程序。
1.3 串口控制应用程序
下面给出本系统中一个通过串口控制摄像头的函数的一部分结构:
void sendmsg(int pan,int tilt)
{struct timeval timeout;
static char *driver = "/dev/ttys1";
timeout.tv_sec = 0;
timeout.tv_usec = 0;
formcmd(buf,pan,tilt);
fd = uart_open(driver,b9600);
write(fd,buf,16);
close(fd);
}
2 网络通信
2.1 socket基本原理介绍
socket是一种通信机制,客户/服务器系统既可以在本地单机上运行,也可以在网络中运行。
首先需要了解socket中的一些重要函数:
1) 创建socket:int socket( intdomain, inttype, intprotocol);
2) 配置socket:bind函数指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);
3) 使用listen( )和accept( )函数获取远端信息:
int listen(int socket, int backlog);
int accept(int socket, struct sockaddr* address, size_t* address_len);
4) 通信处理:send( ),write( ),recv( ),read( )。
5) 通信结束:使用closesocket( )。
2.2 windows和linux下socket应用程序
客户端程序:创建一个未命名的套接字,然后把它连接到服务器套接字server_socket上,向服务器写一个字符,再读回经服务器处理后的一个字符。
服务器端程序:首先创建一个服务器套接字,绑定到一个名字,然后创建一个监听队列,接收来自客户程序的连接。
下面我们分别在windows和linux下进行socket编程,实现二者之间的通信,具体函数实现的主要部分如下:
windows下作为client端:
{
socketclient=socket(af_inet,sock_stream,0);
addrsrv.sin_addr.s_un.s_addr=inet_addr("192.168.1.10");
while(1)
send(socketclient,sendbuffer,16,0);
closesocket(socketclient);
wsacleanup();
}
linux下作为server端:
{
server_sockfd = socket(af_inet, sock_stream, 0);
server_address.sin_addr.s_addr = inet_addr("192.168.1.10");
bind(server_sockfd, (struct sockaddr *)&server_address, server_len);
listen(server_sockfd, 5);
client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
while(1)
read(client_sockfd, str,16);
close(client_sockfd);
}
3 结束语
本文设计了基于嵌入式平台上可移动摄像头远程控制,对串口通信和网络通信的原理和机制加以阐述,对串口驱动和网络驱动的编写提出了具体的方法,并且在实际的操作应用中给出了具体函数的编写。本文所提供的处理方法已在实际的项目中的得到应用,对于其他的通过串口通信和网络通信控制的设备,具有参考意义,今后我们还将展开进一步的相关研究。
参考文献:
[1] 刘智国,张海春.基于s3c2410的嵌入式串口通信设计[j].微计算机信息(嵌入式与soc),2009,25(4-2).
关键词:VC++6.0; UDP协议; Socket; FTP协议
中图分类号:TN94834文献标识码:A文章编号:1004373X(2011)23005203
Design of Network Communication Based on VC++ 6.0
SUN Junwen, AN Ni, WANG Zhongxun
(Institute of Science and Technology for OptoElectronics Information, Yantai University, Yantai 264005, China)
Abstract: Network communication is a data exchange process through Internet. With the continuous development of Internet technology, network communication technology has been applied to remote control and various instant communications in various industries. The network communication system based on VC++ 6.0 was designed, the network instant communication by using VC++ 6.0 builtin socket and UDP protocol was realized, and the file transfer based on FTP protocol was achieved. The system is intuitive, has high reliability and nearly won′t happen data loss when transferring files. It has widely application value.
Keywords: VC++ 6.0; UDP protocol; Socket; FTP protocol
收稿日期:20110601
基金项目:山东省自然科学基金资助项目(ZR2009GM026)0引言
随着计算机技术和现代通信技术的发展,人类已经步入以数字化和网络化为特征的知识经济时代。传统的通信模式如电话线路其成本高而且可视化的程度不如网络通信。随着网络的普及,网络通信的优势已经逐步显现,将成为未来人们通信的一种重要的方式[1]。
VC++6.0是一种面向对象的计算机程序设计语言,其界面友好,功能强大,可移植性好,广泛应用于各个行业,它既支持面向过程的程序设计,也支持面向对象的程序设计,适合大中小型的项目开发,因此本系统采用VC++6.0进行开发设计[2]。
利用VC++6.0的MFC设计网络通信,已经成为一种主流的设计方案,伴随着以太网的逐步发展,基于VC++6.0的网络通信可以有助于人们之间的信息交互,在未来的发展中将会得以进一步的成熟和完善。
1软件系统总体设计流程
网络通信是人与人之间通过网络资源进行信息交流与传递。局域网中最常用的有3个网络协议:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和交叉平台TCP/IP,由于只有TCP/IP允许与Internet完全地连接,所以本系统采用TCP/IP协议[3]。
在通信的过程中,位于局域网中的客户端可以与IP网络相连,通过VC++6.0内置的IP控件实现端与端之间的信息交互。网络整体架构如图1所示。
图1网络整体架构图本系统包括即时通信模块和文件传输模块。采用基于对话框的MFC设计,基于事件触发的思想,界面设计包括基于VC的网络通信设计总界面、私聊界面和用户设置界面,其中总界面通过按键可以实现选择文件传送还是聊天功能,这些功能通过手动触发实现。系统总体设计流程如图2所示[4]。
2系统设计思想
2.1聊天功能设计思想
本系统设计的聊天功能主要是基于UDP协议的通信,采用Socket接口,所谓Socket通常也称作“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求。Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话,是TCP/IP网络的API[5]。
图2程序流程图Socket有流式Socket(SOCK_STREAM)和数据报式Socket(SOCK_DGRAM)。流式Socket是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。在本系统中采用基于UDP的数据报式Socket。下面简要分析两者的优缺点[6]。
TCP协议基于三次握手机制,可以保证数据的安全性,顺序进行数据传输,但是TCP必须创建并且保持一个连接,这给系统增加了开销,而UDP协议尽最大可能进行保温传送,所以有效性远远不如UDP协议,因此一般的即时通信中都采用UDP协议,本系统采用了基于UDP协议设计聊天程序[7]。
聊天的创建程序如下:
wVersoinRequested = MAKEWORD(1,1);
m_socket=socket(AF_INET,SOCK_DGRAM,0);//创建一个UDP套接字
if(INVALID_SOCKET==m_socket)
{
MessageBox(″套接字创建失败!″);
return FALSE;
}
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));//绑定
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox(″绑定失败!″);
return FALSE;
}
2.2文件传输功能设计思想
文件传输协议是一个用于不同的主机之间进行文件传送的协议标准,用来实现文件之间的共享、鼓励间接或者隐式地使用远程计算机、向用户屏蔽不同主机中各种文件存储系统的细节和进行可靠及高效地传输数据。在本系统的设计中采用TCP协议实现了文件的可靠传输与不同主机之间的资源共享[8]。
FTP有主动和被动两种模式。主动模式下有客户端和服务器端,并要求二者同时打开并监听端口,是一种面向连接的传输;被动模式下只要求服务器产生意见监听端口的进程,这样程序的运行就可以绕过防火墙。所以在本设计中采用了被动模式[9]。
文件传输的主程序设计如下:
IPselect=m_listIP.GetItemText(n,0);//获取选中的IP
CFileDialog fileDlg(TRUE);//文件对话框为打开
if(IDOK == fileDlg.DoModal())//如果按确定按钮
{
CString filename=fileDlg.GetFileName();
CFile fileOpen;
if(!fileOpen.Open(fileDlg.GetPathName(),CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox(″无法打开文件″, MB_OK | MB_ICONERROR);
return;
}
int len=fileOpen.GetLength();
char* data = new char[len];
fileOpen.Read(data,len);//读入文件内容
char *cc=new char[10000];
memset(cc,0,10000);
sprintf(cc,″%d%s%s%d%s%d%s%s%s″,strlen(IPselect),″文件″,IPselect,len,″@″,
filename.GetLength(),″@″,filename,data);
senddata(cc);
fileOpen.Close();
MessageBox(″文件发送完成!″);
}
3各功能模块的设计
系统的界面分为总界面设计,私聊界面和用户设置界面三大部分,三部分分别执行相应的功能,下面逐步进行介绍。
3.1总界面设计
该模块是整个系统的基础模块,它负责初始化整个应用程序,首先初始化套接字,并接收和发送各种消息信息,然后根据收到的信息进行判断该执行什么功能,进而建立应用进程。在该界面的设计当中为了使用户方便进行操作,建立了一个包含用户的IP地址和主机名的IP地址列表。在该界面的右侧是群聊窗口可以向所有的用户发送数据,并接收其他用户发来的消息。
为了方便用户操作,最右侧是一个该系统的介绍,最下面的几个按钮是方便用户进行功能选择所建立的,从而使该系统看起来比较直观。
3.2用户设置界面设计
在该系统的通信过程中,如果靠记忆用户的IP地址来进行通信,容易使人烦躁,所以增加这个模块,来使该系统更加地人性化。在软件的使用中可以先进行通信获得其他用户的信息后,点击设置按钮来更改主机名,也可以修改自己的主机名。通过这两种方式可以让用户更加自主地设计主机名,并且方便用户识别自己的信息。
在该界面中包含自己的IP地址、所在的IP网段和主机名三部分,用户可以自主修改。修改后在主界面中就会显示用户信息了。
3.3私聊界面设计
该模块可以和指定的用户进行聊天。可以通过选中IP列表中的用户信息单击进行私聊,但是用户不能和自己进行聊天,聊天的内容不会被其他用户看到。
在该程序设计中,应用了UDP协议,界面中安置了三个按钮:清空、发送、关闭,从而方便用户进行操作。该系统运行时,当一方退出程序,就会通知另一方,并把聊天记录存于指定的文本中,如果该文本已经存在,则把聊天记录插到该文本的后面,并保存该记录,方便用户日后进行查看。
3.4刷新模块设计
该模块可以手动进行刷新用户信息,可以解决网络不同步带来的IP地址列表不能及时更新的问题,单击刷新按钮,系统会清空自己的IP地址列表,并向局域网发送自己的IP主机名和地址信息,其他用户收到后会恢复自己的IP地址和主机名,然后系统会更新自己的IP列表,从而达到网络的同步功能[10]。
3.5发送文件模块设计
该模块可以向指定的用户发送文本文件。用户可以选中IP列表中的用户,单击发送文件按钮,把要发送的文本文件发送给指定的用户,对方接收后,会提示进行保存处理。
4系统功能测试
私聊界面可以通过点击私聊开启,当编写完要发送的数据时点击发送即可,点击关闭按钮会弹出提示框,询问用户是否要退出该进程,如图3所示。
文件传送功能的使用,首先选择完用户后,单击文件传送,会弹出如图4所示的界面要求用户选择要传送的文件,在接收端,则要求用户选择存放的位置。
图3私聊界面图4文件传送界面颜色的设定,由于不同的人有不同的喜好,所以增加该模块来方便用户设置背景颜色,如图5所示。
图5背景颜色设定5结语
本文给出了一种基于UDP和FTP协议的网络通信设计方案,实现了基于UDP的即时通信和基于FTP协议的文件传输。本设计最大的优点是操作直观,可靠性高,文件传送中几乎不会发生数据的丢失。其主要缺点是没能实现视频的通信,其功能还不够全面,但是在一些小型的局域网中,由于其占用内存少且无需安装,因而有广泛的实际应用价值。
参考文献
[1]马丹.即时通信系统终端的设计与实现[D].成都:电子科技大学,2004.
[2]熊华胜,边信黔.VC++ 6.0环境下实现基于UDP协议的异步广播通信[J].应用科技,2004,31(2):4446.
[3]中国教育和科研计算机网.网络协议TCP/IP、IPX/SPX、NETBEUI简介[EB/OL].[19940111]./20010830/210056.shtml.
[4]胡春安,胡中栋.MFC中对话框的创建和应用[J].电脑开发与应用,2005(9):5859.
[5]杨阳,唐波.远程控制软件编程之多用户显示[J].黑客防线,2009(1):110112.
[6]陈海蕊,郝世选.VC中基于Socket的局域网监控软件[J].濮阳职业技术学院学报,2009,22(6):136138.
[7]宋hh,吴刚,杜刚.基于UDP协议的数据传输[J].中国电子商情:通信市场,2010(2):176179.
[8]张喻平.基于互联网的视频远程回放技术的研究[D].武汉:武汉工业学院,2007.
[9]张承钊.互联网转换网关中FTPALG的设计与实现[D].成都:电子科技大学,2006.
[10]陈小兵.IP编址原则[J].网管员世界,2005(7):107.
作者简介: 孙军文男,1968年出生,山东烟台人,中级实验师。主要研究方向为物理实验。