简单的Unity使用Socket模板

服务端:

socket绑定ip和端口
开启socket,等待连接(新线程中,防止阻塞)
监听到连接,开启两端数据传输(新线程,防止阻塞)
等待连接中断,关闭传输线程。
关闭连接等待。

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



public static class OperationSocketServer
{
    static Thread serverListener;//等待连接
    static Thread serverReadData;//读取数据
    static Socket SK_server;

    public static void OpenServer(string ipaddress,int port)
    {
        try
        {
            IPAddress pAddress = IPAddress.Parse(ipaddress);
            IPEndPoint pEndPoint = new IPEndPoint(pAddress, port);
            SK_server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//TCP连接
            SK_server.Bind(pEndPoint);
            SK_server.Listen(1);//设置最大连接数
          //  Debug.Log("监听成功");
            //创建新线程执行监听,否则会阻塞,导致unity无响应
            serverListener = new Thread(ServerListen);
            serverListener.IsBackground = true;
            serverListener.Start(SK_server);
        }
        catch (System.Exception)
        {
            Debug.LogError("打开失败");
        }
    }
    static Socket socketSend;
    private static void ServerListen(object o)
    {
        try
        {
            Socket socketWatch = o as Socket;
            while (true)
            {
            //此处注意,Accept()方法是阻塞的,子线程执行到这里就一直在这里等待连接,所以正常情况下不能通过抛出异常来执行一些未连接的逻辑方法。BeginAccept()是异步的。暂时没用过
                socketSend = socketWatch.Accept();
                Debug.Log(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");

                //新建线程不断监听接受数据
                serverReadData = new Thread(Received);
                serverReadData.IsBackground = true;
                serverReadData.Start(socketSend);
            }
        }
        catch (System.Exception)
        {

            throw;
        }
    }
    static byte[] buffer;
    private static void Received(object o)
    {
        try
        {
            Socket socketSend = o as Socket;
            while (true)
            {
                buffer = new byte[1024];
                int len = socketSend.Receive(buffer);
                if (len == 0) break;
                string str = Encoding.UTF8.GetString(buffer, 0, len);
                //处理数据
                //Data(str);
#if UNITY_EDITOR
                Debug.Log("服务器打印客户端返回消息:" + socketSend.RemoteEndPoint + ":" + str);
#endif
                // Send("我收到了");
            }
        }
        catch (System.Exception)
        {

            throw;
        }
    }
    public static void CloseServer()
    {
        serverListener.Abort();
        serverReadData.Abort();
        SK_server.Close();
    }
}

客户端

socket绑定ip和端口
连接socket
连接成功,发送数据【开启数据接受传输(新线程,防止阻塞)】
【关闭连接,关闭数据接受线程。】
断开连接。

 public bool ConnectServer(string serverip,int serverPort)
    {
        try
        {
            IPAddress pAddress = IPAddress.Parse(serverip);
            IPEndPoint pEndPoint = new IPEndPoint(pAddress, serverPort);
            socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socketClient.Connect(pEndPoint);
            return true;
            // Debug.Log("连接成功");
            //创建线程,执行读取服务器消息
            //clientConnect = new Thread(Received);
            //clientConnect.IsBackground = true;
            //clientConnect.Start();
        }
        catch (System.Exception)
        {
            return false;
        }
    }


 public void Send(string msg)
    {
        try
        {
            byte[] buffer = new byte[1024];
            buffer = Encoding.UTF8.GetBytes(msg);
            socketClient.Send(buffer);
        }
        catch (System.Exception)
        {
            Debug.Log("未连接");
        }
    }

掉线重连

心跳

数据传输

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值