socket通信范例6篇

socket通信

socket通信范文1

关键词:Linux环境;Socket;网络通信

中图分类号:TP316文献标识码:A文章编号:1009-3044(2011)26-6347-02

Linux Environment Based on Socket Communications Research Network

HAO Bao-fang, YUAN He-gang

(Zhongwei City Power Supply Bureau, Ningxia Power Company, Zhongwei 755000, China)

Abstract: Linux as a more free and open source operating system, with the continuous development of information technology, has also been the promotion process in the Linux environment based on Socket network communication has become a hot research, not only because Socket is used for communication between single processes, but also can be applied to network traffic, in a Linux environment with strong applicability. This paper studies the Socket interface in the Linux environment and its communications network model. Hope that through this study, can Socket applications in a Linux environment to provide a reference and learning.

Key words: linux environment; socket; network communication

在当今社会,网络已经成为了我们生活、生产中必不可少的一个要素。因此,对于任何一个操作系统而言,对于网络的支持都是至关重要的。Linux操作系统也不例外,它能够兼容多种网络协议,而且本身的安全性更高,因此被广泛的用在多个领域,基于Linux环境开发更为高效的网络通信程序也成为了一个热点。Socket作为应用层与传输层之间的一个非常重要的编程接口,能够提供访问下层通信协议的数据结构,同时,在Linux系统环境之下,应用程序要访问下层协议,唯一的途径也是采用Socket接口。从这个角度来看,本文研究Linux 环境下基于Socket 的网络通信具有非常重要的现实意义。

SOCKET是美国加州Berkley大学提出的,是以传输层协议为基础的一种套接字规范,从网络整体来看,这是一个虚拟的不同主机应用程序之间的一个借口,具有跨平台的特征;从程序员的角度来说,这是一个连接网络技术设备和应用程序的一个接口。SOCKET是专门为UNIX操作系统所开发的,对两台计算机之间的通信规范做出定义,通俗点讲,如果说两台计算机之间进行通信的途径是同一个通道,那么该通道的两个端口就是套接字。底层通信软件和具体的操作系统之间的差异在SOCKET中被屏蔽掉了,这样就保证了只要两台计算机安装了TCP协议软件并且实现了SOCKET规范,那么其相互之间进行通信的可能性。作为SOCKET接口的API,无论是在TCP或IP网络中,还是在互联网中都具有很强的通用性。

1 Socket接口概述

当前的网络应用中,Client或者Server这两种模式是进行通信的双方使用频率最高的交互模式,在通常情况下,监听或者连接分别是客户以及服务器模式所采用的实现方式。借助服务器端的应用程序在一个端口可以对发送至服务器的请求进行监听,换句话说,一般情况下,服务器的进程始终是出于休眠状态的,除非有客户向该服务器发送了一个连接的请求,在服务器一个端口接收到来自于客户的请求时,服务器线程就会从休眠状态转为工作状态,根据客户的具体请求做出相应的反应,提供客户所需要的服务。

Socket接口是使用标准系统文件描述符与其他程序进行通信的一种非常重要的方式。它的工作方式是由一个套接字描述作为一个通信连接的端口,不同的端口之间可以通过套接字来完成信息的发送和接收。上文已经描述了Linux系统能够支持多种网络协议,而由于不同的协议其工作的方式和地址格式都不相同,而对于不同的网络协议而言,使用用一个网络地址的格式,就可以称之为一个协议地址族,表1是Linux支持的常见的网络协议地址族。

在Linux环境下,能够将套接字地址族抽象成一个统一的套接字Socket接口,在该接口的支持下能够完成应用程序的接口的开发。具体的,在Linux环境下的Socket接口主要有如下几种:1) SOCK_STREAM,数据流套接口;2) SOCK_DGRAM,数据报套接口;3) SOCK_RAW,原始套接口。

2 Socket网络通信模型

2.1 Linux环境下基于Socket的网络通信模型

从目前来看,主流的网络通信模型主要有两种,其一是C/S架构及,客户端/服务端架构;其二是B/S架构,及浏览器/服务端架构。本文研究的是客户端/服务端架构,在该架构下的Socket网络通信模型需要完成客户程序编写和服务程序编写。

客户端程序的编写步骤如下:创建Socket接口与远程服务程序连接读写数据终止连接。

服务程序的编写步骤如下:创建Socket接口绑定bind接口设置Socket接口为监听模式接受请求读写数据终止连接。

2.2 Socket函数的调用

在创建Socket步骤,应用程序在使用Socket接口之前,首先需要调用一个套接字也就是Socket函数,系统在调用Socket函数的时候,应该向程序提供创建Socket的手段,如:

int socket(int domain,int type,int protocol);

在上述命令中,调用的三个参数分别是domain,type以及protocol。

在指定地址步骤,需要将Socket地址与所创建的Socket字号联系在一起,可以通过如下命令实现:

int bind(int sockfd,struct sockaddr*my_addr,int addrlen);

在建立Socket连接步骤,可以通过int connect (int sockfd,struct sockaddr*serv_addr,int addrlen)实现;在监听连接步骤,可以通过int listen(int sockfd,int backlog)实现,通过该命令,服务进程能够监听来自客户进程的所有的请求,如果请求的队列长度大于命令中的backlog,则服务不会予以相应;在数据传输步骤可以通过int send以及int recv两个命令分别调取sockfd,const void *msg,len以及 flags函数实现,上述两个函数的主要作用在于完成流失Socket的通信;在关闭Socket步骤,可以通过int close命令调取socket文件描述符sockfd,以完成整个客户进程以及服务进程的通信。

3 结束语

在Linux系统环境之下,应用程序要与下层协议完成通信,需要借助Socket接口,本文研究了Socket接口的基本理论,介绍了在Linux环境下的数据流套接口,数据报套接口以及原始套接口。在此基础上文章介绍了Linux环境下的Socket网络通信模型,以客户端/服务端架构模型为例研究了该模型实现过程中的Socket函数的调用。希望通过本文的研究能够为Socket接口在Linux系统环境下的网络通信程序的设计和实现提供一定的参考和借鉴。

参考文献:

[1] 孔明,艾树峰,杜辉.基于TCP/IP的嵌入式WebServer网络测控系统设计[J].电讯技术,2005(5).

[2] 吴涛,黄心汉,黄振宇.基于Linux的多移动机器人通信的原理与实现方法[J].电工技术,2003(12).

[3] 刘煜禹,姜国兴.基于Socket的多媒体视频会议系统[J].重庆工学院学报:自然科学版,2007(6).

socket通信范文2

关键词:Java;Socket;ServerSocket;通信

一、 引言

随着计算机网络的快速发展,带动了Java语言的发展,Java越来越成为网络上广为流行的编程语言。Java是由Sun Microsystems公司于20世纪末推出的一门面向对象程序设计语言(简称Java语言)。用Java实现的支持Java applet的浏览器充分的展示出了Java的优势和魅力:跨各种操作系平台、实现动态的Web技术、安全的语言权限检查环境、JDK类库提供的丰富网络类库,易于实现网络编程的开发。Socket是Java网络编程的基础,本文就是从套接字的基本原理和使用方法出发,并通过一个简单网络通信例子,讲述在Java中使用Socket进行网络编程。[1]

二、Socket通信的基本原理

1.什么是Socket

Socket通常也称作“套接字”,当网络上有两个程序要进行会话的时候,就会通过一个端口发送请求或者应答命令,这个端口就是套接字。通常用Socket建立客户端和服务端的双向连接。在网络通信中Socket主要是基于TCP/IP协议标准,它是在TCP/IP协议中使用很广泛的一个编程界面,在通信过程中Socket的端口号和IP地址都是唯一确定的。

2.Socket的通信模式

Socket是基于C/S模式通信的,即面向客户/服务器模型设计。在客户端,使用套接字对特定网络位置的某一服务器端口发出请求连接,当连接成功后就会开始进行会话,然后才关闭端口。客户端的端口通常情况下是动态和随机分配的。在服务器端,我们首先需要监听端口,使用ServerSocket来指定需要进行通讯的端口,在客户请求道端口后成功后,服务器端进行连接,完成会话,在双方通讯完毕后,关闭连接。

在任何一个完善的Socket工作过程中,都要按照以下几个基本的步骤,才能建立正常的通信机制。首先创建一个Socket;然后进行连接请求道套接字的I/O流;再次依据通讯过程中采用的协议标准对套接字进行读或写的操作;最后完成会话并关闭Socket。

3.创建Socket

我们利用包中的两个类Socket和ServerSocket来分别建立到客户端和服务端的套接字连接。客户端程序使用Socket类建立到服务器的套接字连接。其构造方法如下:

public Socket():通过系统默认类型的SocketImpl创建未连接套接字。

public Socket(String host, int prot);连接到指定的主机和端口号。

Socket(InetAddress address, int port, boolean stream);连接到指定IP地址,主机端口和数据报方式的流。[2]

服务器端程序任务主要是监听,等待客户机连接,建立一个等待客户端连接的ServerSocket套接字。构造方法如下:

public ServerSocket(int port); 连接到的特定端口。public ServerSocket(int port, int backlog); 在声明构造方法时候,必须对创建的 Socket或ServerSocket捕获异常或抛出例外。

三、基于Socket的简单通信实现

服务端的程序:

public class ServerDemo{

public static void main(String args[]) {

try{

ServerSocket ser=null;

ser=new ServerSocket(8080);//在端口8080监听请求

Socket client=server.accept();//保存接受请求信息

System.out.println("IP:"+client.getInetAddress());

System.out.println("Port:"+client.getPort());

ser.close();//关闭Socket

}catch(IOException e) {

System.out.println("Error."+e);

}

}

}

以上程序是一个基于Socket的简单通信。

四、结语

这是一个简单的基于Socket的通信应用,展现了Socket实现网络编程的易实现性和其基本的通信原理,还有很多更深层的功能需要去挖掘,才能显示其强大的网络编程能力。

参考文献

socket通信范文3

关键词:Linux;嵌入式;网络编程

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2009)15-3953-02

Applications of Network Programming in Embedded Linux Systems

JIANG Ai-zhen

(Channel 561 in SARFT,NanChang 330046,China)

Abstract: Linux supports a wide range of types of socket addresses and the abstract cluster as a single socket interface, the introduction of the abstract is for the convenience of Internet application programming, as well as web applications to provide data communications between the convenience. In this paper, starting from the basic concepts of socket, introduced the basic model of network programming and the Linux kernel support for the socket.

Key words: Linux; Embedded; Network programming

1 socket概述

在Linux中的网络编程是通过socket套接字接口来进行的,这一抽象的引入是为了方便联网应用程序的编程,在UNIX的BSD版本第一次使用了这种接口,因此他也叫做BSD套接字。应用程序可以使用这种统一接口收发网络上的数据,网络的socket数据传输是一种特殊的I/O口,socket也是一种文件描述符。套接字的设计符合Linux的习惯,在理想情况下,应将所有可读写访问的对象映射成文件,这样就可以用普通的文件读写操作来处理这些对象了,使通信中的收发可以很容易映射成读写操作。在传输协议的上下文中,由这类读写操作的对象就是通信关系的两端,他们表示成了套接字。

BSD套接字是一个通用接口,它支持不同的网络结构,同时也是一个内部进程间通信机制。当一个主机上同时有多个应用程序在运行,他们使用tcp和udp协议进行通信,则传输层协议收到数据后将根据端口和套接口区分数据是传给哪个应用程序。端口是标识传输层与应用程序的数据接口,每个端口有一个16位的标识符。套接口是IP地址与端口号的组合,用来标识全网范围内的唯一一个端口,在tep和udP协议中用来标识一个连接,网络应用程序之间通过套接口来实现通信。套接字是套接口描述字的简称,是整型数字,它与文件描述符共用一段数值空间O_65535。应用程序中使用套接字来调用套接口,套接字可认为是指向套接口的指针,就像文件描述符是指向文件的指针一样。一个套接字描述了一个链接的一个端口,一个socket端点可以用socket地址来描述,socket地址结构由正地址,端口和使用协议组成(TCPorUDP),因此两个互联的进程都要有一个描述他们之间连结的套接字。我们也可以把套接字看作为是一种特殊的管道,只是这种管道对于包含的数据量没有限制。套接字存在于特定的通信域(即地址族)中,只有隶属于同一地址族的套接字才能建立对话。Linux支持的协议族有AF_INET(IPv4协议)、AF_INET6(IPv6协议)和AF_UNIX(Unix域协议)。

Linux支持多种套接字类型,每种套接字类型对应于创建套接字的应用程序所希望的通信服务类型。同一协议簇可能提供多种服务类型,比如TCP/IP协议族提供的虚电路和数据报就是两种不同的通信服务类型。TCP/IP中常用的socket类型共有三种,一种是流式socket(SOCK_STREAM),另一种是数据报式socket(SOCK_DGRAM),还有一种是原始socket(SOCK_RAW)。流式socket是一种面向连结的socket,对应于面向连接的TCP服务应用。数据报式socket是一种无连接的socket,对应于无连接的UDP服务。原始套接字接口容许对较低层协议如IP、ICMP直接访问,常用于检验新的协议实现或访问现有服务中的新设备。

2 网络编程基本模式

2.1 客户机/服务器模式

网络编程的基本模式是Client/Serve:模式,该模式的建立基于以下两点:

1) 非对等作用;2)通信完全是异步的客户机/服务器模式在操作过程中采取的是主动请示方式,首先服务器方要先启动,并根据请示提供相应服务。Server端首先调用socket创建一个一定类型socket,然后通过bind函数将这个socket绑定到一个client知道的端口上,接着server调用Listen函数设置倾听队列的长度,为了接收来自client端的请求做准备,然后server调用accept,开始在所绑定的端口倾听来自client端的连接请求。如果socket被设置成阻塞方式, accept调用将被阻塞,进程被挂起,直到server收到来自client的请求后,accept才返回。Client端通过socket调用创建一个一定类型的socket(应当和server的socket类型相同)。然后调用connect函数向server所在的主机发出连接请求,连接时,需要指定server所在主机的IP地址和server倾听的端口号,连接的报文包含了client端的初始的序号SYN a和MSS=1460信息(最大数据段的大小)。正在倾听来自client的连接请求的server收到client的连接请求后,server从accept调用中返回(通常socket是阻塞方式工作的)。server将会向client端发送server端的初始序号SYN b和对client端的SYN a的确认ACK=a+l,还有本端的最大数据MSS当client端接收到server端的回应时,将发出对server请求的ACK=b+1。然后client从connect中返回,返回值是一个打开的socket的描述符,这个描述符和文件的描述符类似,程序可以像使用文件的描述符一样使用它。稍后,在server端收到client端对其请求的回应时,server将从accept调用返回,返回值也是一个socket的描述符。

2.2 面向连接协议的字节流套接字编程

字节流socket采用的是传输控制协议TCP。TCP提供面向连接的流传输,面向连接对可靠性的保证首先是它在进行数据传输前,必须在信源端和信宿端建立连接。在面向链接传输的每一个报文都需要接收端确认,未确认的报文被认为是出错报文。字节流套接字的服务器进程和客户进程在通信前必须先建立连接,建立连接和通信的步骤如下:

1) 服务进程首先调用Socket()创建一个字节流套接字,并调用bind()将服务器地址捆扎在该套接字上,接着调用listen()监听连接请求,随后调用accept()做好与客户进程建立连接的准备,无连接请求时,服务进程被阻塞;

2) 客户进程调用Socket()创建字节流套接字,然后调用connect()向服务进程发出连接请求;

3) 当连接请求到来后,服务进程被唤醒,生成一个新的字节流套接字,并用新套接字同客户进程的套接字建立连接,而服务进程最早生成的套接字则继续用于监听网络上的服务请求;

4) 服务进程和客户进程通过调用read()和write()交换数据;

5) 服务进程和客户进程通过调用close()撤消套接字并中断连接;当选择SOCK STREAM(字节流)类型的时,sock()系统调用中的参数protocol(协议)总会选中TCP,而UDP则一直用作SOCK DGRAM类型的传输协议。

2.3 非连接协议的数据报套接字编程

数据报式socket采用的是用户数据报协议UDP,它是建立在IP协议之上的,提供无连接数据报传输,主要应用在高可靠性、低延迟的局域网上,它的优点是高效率低开销,不用建立连接和撤销连接,缺点是不可靠,报文丢失后需重发。数据套接字的服务进程客户进程通信前不必建立连接,UDP则一直用作SOCKpGRAM类型的传输协议,通信的步骤如下:

1) 服务进程首先调用Socket()创建一个数据套接字,并调用bind将服务器地址捆扎在该套接字上,然后调用recvfrom()等待客户进程发来的请求;

2) 客户进程在调用SocketQ创建一个数据报套接字后,调用bindU将客户机地址捆扎在此套接字上,接着调用sendto()向服务进程发送请求,然后调用recvfrom()等待服务进程返回该请求的处理结果;

3) 服务进程在执行客户进程所请求的任务后,调用sendto()将处理结果返回给客户进程;

4) 服务进程和客户进程通过调用close()撤消套接字;

3 Linux内核对socket的支持

确切地说,Linux内核只提供了一个与套接字有关的系统调用,应用程序的所有套接字调用都会映射到这个系统调用上。在Linux内核中的net/socket.c中定义这个函数sys_socketcall(int call,unsigned long *args)。 include/asm/unistd.h中会指派一个数字,该数字会和arch/i386/kernel/entry.s中的系统调用一起添加到表格中。通过调用中。all参数可以说明所指向的那个套接字函数,在include/linux/net.h中定义了可接受的参数SYS_SOCKET, SYS_IND,SYS_CONNECT, SYS_LISTEN等,在用户空间的函数库中,带有特定参数的sys_socketcall调用会映射成某个独立函数,在内核中若要选中希望调用的那个函数,需要在sys_socketcall函数中用到一条:witch命令如下所示,而在此之前首先要使用copy_from_user()命令将sys_ socketcall()的函数复制到一个向量中,即ensign long a中。

if copy_from user(a,args,nargs(call))

return _EFAULT;

a0=a[0];

al=a[1];

switch(call)

{

case

SYS_SOCKET:

err=sys_socket(a0,al,a[2]);

break;

SYS_BIND:

err=sys_bind(a0,al,a[2]);

break;

SYS_CONNECT:

err=sys_connect(a0,al,a[2]);

break;

为了支持BSD套接字,一个重要的数据结构就是struct socket,它的定义位于

include/linux/net.h中,其定义如下:

struct socket

{

socket statestate;

unsigned long flags;

struct proto_ops *ops;

structmode *inode;

structfasync struct *fasync list;

structfile*file;

structsock*sk;

wait queue head t wait;

shorttype;

unsigned char passcred;};

与早期的内核相比,socket结构己经稍有简化。state中存储的是套接字状态可以取值如下(include/linux/net.h):SS_FREE(不忙)、SSes UNCONNECTED(未连通)、SS_ONNECTING(目前正在连接)、SS_ONNECTED(已连通)、SS_ISCONNECTING(目前正在断开连接)。flags用以同步访问,ops指针指向了连通协议(如tcp或udp)在初始化之后的协议运作。就像Linux中的每个文件都有一个mode一样,每个BSD套接字也分派了一个mode o file中存储了一个指向该文件结构的指针,这个结构连接了套接字,因此它可以用与指向套接字。如果有进程等待着这个套接字上的事件,也可以通过fasync_list找出该进程。通过sk指针可以使用一个匹配的sock结构。不过,这个sock结构是由BSD套接字之下、特定于协议的套接字初始化的,并且连通到这个指针。字段负责根据用户空间中的同名套接字调用存储第二个参数,在Linux内核include/asm/socket.h中定义了可接受的参数。

从上面分析可以看出任何时候通过一个socket来读写数据时,都是在使用一个系统调用(system_call)这个调用(例如read或write)跨越了用户空间应用程序与内核的边界。另外,在进入内核之前,您的调用会通过C库来进入内核中的一个通用函数system_call()。从system_call()中,这个调用会进入文件系统层,内核会在这儿确定正在处理的是哪种类型的设备。最后,调用会进入socket层,数据就是在这里进行读取或进行排队从而通过socket进行传输的。

4 总结

每种网络协议都提供网络应用开发接口,TCP/IP协议的应用开发接口的事实标准是socket套接口,开发socket的目的是隐藏网络底层的复杂结构和协议,使编程人员能够简单抽象的对网络进行操作。socket面向客户机/服务器模型,针对客户机/服务器程序提供不同的socket的系统调用函数,客户端随机申请一个socket,操作系统为之分配一个随机socket号;服务器端拥有全局公认的socket号,任何客户都可以向他发送连接请求和信息请求。进程通信以前,双方必须各自创建一个端口,否则是没有办法在通信前建立联系的,而socket提供了这种进程间通信的端口。从网络编程的套接字的分析来看,选择TCP套接字和选择UDP套接字编程,在传输数据时有着速度、效率和稳定性的差别。TCP编程拥有了可靠的数据连接,UDP不具有。但是在速度方面,UDP编程确优于TCP编程,特别是对于传输短消息。基于这两种通信方式优缺点的考虑,在后续编写IDU控制应用软件时,将UDP套接字用于硬件终端对外广播本地IP地址,使局域网内客户端软件识别某台终端设备,获取其MAC地址等硬件信息。将TCP套接字用于在客户端传输用户数据,对硬件终端上的硬件设备进行初始化设置。

参考文献:

[1] Warren W Gay. Linux Socket Programming by Example. Que(R), April 2000.

[2] Jonathan Corbet,Alessandro Rubini,Greg Kroah-Hartman. Linux Device Drivers 3rd Edition. Reilly Media Inc,2005.

[3] 孙琼,嵌入式Linux应用程序开发详解[M],北京:人民邮电出版社,2006.

socket通信范文4

    [关键词] 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文件[摘要] 使用Visual c#.NET中的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月

socket通信范文5

关键词:C++builder;套接字(socket);客户机/服务器(C/S)

中图分类号:TP311.52 文献标识码:A文章编号:1007-9599 (2012) 06-0000-02

一、概述

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯,它的基本模型就是客户机/服务器模型,即两个进程之间相互通讯,其中一个提供一个固定的位置,而另一个则只需要知道这个固定的位置,并去建立两者之间的联系,然后完成数据的通讯就可以了,这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端。

二、网络的基本概念

(一)客户机/服务器模式

客户机/服务器模型是网络应用的标准模型,这种模式将网络中的计算机分成两类:提出服务请求的一方称为客户机,提供服务的一方称为服务器,客户机/服务器是个逻辑概念,客户机部分和服务器部分可以在同一物理机器上,也可在不同的物理机器上,与单机模式相比,客户机/服务器模式可以使得负载在客户机和服务器之间平衡,增强了系统的稳定性和灵活性,使系统便于维护和应用。

网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,客户机与服务器分别表示相互通信的两个应用程序的进程,客户机/服务器模式通常采用监听/连接的方式实现,客户机进程是主动的,先发出请求给服务器,服务器端应用程序在一个端口监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到有一个客户机对这个服务提出了连接请求,此时服务线程被“唤醒”并为客户提供服务,即对客户的请求做出适当的反应。

(二)TCP/IP协议

TCP/IP(Transmission Control Protocol/Internet Protocol)协议又叫网络通讯协议,中文译名为传输控制协议/因特网互联协议,由专门负责对不同网络进行互联的互联网协议IP协议和用来检测网络传输中差错的传输控制协议TCP协议组成,该协议是因特网最基本的协议,也是国际互联网络的基础。TCP/IP 协议定义了电子设备(比如计算机)如何连入因特网,以及数据如何在它们之间传输的标准。TCP/IP是一个四层的分层体系结构,每一层都呼叫它的下一层提供的网络来完成自己的需求。包括应用层、传输层、网络层、网络接口层,如下图:

应用层

(Telnet、FTP、HTTP、DNS、SMTPT等)

传输层

(TCP和UDP)

网络层

(IP、ICMP和IGMP)

网络接口层

(以太网、令牌环网、FDDI等)

应用层:应用程序间沟通的层。该层的协议主要有电子邮件传输协议(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等。

传输层:该层是整个体系结构的控制部分,提供应用程序之间端到端的通讯服务。该层定义了两种协议:传输控制协议(TCP)、用户数据报协议等(UDP)。

网络层:负责提供基本的数据包传送功能,让每一块数据包都能达到目的主机。该层主要包括网际协议(IP)、互联网控制报文协议(ICMP)、Internet组管理协议(IGMP)。

网络接口层:也叫数据链路层,是模型的最底层,负责将帧放入线路或从线路中取出帧。

(三)套接字(Socket)

套接字(Socket)是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,它定义了两台计算机间的通信规范,Socket是面向C/S模型来设计的,网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,Socket通常用来实现客户端和服务器端的连接。Socket屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了Socket规范的计算机之间的通信成为可能。

要建立一个Socket连接必须具有四个基本信息:本地系统的地址、本地应用程序使用的端口号、远程系统的地址、远程系统中应用程序使用的端口号。具体实现时,首先服务器进程在约定的端口建立一个Socket并处于监听状态等待客户机连接;客户机建立一个Socket并向服务器端发送连接请求;服务器端接受客户机请求并与客户机建立连接;客户机向服务器发送服务请求;服务器端接受客户机服务请求处理后予以响应。如下图:

三、C++builder环境下的网络编程

C++builder中,网络组件TServerSocket和TClientSocket封装了WinSocket编程的各种基本功能,使网络编程更加简单。其中,TClientSocket作为客户端使用,是请求方,主动和服务器进程建立联接;TServerSocket作为服务器方使用,是响应方,用于侦听以及被动接受客户机的联接。

(一)服务器端的实现

1.创建服务套接字和监听线程

void __fastcall ServerSocketListen(TObject *Sender)

TServerSocket * SocketServer;

int agreed_Port;

SocketServer = new TServerSocket(Application);

SocketServer ->Port = agreed_Port ;//约定的端口

SocketServer -> Open ();

if(SocketServer ->Active )ShowMessage(“开始监听”);

}

2.实现数据接收

当有客户连接时,在TServerSocket的onaccept事件中添加如下代码

void __fastcall TServerSocket::onaccept (TObject* Sender, TCustomWinSocket * Socket)

TList *SocketList;

SocketList = new TList;

TAcceptSocket *AcceptSocket = new TAcceptSocket(Socket);

SocketList->Add(AcceptSocket);

ShowMessage(“有客户连接”);

当有客户数据发送时,在TServerSocket的OnClientRead事件中加入以下代码:

void __fastcall TServerSocket:: OnClientRead (TObject* Sender, TCustomWinSocket * Socket)

intDataLen;

char Recv_Buffer [80000];

Char * Buffer;

DataLen = Socket->ReceiveLength();

//接受数据到Recv_buffer缓冲区中

Socket->ReceiveBuf( Recv_Buffer, DataLen )}

//给每一个连接客户发送数据

for(i=0;iSocket->ActiveConnections;i++)

ServerSocket->Socket->Connections[i]-> SendBuf((void*)Buffer,sizeof(Buffer));

3.关闭套接字

void __fastcall Disconnect(TObject* Sender)

SocketServer-> Close();

}

(二)客户机端的实现

1.创建客户机端的套接字并与服务器建立连接

void __fastcall ClientSocketConnect(TObject *Sender)

{

TClientSocket * SocketClient;

AnsiStringServer_IP;

int agreed_Port;

Char * Buffer;

SocketClient = new TClientSocket(Application);

SocketClient ->ClientType = ctNonBlocking;

SocketClient ->OnRead=readdata;

SocketClient ->Address= Server_IP;//服务器地址

SocketClient ->Port = agreed_Port ;//约定的端口

SocketClient -> Open();

if(SocketClient ->Active )

{

ShowMessage(“连接成功”);

//发送数据

SocketClient ->Socket->SendBuf((void*)Buffer,sizeof(Buffer));//

2.实现数据接收

void __fastcall readdata (TObject* Sender, TCustomWinSocket* Socket) intDataLen;

char Recv_Buffer [80000];

DataLen = Socket->ReceiveLength();

//接受数据到Recv_buffer缓冲区中

Socket->ReceiveBuf( Recv_Buffer, DataLen );

3.关闭套接字

同服务器端。

四、结束语

本文以C++builder语言为例,重点介绍了利用Socket编程的技术要点,目前,大多数远程进程间通信代码是用Socket编写的,socket 最初是由加利福尼业大学Berkeley 分校为UNIX 操作系统开发的网络通信接口,而现在几乎所有流行的操作系统都支持它,从而使得socket成为开发网络应用软件的强有力工具。

参考文献:

[1]袁辉.C++Builder网络编程核心技术.北京:机械工业出版社

[2](美)多纳霍.TCP/IP Sockets编程(C语言实现).北京:清华大学出版社

[3]罗军舟.TCP/IP协议及网络编程技术.北京:清华大学出版社

[4]梅成刚.C++Builder项目开发实践.北京:中国铁道出版社

socket通信范文6

分久必合,Socket AM2一统AMD高中低市场

AMD 平台Socket 754和Socket 939共存的状态,已经给消费者带来了不少选购和升级上的困扰。因此在新一代桌面处理器的接口设计上,AM D 终于提出了采用SocketAM2 设计,把高中低端处理器的接口统一。并为将来的65nm 制程双核心甚至四核心处理器产品预留了足够的升级空间,这也应了“分久必合”的那句中国古话。AMD AM2接口与DDR时代的Socket 940一样,拥有940 针脚。从表面上看,Socket AM2 与早先的Socket940基本一样,但在阵脚定义上和目前的940针处理器并不兼容。从AMD 的资料看,这一接口主要用于AMD桌面处理器,现有AMD 最新的Athlon 64、Athlon 64 X2、Athl on 64 FX、Sempron以及1XX系列Opteron处理器都将采用统一接口。

更强更高更统一,细数Socket AM2三大优势

1.支持DDR2 内存,Socket AM2平台性能更强Socket AM2处理器的另一大特点是开始支持DDR2内存,无论是对内存厂商还是普通消费者来说,都是件好事。AMD之前的处理器仅集成了DDR 内存控制器,这也就使得一向以超频能力出色著称的AMD 处理器,因为受制于DDR内存频率,无法完全发挥超频优势。新的Socket AM2处理器将正式提供对DDR2 内存的支持,并且最高可支持到DDR2 800MHz(截至发稿前,已有消息宣称SocketAM2最高可以支持DDR2 1066MHz),超频爱好者再也不必为处理器超频后内存异步的问题而苦恼了,这也意味着Socket AM2平台将提供更强的性能。

2.Socket AM2 处理器频率更高,但功耗更低对于一些Socket AM2处理器,AMD将会将其外频频率从200MHz 提升到333MHz,这也意味着处理器的频率将会有大幅度提升。虽然频率会更高,在功耗方面,SocketAM2 也会更低。

Socket AM2处理器虽然仍将采用90nm制造工艺,但在功耗的控制上,Socket AM2处理器会比Socket 939处理器也有了很大的改善。AMD 表示,Socket AM2的处理器在性能和功耗方面将达到Intel 65nm 制程处理器的水准。从AM D 放出的今年处理器计划书看,AMD 将在下半年推出5款低功耗x2 处理器,并将功耗降低到65W。另外,AM D 还将把单核心SocketAM2接口的Athl on 64 3500+和3800+处理器的功耗降低至35W。这意味着在Socket AM2 平台上,消费者将能够买到频率更快,发热量更低的AMD 处理器。

3.处理器接口统一,选购升级更简单

不能否认的是,处理器接口的频繁更替,对普通消费者的攒机或者升级都会带来非常大的不便。Socket 754 和Socket 939 共存时期就让许多普通消费者吃足苦头,而这一麻烦将在AM 2 时代成为历史。无论是高端的双核产品,还是中低端的单核产品,不再以接口针脚数来区分,都将统一采用Socket AM2接口。AMD 处理器将迎来继Socket 462 之后接口再次统一。消费者选购AM D 处理器也会更简单,这在很大程度上保证了消费者的投资效益,提高了硬件资源的可重复利用率。

优势明显,Socket AM2处理器选择

上一篇空调控制器

下一篇多媒体音箱