当前位置:首页 > 开发教程 > .net教程 >

在C#中使用套接字工作

时间:2016-05-23 10:15 来源:互联网 作者:源码搜藏 收藏

接正越来越多时下比较使用。 它们提供一个简单的方法通过网络交换数据。 它的使用, 作为一个例子,到用户之间交换消息。 你可以进一步去传输文件并播放分布式的游戏和交流多个程序。 由于其强大的功能,插座正在成为学习技术的开发是必须的。 作为插座是基

接正越来越多时下比较使用。它们提供一个简单的方法通过网络交换数据。它的使用,作为一个例子,到用户之间交换消息。你可以进一步去传输文件并播放“分布式”的游戏和交流多个程序。  由于其强大的功能,插座正在成为学习技术的开发是必须的。

作为插座是基于客户机/服务器体系结构,本申请是由服务器和客户端的。服务器会预留一个端口号。然后,它会听任何即将到来的客户端。然后,客户端将尝试连接到服务器。当连接成功时,将有可能交换文本消息。完成后,  该连接将被关闭。

使用代码

在.NET应用程序使用套接字,我们必须添加以下使用语句:


using System.Net; 
using System.Net.Sockets; 

现在,我们可以创建一个Socket对象:


Socket sListener;    

编程服务器

让我们创建一个click事件,使创建的套接字设置其IpEndPoint和协议类型。

但在此之前,一个插座需要权限的工作,因为它会使用一个封闭的端口号。会出现一个窗口要求的权限,允许发送数据。


permission = new SocketPermission(NetworkAccess.Accept, 
                   TransportType.Tcp, "", SocketPermission.AllPorts);

作为插座使用网络来传输数据时,它使用的协议。该在这方面最知名的是UDP这是快,但并不可靠,TCP是可靠的,但并不快。发送消息时,建议可靠性。这就是为什么我使用TCP。


sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 

插座都需要有一个地址。这类型的IpEndPoint每个套接字被通过IP地址,这是定位在主机的机器有用标识,端口号来识别哪个程序使用机器内的插座。


IPHostEntry ipHost = Dns.GetHostEntry(""); 
IPAddress ipAddr = ipHost.AddressList[0]; 
ipEndPoint = new IPEndPoint(ipAddr, 4510);  

现在,我们将我们与插座关联IpEndPoint

sListener.Bind(ipEndPoint);  

所以,我们的插座就可以使用了,让我们开始收听选择的端口号(4510)。您可以选择其他端口号。但客户端必须知道这一点。听力将通过此按钮的事件进行处理:

放置一个套接字处于监听状态,并指定有多少客户端套接字可以连接到它:

sListener.Listen(10);

服务器将开始一个异步操作以接受一个尝试。其中一个插槽的强大功能是采用异步编程模型。多亏了这一点,我们的程序可以同时插座执行操作继续运行。


AsyncCallback aCallback = new AsyncCallback(AcceptCallback);
sListener.BeginAccept(aCallback, sListener); 

如果存在来自客户端的任何尝试连接,下面的代码将被执行:


Socket listener = (Socket)ar.AsyncState; 
Socket handler  = listener.EndAccept(ar);  

要开始异步接收数据,我们需要类型的数组字节用于接收到的数据,在缓冲区中从零开始的位置,字节数接收。


handler.BeginReceive(buffer, 0, buffer.Length, 
          SocketFlags.None, new AsyncCallback(ReceiveCallback), obj); 

如果客户端发送的任何消息,服务器会设法得到它。由于插座的二进制类型发送数据,将它们转换为字符串类型是必要的。这是很好也知道,服务器,甚至是客户端,不知道消息的长度或需要听这一切的时候什么。这就是为什么我们使用一个特殊字符串“<客户端退出>”将在邮件的结尾告诉短信到此为止。接收数据,BeginReceive叫做:

byte[] buffernew = new byte[1024];
obj[0] = buffernew;
obj[1] = handler;
handler.BeginReceive(buffernew, 0, buffernew.Length, 
        SocketFlags.None, new AsyncCallback(ReceiveCallback), obj);  

收到客户端的消息后,服务器可能要回复。但它字符串消息转换STR为字节的数据,因为只有插座操纵字节。


byte[] byteData = Encoding.Unicode.GetBytes(str);  

服务器现在都将异步数据发送到连接的插座:


handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); 

当使用异步编程模型来构建这个样本,没有应用程序或接口阻塞的危险。它会看起来像我们使用多线程。

编写代码后,要处理通过用户界面的不同方法。所以,你可能有这样的UI:

在C#中使用套接字工作

编程客户端

客户端将尝试连接到服务器。但它必须知道它的地址。

创建后的SocketPermission套接字的访问限制,并创建一个带有相匹配的插座IpEndPoint,我们必须建立到远程服务器主机的连接:

senderSock.Connect(ipEndPoint);

我们在这里指出,所创建的IpEndPoint将不被使用,以确定客户端。但它会被用来识别服务器套接字。

要发送信息,在客户端增加了“<客户端退出>”来标记邮件的末尾,必须转 换短信为二进制格式,作为服务器一样。此后,插座将通过调用方法发送消息发送,这将取二进制消息作为一个参数。


byte[] msg = Encoding.Unicode.GetBytes(theMessageToSend + "<Client Quit>"); 
int bytesSend = senderSock.Send(msg);  

从服务器接收数据,则该字节数组转换为字符串,并继续直到数据不可读取数据:


String theMessageToReceive = Encoding.Unicode.GetString(bytes, 0, bytesRec);
while (senderSock.Available > 0)
{
  bytesRec = senderSock.Receive(bytes);
  theMessageToReceive += Encoding.Unicode.GetString(bytes, 0, bytesRec);
} 

关闭连接,我们应该用Socket.Shutdown(SocketShutdown.Both)和  Socket.Close() 

匹配与按钮的点击事件后,客户端用户界面看起来就像这样:

在C#中使用套接字工作

结论

我这里提供的应用程序是一个示例使用,轻松的在您的项目整合。所以,给自己一个机会去尝试服用插座的功能利益建立一个更加丰富和强大的软件。

  • 完整的源代码可以在这里下载。 

.net教程阅读排行

最新文章