C# 使用 Socket (Udp + Tcp)

以一些示例,记录 C# 中如何使用Socket:

目录

1.第一个示例,使用.net 自带的 Socket 纯手工写 (Udp协议)

2.第二个示例,使用.net 自带的 Socket 纯手工写 (Tcp协议)

3.第三个示例,直接使用WebSocket【推荐使用】


1.第一个示例,使用.net 自带的 Socket 纯手工写 (Udp协议)

这个方式灵活性高,但不建议使用:

这个示例的作用是:服务端和客户端,可以互相收发消息,如上图。我用的本机测试的,所以用了两个端口来监听。如果是不同机器且连着内网或公网,只需一个监听端口,但要换成对应的局域网ip或者公网映射ip.

步骤:

1.新增个空解决方案,并添加两个winform项目,一个是 server 端一个是 client 端:

2.在服务端和客户端分别加入如下代码:

服务端:

public partial class Server : Form
{
    private readonly Socket _listenSocket;

    private EndPoint _listenPort = new IPEndPoint(IPAddress.Any, 7942);
    private EndPoint _testClientPort = new IPEndPoint(IPAddress.Parse("192.168.2.32"), 7943);

    //数据
    private byte[] _buffer = new byte[1024];

    //数据(字符串)
    private string _chatString = string.Empty;

    //客户端ip+端口
    private EndPoint _clientIpPort;

    //定个委托
    public delegate void ShowDataDelegate();

    public Server()
    {
        InitializeComponent();

        _listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        _listenSocket.Bind(_listenPort);//本机用Bind,远程用Connect
        _listenSocket.BeginReceiveFrom(_buffer, 0, 1024, SocketFlags.None, ref _listenPort, ReceiveData, _listenSocket);
    }

    private void ShowData()
    {
        if (!string.IsNullOrEmpty(_chatString))
        {
            this.richTextBox.AppendText($"客户端({_clientIpPort}): {_chatString}\n");
        }
    }

    private void ReceiveData(IAsyncResult ar)
    {
        // 创建ip+port
        var sender = new IPEndPoint(IPAddress.Any, 0);
        var tempRemoteEp = (EndPoint)sender;

        //获取socket
        var socket = (Socket)ar.AsyncState;

        //获取客户端发来的数据(客户端ip+port在第二个参数中)
        var recv = socket.EndReceiveFrom(ar, ref tempRemoteEp);

        //客户端ip+端口
        _clientIpPort = tempRemoteEp;

        //将数据流转成字符串
        _chatString = Encoding.Unicode.GetString(_buffer, 0, recv);
        richTextBox.Invoke(new ShowDataDelegate(ShowData));

        if (!this.IsDisposed)
        {
            _listenSocket.BeginReceiveFrom(_buffer, 0, 1024, SocketFlags.None, ref _listenPort, ReceiveData, _listenSocket);
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrEmpty(textBox1.Text))
        {
            var newSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            var response = Encoding.Unicode.GetBytes(textBox1.Text);
            newSocket.SendTo(response, 0, response.Length, SocketFlags.None, _testClientPort);

            this.richTextBox.AppendText($"服务器(本地): {textBox1.Text}\n");
        }
    }
}

客户端:

public partial class Client : Form
{     
    //客户端用来接收数据的socket
    private readonly Socket _listenSocket;

    private EndPoint _listenPort = new IPEndPoint(IP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值