Unity 与C#服务器 Socket的UDP通信

前言

这几天简单的研究了下Unity和服务器有关Socket的UDP通信,因为帧同步当中,UDP相比TCP是更适合的那种,因为UDP在网络环境较差时,波动更小,实时性也更高,可以更好的解决卡顿的问题(具体的小伙伴们可自行查阅资料)。当然使用UDP造成的开发量与开发难度会更大。在这里,我就先记录下自己这几天实现的udp简单的客户端与服务器的发送与接收功能的demo代码。


注意

1.本文是接着之前Socket通信的demo继续的,所以有些用的的东西可能在上一篇文章当中,大家需要的可以看一下:https://blog.youkuaiyun.com/wangjiangrong/article/details/80844392

2.相对tcp的强链接,udp是弱连接,客户端用udp给服务器发消息的时候,不需要和tcp那样先建立连接(connect)再发送,而是直接向服务器地址发送消息即可。类似我们发短信,知道对方手机号即可直接发送,而不用关心对方是否开机等信息。

3.目前研究下来,有两种写法,一种是用Socket对象,另一种是用UdpClient对象。两种写法我都试了,其中UdpClient可以成功的实现客户端和服务器的接收和发送,但是Socket只实现了客户端像服务器发送消息且服务器成功接收,但是客户端接收服务器消息则遇见了问题还没解决,有大佬懂的请指教一下。(研究下来是,Socket调用ReceiveFrom方法接收前,需要调用Bind方法,但是调用了Bind方法之后,SendTo方法那就报错了,因为SendTo方法不能调用前Bind。)

Socket.ReceiveFrom 方法:https://msdn.microsoft.com/zh-cn/library/7t7fzd26(v=vs.110).aspx

Socket.SendTo 方法:https://msdn.microsoft.com/zh-cn/library/1h691da7(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

4.现在的代码只实现了一对一的通信,若要一对多,小伙伴们可以先研究研究多加些逻辑判断,后续补充有时间。

代码

下面就直接上代码了,大致思路就是,客户端和服务器都建立好Socket,并且服务器建立一个定时器用来给客户端定时发消息,,然后客户端像服务器发送消息,当服务器接收到消息的时候就开始向客户端定时发送消息。

因为没有连接,所以服务器也不知道客户端什么时候停止向客户端发送消息,向客户端发送消息的定时器需要何时停止,所以我目前的思路是,客户端要停止发送消息的时候可以给服务器发送一个指定消息,当服务器接收到指定消息的时候就停止再向客户端的消息发送,关掉定时器,这段功能暂时没有加。

首先是UdpClient写法的:

UdpClient

服务器代码

先上用一个类来存放常量

namespace Tool {
    class SocketDefine {
        public const int port = 8078;//端口号
        public const string ip = "127.0.0.1";
    }
}

然后建立一个单例类来管理UdpClient

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

namespace Tool {
    class UdpManager : SingleClass<UdpManager> {

        UdpClient m_udpClient;
        IPEndPoint m_clientIpEndPoint;//存放客户端地址
        Thread m_connectThread;//接收客户端消息的线程
        byte[] m_result = new byte[1024];//存放接收到的消息

        bool m_isStartSend;//接收到客户端消息的时候才可以发送

        //初始化
        public void Start() {
            m_isStartSend = false;
            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Parse(SocketDefine.ip), SocketDefine.port);
            m_udpClient = new UdpClient(ipEnd);

            //定义客户端
            m_clientIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            Console.WriteLine("等待连接数据");
            //开启一个线程连接
            m_connectThread = new Thread(new Thr
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值