TCP,UDP样例极速编写

本文提供简洁的TCP服务端、客户端及UDP客户端的代码示例,旨在帮助初学者快速入门Socket通信。TCP部分包括同步服务端和客户端,UDP部分则展示了平级客户端的交互。代码精简,注重快速实现,但需补充异常处理。
摘要由CSDN通过智能技术生成

用最快的代码实现TCP,UDP的服务端客户端,帮助新手入门,写出第一份Socket通信;
代码只为用最少的记忆量写出,求快,不求完整.代码有大部分细节需要后续补齐.

1:快速写TCP服务端
同步:

using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace FastSocket
{
    class FastSocketTCPServer
    {
        //Socket初始化参数速记:地址因特网,套接字流,协议Tcp
        Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
        List<Socket> Clients = new List<Socket>();
        public FastSocketTCPServer()
        {
            socket.Bind(new IPEndPoint(IPAddress.Any, 1000));//绑定本地监听端口
            socket.Listen(5);
            new Thread(AcceptThread).Start();//开始等待客户端接入
        }

        private void AcceptThread()
        {
            while (true)
            {
                Socket proxy = socket.Accept();//阻塞,直到收到用户接入,得到连接
                Clients.Add(proxy);
                new Thread(RecieveThread).Start(proxy);//开始读取客户端发来的信息
            }
        }

        private void RecieveThread(object proxySocket)
        {
            while (true)
            {
                byte[] buffer = new byte[1024];
                int len = ((Socket)proxySocket).Receive(buffer);//阻塞,直到读到用户发来数据
                DoEventHandle(buffer,len);//处理收到的数据
            }
        }

        private void DoEventHandle(byte[] buffer, int len)
        {
            //接收到数据,在此处理数据接收事件
            //数据在buffer,长度为len字节,若len<0为异常,等于0为结束会话
        }

        public void Send(IPEndPoint end,byte[] data)
        {
            foreach (Socket proxy in Clients)
            {
                if (proxy.RemoteEndPoint != end)
                {
                    continue;
                }
                proxy.Send(data);//向指定客户端发送数据
            }
        }
    }
}

以上代码,58行实现了一个完整而简单的TCP服务端;
开启了1+N个线程,接收N个客户端接入并读取客户端发来的数据.
其过程可简述为8个步骤:Bind端口,Listen数量,Start接受线程,Accept获取会话,客户端加入列表,Start读取线程,Recieve获取数据,客户端Send数据;
为了压缩代码量,做了简略,有较多地方需要读者补充异常捕获.

2:快速TCP客户端:

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

namespace FastSocket
{
    class FastSocketTCPClient
    {
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        public FastSocketTCPClient()
        {
            socket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000));//接入服务端
            new Thread(RecieveThread).Start();//开始接收数据
        }

        private void RecieveThread()
        {
            while (true)
            {
                byte[] buffer = new byte[1024];
                int len = socket.Receive(buffer);//阻塞,直到收到服务端发来数据
                DoEventHandle(buffer, len);//处理收到的数据
            }
        }

        private void DoEventHandle(byte[] buffer, int len)
        {
            //收到服务端发来数据
        }
        public void Send(byte[] data)
        {
            socket.Send(data);
        }
    }
}

以上代码,40行实现了一个完整而简单的TCP客户端;
开启了1个子线程,接收1个服务端发来的数据.
其过程可简述为4个步骤:Connect服务端,Start读取线程,Recieve获取数据,Send数据;
为了压缩代码量,做了简略,有较多地方需要读者补充异常捕获.

3快速UDP:
UDP没有服务端,都是平级的客户端:

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

namespace FastSocket
{
    class FastSocketUDPSendOnly
    {
        //注意这里初始化和TCP不同,参数速记:地址因特网,套接字数据报,协议Udp
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        public FastSocketUDPSendOnly()
        {
            //不需要Bind也能推送Udp数据报
            //socket.Bind(new IPEndPoint(IPAddress.Any, 1001));
        }
        public void Send(byte[] data,string ip,int port)
        {
            socket.SendTo(data,new IPEndPoint(IPAddress.Parse(ip),port));
        }
    }
    class FastSocketUDPReceiveSend
    {
        //注意这里初始化和TCP不同,参数速记:地址因特网,套接字数据报,协议Udp
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        public FastSocketUDPReceiveSend()
        {
            socket.Bind(new IPEndPoint(IPAddress.Any, 1001));
            new Thread(ReceiveFromThread).Start();
        }

        private void ReceiveFromThread()
        {
            while (true)
            {
                EndPoint remote = new IPEndPoint(0, 0);
                byte[] buffer = new byte[1024];
                int len = socket.ReceiveFrom(buffer, ref remote);
                DoEventHandler(buffer, len, remote);
            }
        }

        private void DoEventHandler(byte[] buffer, int len, EndPoint remote)
        {
            //收到来自另一个UDP客户端remote的数据,长度为len字节
        }

        public void Send(byte[] data, string ip, int port)
        {
            socket.SendTo(data, new IPEndPoint(IPAddress.Parse(ip), port));
        }
    }
}

以上代码,53行实现了2个简单的UDP客户端;
需要接收时,开启1个子线程,接收其他UDP客户端发来的数据.
其过程可简述为1或个步骤:[Bind本地端口,Start读取线程],SendTo发送数据;
为了压缩代码量,做了简略,有较多地方需要读者补充异常捕获.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值