Socket在网络编程中用的挺多的,只要是涉及到网络传输,几乎都离不开套接字,在两个设备通讯的时候,首先选套接字。
如何使用套接字?
引入命名空间
using System;
using System.Net;
using System.Net.Sockets;
创建实例。
byte[] buff = new byte[1024];
punlic Socket receive_socket;
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
其中,addressFamily 参数指定 Socket 使用的寻址方案,SocketType 参数指定 Socket 的类型,protocolType 参数指定 Socket 使用的协议。
如果是UDP,那么后面应该是ProtocolType.Udp。
绑定IP和端口,开始侦听客户端连接
IPAddress IPaddr = IPAddress.Parse("127.0.0.1");
IPEndPoint ipend = new IPEndPoint(IPaddr, 10000);
socket.Bind(ipend);
socket.Listen(10);
这样的话,一个server端就建立起来了,但这样并无法发送和接收数据,
当侦听到客户端连接时,还要和客户端进行交流,如下:
socket.BeginAccept(new AsyncCallback(callback), socket);
其中,BeginAccept是在后台建立了一个线程,专门与客户端连接的,callback是属于回调函数,如果不明白可以看我另外一篇文章:https://editor.youkuaiyun.com/md/?articleId=104795216,里面有相应的介绍。
回调函数callback如下:
private void callback(IAsyncResult iar)
{
Socket s=(Socket) iar.AsyncState;
Socket socket= s.EndAccept(iar);
socket.BeginReceive(buff, 0, 256, SocketFlags.None, new AsyncCallback(receive), null);
receive_socket = socket;
}
其中iar.AsyncState是获取实例的,需要强制转换为socket类型。
receive_socket是全局的,发送数据要用到。
EndAccept方法代表回调结束,但是在BeginReceive中又有一个receive回调方法,
receive回调方法如下:
private void receive(IAsyncResult iar)
{
Socket s = (Socket)iar.AsyncState;
var num = receive_socket.EndReceive(iar);
string vaule = Encoding.GetEncoding("GB2312").GetString(buff, 0, num);
receive_socket.BeginReceive(buff, 0, 256, SocketFlags.None, new AsyncCallback(receive), null);
}
发送方法:
receive_socket.Send(Encoding.GetEncoding("GB2312").GetBytes("字符串。。。"));
至此,一个完整的server端就是这样了,细心的童鞋会发现receive方法中最后有一段代码
receive_socket.BeginReceive(buff, 0, 256, SocketFlags.None, new AsyncCallback(receive), null);
如果把这段代码去掉,整个server就只是会收到一条消息,后面的消息都不会收到,当加上这一段代码后,就能正常接收,至于为什么,我没有怎么想通,知道的童鞋可以下面留言。
后面继续更新服务端代码。
本文介绍了如何使用C#实现Socket(TCP/IP)服务器端的编程,包括创建Socket实例、绑定IP和端口、开始监听客户端连接、接收和发送数据的详细步骤,以及回调函数的应用。在接收数据时,一个关键的代码段确保了服务器能持续接收多条客户端消息。
4886

被折叠的 条评论
为什么被折叠?



