Socket通信Demo(Unity客户端和C#)

Socket通信基本流程

  • 首先要启动服务器创建Socket,然后要绑定服务器的一个端口
  • 这样客户端通过服务器IP+端口号就能连接到服务器了
  • 服务器接下来会设置监听队列,监听并等待要连接到它的客户端
  • 客户端在服务器启动之后也建立自己的Socket,然后使用客户端的Socket去连接服务器
  • 连接成功之后客户端和服务器之间就可以发送数据和接收数据
  • 当客户端关闭的时候,服务器会捕捉到客户端连接关闭
  • 服务器会把对应客户端的Socket也进行关闭

实现 

新建一个Unity项目新建脚本编写客户端

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

public class Client : MonoBehaviour
{
    private Socket socket;
    //定义用来存消息的容器
    private byte[] buffer = new byte[1024];
    // Start is called before the first frame update
    void Start()
    {
        //参数: IPV4协议, 套接字的传输类型(流式传输), socket传输协议(TCP)
        socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream ,ProtocolType.Tcp);  
        //连接服务器: 服务器IP, 服务器端口号
        socket.Connect("127.0.0.1", 6666);  //连接完成
        //连接成功调用接收方法异步接收消息
        StartReceive();
        //连接成功发送消息
        Send();
    }

    //接收消息
    void StartReceive()
    {
        socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,ReceiveCallback,null);
    }
    
    //接收消息的回调方法(作为参数传递的函数)
    void ReceiveCallback(IAsyncResult iar)
    {
        //接收返回消息长度
        int len = socket.EndReceive(iar);
        //接收为0代表终止连接
        if (len == 0)
        {
            return;
        }
        //解析buffer
        string str = Encoding.UTF8.GetString(buffer, 0, len);
        Debug.Log(str);
        //解析完在执行接收方法 
        StartReceive();
    }

    void Send()
    {
        socket.Send(Encoding.UTF8.GetBytes("服务器你好,我是客户端!"));
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

创建一个空物体挂载客户端脚本

 新建一个窗体应用编写服务端

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

public class Program
{
    private static Socket socket;
    private static byte[] buffer = new byte[1024];
    static void Main(string[] args)
    {
        //初始化
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //绑定
        socket.Bind(new IPEndPoint(IPAddress.Any, 6666));
        //监听:  挂起的连接队列最大长度 —— 同时处理连接请求的最大数,超出最大数会排队等待
        socket.Listen(0);
        StartAccept();

        Console.Read(); //阻塞住让程序不会结束
    }

    //开始应答
    static void StartAccept()
    {
        //开始异步应答连接   参数: 回调函数,object
        socket.BeginAccept(AcceptCallback, null);
    }

    static void AcceptCallback(IAsyncResult iar)
    {
        //异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信。
        Socket client = socket.EndAccept(iar);
        //开始接收
        StartReceive(client);
        //重新开始应答
        StartAccept();
    }

    //接收消息
    static void StartReceive(Socket client)
    {
        //开始从连接的 Socket 中异步接收数据
        client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);
    }

    //回调函数
    static void ReceiveCallback(IAsyncResult iar)
    {
        Socket client = iar.AsyncState as Socket;
        //结束接收返回消息长度
        int len = client.EndReceive(iar);
        //接收为0代表终止连接
        if (len == 0)
        {
            return;
        }
        //解析buffer
        string str = Encoding.UTF8.GetString(buffer, 0, len);
        Console.WriteLine(str);
        //解析完在执行接收方法 
        StartReceive(client);
    }
}

先运行服务端然后运行客户端

  • 9
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值