C#中的套接字编程实例Word格式文档下载.docx

上传人:b****5 文档编号:15691189 上传时间:2022-11-15 格式:DOCX 页数:13 大小:61.97KB
下载 相关 举报
C#中的套接字编程实例Word格式文档下载.docx_第1页
第1页 / 共13页
C#中的套接字编程实例Word格式文档下载.docx_第2页
第2页 / 共13页
C#中的套接字编程实例Word格式文档下载.docx_第3页
第3页 / 共13页
C#中的套接字编程实例Word格式文档下载.docx_第4页
第4页 / 共13页
C#中的套接字编程实例Word格式文档下载.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

C#中的套接字编程实例Word格式文档下载.docx

《C#中的套接字编程实例Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C#中的套接字编程实例Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。

C#中的套接字编程实例Word格式文档下载.docx

套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。

各种进程使用这个相同的域互相之间用Internet协议簇来进行通信。

  套接字可以根据通信性质分类,这种性质对于用户是可见的。

应用程序一般仅在同一类的套接字间进行通信。

不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信。

套接字有两种不同的类型:

流套接字和数据报套接字。

  套接字工作原理:

  要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为ClientSocket,另一个运行于服务器端,我们称之为ServerSocket。

  根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:

服务器监听,客户端请求,连接确认。

  所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

  所谓客户端请求,是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。

为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

  所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。

而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

通过向大家简单的介绍套接字的基本概念和实现套接字编程的基本原理,我想大家对套接字编程已有了初步的了解。

不过,上面介绍的仅仅是基本概念和原理,要真正运用还是需要一定的工作的。

对基本概念和原理的真正理解的最好方法莫过于自己动手做一个实例,下面我就向大家介绍一个很好的用C#实现套接字编程的实例――聊天室程序。

  本程序是基于C/S(服务器/客户端)构架的,程序包含一个服务器端的应用程序和一个客户端的应用程序。

首先,在服务器上运行服务器端的应用程序,该程序一运行就开始服务器监听。

然后,在客户机上就可以打开客户端的应用程序。

程序打开后可以与服务器端应用程序进行连接,即进行客户端请求。

在连接确认后,客户端用户可以和其他的客户端用户进行聊天。

客户端人数没有限制,同时还支持“悄悄话”聊天模式,支持聊天记录。

所以这是一个学习套接字编程的相当不错的例子。

而且,程序中为了处理每个客户端的信息还用到了多线程机制。

在每个客户端与服务器端连接成功后,它们之间就建立一个线程。

这样运用了多线程之后,客户端之间就不会相互影响,即使其中一个出了错误也不会影响到另一个。

  下面,我就向大家具体介绍该实例:

  服务器端程序:

  1.打开VS.net,新建一个C#的模板为“Windows应用程序”的项目,不妨命名为“ChatServer”。

  2.布置界面。

只需在界面上添加一个ListBox控件即可,该控件主要用于显示客户端的用户的一些信息的。

图象如下:

  3.服务器端程序的代码编写。

  对于服务器端,主要的作用是监听客户端的连接请求并确认其请求。

程序一开始便打开一个StartListening()线程。

privatevoidStartListening()

{

 listener=newTcpListener(listenport);

 listener.Start();

 while(true)

 {

  try

  {

   Sockets=listener.AcceptSocket();

   clientsocket=s;

   clientservice=newThread(newThreadStart(ServiceClient));

   clientservice.Start();

  }

  catch(Exceptione)

   Console.WriteLine(e.ToString());

 }

}

  该线程是一直处于运行状态的。

当服务器端接收到一个来自客户端的连接请求后,它就打开一个ServiceClient()线程来服务客户端。

当一个连接被建立后,每个客户端就被赋予一个属于它自己的套接字。

同时,一个Client类的对象被建立。

该对象包含了客户端的一些相关信息,该信息被保存在一个数组列表中。

C#中的套接字编程实例

(二)

2007-11-1317:

17

Client类如下:

usingSystem;

usingSystem.Threading;

namespaceChatServer

usingSystem.Net.Sockets;

usingSystem.Net;

///

///Client的摘要说明。

publicclassClient

privateThreadclthread;

privateEndPointendpoint;

privatestringname;

privateSocketsock;

publicClient(string_name,EndPoint_endpoint,Thread_thread,Socket_sock)

//TODO:

在此处添加构造函数逻辑

clthread=_thread;

endpoint=_endpoint;

name=_name;

sock=_sock;

}

publicoverridestringToString()

returnendpoint.ToString()+"

:

"

+name;

publicThreadCLThread

get{returnclthread;

set{clthread=value;

publicEndPointHost

get{returnendpoint;

set{endpoint=value;

publicstringName

get{returnname;

set{name=value;

publicSocketSock

get{returnsock;

set{sock=value;

  程序的主体部分应是ServiceClient()函数。

该函数是一个独立的线程,其主要部分是一个while循环。

在循环体内,程序处理各种客户端命令。

服务器端接收来自客户端的以ASCII码给出的字符串,其中包含了一个“|”形式的分隔符。

字符串中“|”以前的部分就是具体的命令,包括CONN、CHAT、PRIV、GONE四种类型。

CONN命令建立一个新的客户端连接,将现有的用户列表发送给新用户并告知其他用户有一个新用户加入。

CHAT命令将新的信息发送给所有用户。

PRIV命令将悄悄话发送给某个用户。

GONE命令从用户列表中除去一个已离开的用户并告知其他的用户某某已经离开了。

同时,GONE命令可以设置布尔型的变量keepalive为false从而结束与客户端连接的线程。

ServiceClient()函数如下:

privatevoidServiceClient()

Socketclient=clientsocket;

boolkeepalive=true;

while(keepalive)

Byte[]buffer=newByte[1024];

client.Receive(buffer);

stringclientcommand=System.Text.Encoding.ASCII.GetString(buffer);

string[]tokens=clientcommand.Split(newChar[]{'

|'

});

Console.WriteLine(clientcommand);

if(tokens[0]=="

CONN"

for(intn=0;

n

Clientcl=(Client)clients[n];

SendToClient(cl,"

JOIN|"

+tokens[1]);

EndPointep=client.RemoteEndPoint;

Clientc=newClient(tokens[1],ep,clientservice,client);

clients.Add(c);

stringmessage="

LIST|"

+GetChatterList()+"

\r\n"

;

SendToClient(c,message);

lbClients.Items.Add(c);

CHAT"

SendToClient(cl,clientcommand);

PRIV"

stringdestclient=tokens[3];

if(cl.Name.CompareTo(tokens[3])==0)

if(cl.Name.CompareTo(tokens[1])==0)

GONE"

intremove=0;

boolfound=false;

intc=clients.Count;

if(cl.Name.CompareTo(tokens[1])=

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

当前位置:首页 > 工程科技 > 能源化工

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

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