c#socket.docx
- 文档编号:11408251
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:29
- 大小:81.72KB
c#socket.docx
《c#socket.docx》由会员分享,可在线阅读,更多相关《c#socket.docx(29页珍藏版)》请在冰豆网上搜索。
c#socket
详解C#中Socket通信
(一):
实现连接
(2011-06-1312:
46:
08)
转载▼
标签:
it
分类:
软件开发
第一步:
实现连接
客户端连接代码:
privatevoidconnect2Server()
{
SocketclientSocket;
//服务器地址
IPAddressip=IPAddress.Parse("192.168.1.136");
//服务器节点
IPEndPointiep=newIPEndPoint(ip,9004);
//通信实例
clientSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//连接
clientSocket.Connect(iep);
}
客户端通过Socket连接到服务器的9004端口。
服务器接受连接代码:
publicvoidStartListening()
{
//获取本机IP地址
SocketserverSocket;
IPHostEntryipHost=Dns.GetHostEntry(Dns.GetHostName());
HostIP=ipHost.AddressList[0];
//开关控制
boolflag=true;
try
{
IPEndPointiep=newIPEndPoint(HostIP,9004);
serverSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(iep);
//最大100个
serverSocket.Listen(100);
//如果有客户端连接进来,就加入队列
while(flag)
{
//阻塞侦听是否有客户端连接
clientSocket=serverSocket.Accept();
if(clientSocket!
=null)
{
stringstr=clientSocket.RemoteEndPoint.ToString();
string[]Ipstr=str.Split(':
');
stringclientIp=Ipstr[0];
MessageBox("客户端:
"+clientIp+"连接到服务器");
}
}
}
catch(Exceptione)
{
MessageBox.show("连接错误:
"+e.message);
}
}
服务器启动Socket,侦听是否有客户端进入,如果有的话,加入队列。
通常情况下,为了使客户端和服务器对其它事件进行响应,把它们放置在独立线程进行。
类似下面的代码:
Thread_createServer;
_createServer=newThread(newThreadStart(StartListening));
_createServer.IsBackground=true;
_createServer.Start();
详解C#中Socket通信
(二):
消息传递
(2011-06-1313:
09:
44)
转载▼
标签:
it
分类:
软件开发
第二步:
消息传递
客户端代码:
//发送本机信息到服务器
privatevoidsentClientInfo(stringmessage)
{
try
{
byte[]sendbytes=System.Text.Encoding.UTF8.GetBytes(message);
intsuccessSendBtyes=clientSocket.Send(sendbytes,sendbytes.Length,SocketFlags.None);
}
catch
{
reConnect();
}
}
服务器接受消息代码:
Threadthread=newThread(newThreadStart(WaitForSendData));
thread.IsBackground=true;
thread.Start();
privatevoidWaitForSendData()
{
stringmessage=null;
while(flag)
{
if(clientSocket.Connected)
{
try
{
byte[]bytes=newbyte[1024];
intbytesRec=clientSocket.Receive(bytes);
message=System.Text.Encoding.UTF8.GetString(bytes);
MessageBox.show(message);
}
catch
{
//通信出错处理
}
}
else
{
//断开
}
}
}
详解C#中Socket通信(三):
客户端封装
(2011-06-1313:
20:
18)
转载▼
标签:
it
分类:
软件开发
第三步:
客户端封装
通常因为服务器会连接多个客户端,所以有必要将客户端封装成一个自定义类,通过统一的手段进行管理。
类代码示例如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Net.Sockets;
usingSystem.Net;
usingSystem.Threading;
namespaceSERVER
{
classClient
{
privateSocketclientSocket=null;
privateThreadthread;
privateboolflag=true;
//注册断开客户端事件
publicdelegatevoidclientdisConnect(objectsender,EventArgse);
publiceventclientdisConnectOnClientdisConnect;
//注册收到客户端消息事件
publicdelegatevoidclientMessage(objectsender,EventArgse,stringmessage);
publiceventclientMessageOnclientMessage;
//构造函数
publicClient(SocketSocket)
{
clientSocket=Socket;
stringstr=clientSocket.RemoteEndPoint.ToString();
string[]Ipstr=str.Split(':
');
Ip=Ipstr[0];
Portal=Ipstr[1];
thread=newThread(newThreadStart(WaitForSendData));
thread.IsBackground=true;
thread.Start();
}
//等待数据通信函数
privatevoidWaitForSendData()
{
stringmessage=null;
while(flag)
{
if(clientSocket.Connected)
{
try
{
byte[]bytes=newbyte[1024];
intbytesRec=clientSocket.Receive(bytes);
message=System.Text.Encoding.UTF8.GetString(bytes);
//如果客户端有消息传递过来,触发消息事件
OnclientMessage(this,newEventArgs(),message);
}
catch
{
killSelf();
}
}
else
{
killSelf();
}
}
}
//客户端出错处理
publicvoidkillSelf()
{
flag=false;
if(clientSocket!
=null&&clientSocket.Connected)
{
clientSocket.Close();
clientSocket=null;
}
//触发客户端离开事件
OnClientdisConnect(this,newEventArgs());
if(thread!
=null&&thread.IsAlive)
{
thread.Abort();
thread=null;
}
}
//注册向客户端发送信息方法
publicvoidsetMessage(stringmessage)
{
try
{
byte[]sendbytes=System.Text.Encoding.UTF8.GetBytes(message);
intsuccessSendBtyes=clientSocket.Send(sendbytes,sendbytes.Length,SocketFlags.None);
}
catch
{
}
}
//代码结束
}
}
类使用类似下面示例代码:
publicvoidStartListening()
{
//获取本机IP地址
IPHostEntryipHost=Dns.GetHostEntry(Dns.GetHostName());
HostIP=ipHost.AddressList[0];
try
{
IPEndPointiep=newIPEndPoint(HostIP,9004);
serverSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(iep);
serverSocket.Listen(100);
//如果有客户端连接进来,就加入队列
while(flag)
{
clientSocket=serverSocket.Accept();
if(clientSocket!
=null)
{
stringstr=clientSocket.RemoteEndPoint.ToString();
string[]Ipstr=str.Split(':
');
stringclientIp=Ipstr[0];
PVS_ClientPvsClient;
PvsClient=newPVS_Client(clientSocket);
//注册断开事件
PvsClient.OnClientdisConnect+=newPVS_Client.clientdisConnect(this.removeclient);
//注册消息事件
PvsClient.OnclientMessage+=newPVS_Client.clientMessage(this.getClientMessage);
}
}
}
catch(Exceptione)
{
MessageBox.show(e.Message);
}
}
//断开处理函数
privatevoidremoveclient(objectsender,EventArgse)
{
}
//消息处理函数
privatevoidgetClientMessage(objectsender,EventArgse,stringmessage)
{
}
详解C#中Socket通信(四):
使用哈希表管理客户端
(2011-06-1315:
25:
19)
转载▼
标签:
it
分类:
软件开发
第四步:
使用哈希表管理客户端
多客户端可以使用哈希表进行管理。
Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,value用于存储对应于key的值。
Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.哈希表的操作主要有:
∙在哈希表中添加元素:
HashtableObject.Add(key,value);
∙在哈希表中去除元素:
HashtableObject.Remove(key);
∙从哈希表中移除所有元素:
HashtableObject.Clear();
∙判断哈希表是否包含特定键key:
HashtableObject.Contains(key);
现在,我们改写服务器端代码,如果同一IP登陆的话,就删除原来的客户端,重新建立客户端,在类定义中添加客户端列表:
publicHashtableclientList=newHashtable();
服务器响应函数:
publicvoidStartListening()
{
//获取本机IP地址
IPHostEntryipHost=Dns.GetHostEntry(Dns.GetHostName());
HostIP=ipHost.AddressList[0];
try
{
IPEndPointiep=newIPEndPoint(HostIP,9004);
serverSocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
serverSocket.Bind(iep);
serverSocket.Listen(100);
//如果有客户端连接进来,就加入队列
while(flag)
{
clientSocket=serverSocket.Accept();
if(clientSocket!
=null)
{
stringstr=clientSocket.RemoteEndPoint.ToString();
string[]Ipstr=str.Split(':
');
stringclientIp=Ipstr[0];
PVS_ClientPvsClient;
if(clientList.Contains(clientIp))
{
PvsClient=(PVS_Client)clientList[clientIp];
PvsClient.killSelf();
}
PvsClient=newPVS_Client(clientSocket);
//注册断开事件
PvsClient.OnClientdisConnect+=newPVS_Client.clientdisConnect(this.removeclient);
//注册消息事件
PvsClient.OnclientMessage+=newPVS_Client.clientMessage(this.getClientMessage); clientList.Add(clientIp,client);
}
}
}
catch(Exceptione)
{
MessageBox.show(e.Message);
}
}
//断开处理函数
privatevoidremoveclient(objectsender,EventArgse)
{
}
//消息处理函数
privatevoidgetClientMessage(objectsender,EventArgs
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- socket
![提示](https://static.bdocx.com/images/bang_tan.gif)