C# 之Socket(TCP/IP Server端)使用

本文介绍了如何使用C#实现Socket(TCP/IP)服务器端的编程,包括创建Socket实例、绑定IP和端口、开始监听客户端连接、接收和发送数据的详细步骤,以及回调函数的应用。在接收数据时,一个关键的代码段确保了服务器能持续接收多条客户端消息。

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就只是会收到一条消息,后面的消息都不会收到,当加上这一段代码后,就能正常接收,至于为什么,我没有怎么想通,知道的童鞋可以下面留言。

后面继续更新服务端代码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值