Unity Socket 初级入门

一个比较简单的服务器和客户端在unity上运行的代码

服务端实现

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

public class fuwuduan : MonoBehaviour
{
    Thread t;
    bool accept= true;
    // Start is called before the first frame update
    void Start()
    {

        t = new Thread(socketServer);
        t.IsBackground = true;

        if (!t.IsAlive)
        {
            t.Start();
        }

    }

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

        if (Input.GetKeyDown("a"))//关闭服务器
            accept = false;
    }

    //接收消息
    private void socketServer()
    {

        Debug.Log("创建socket服务端!");
        //1,创建socket             using System.Net.Sockets;
        //AddressFamily.InterNetwork内网,SocketType.Stream以流来通信,第三个为协议
        Socket tcpSever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //2,绑定服务器IP(计算机唯一标识)和端口号。端口号将通信数据给指定的软件。一个软件占用一个特定端口号(0-60000)
        //查看本机IP:cmd-》ipconfig  本机局域网IP:198.168.1.2 
        //IPAddress ipAddress = new IPAddress(new byte[] { 192,168,1,2});
        EndPoint point = new IPEndPoint(IPAddress.Parse("192.168.124.20"), 8888);//IPEndPoint是对IP+端口号的一层封装
        tcpSever.Bind(point);//向操作系统申请一个可用的IP和端口号做通信。绑定当前IP和端口号


        do
        {
            //3.监听。等待客户端连接
            tcpSever.Listen(100);//参数是最大连接数
            Socket clientSocket = tcpSever.Accept();//暂停当前线程,直到一个客户端连接过来,之后进行下面的代码。返回的socket为客户端socket

            //使用返回的socket跟客户端做通信
            string message = "welcome!";
            Debug.Log(message);
            byte[] meg = Encoding.UTF8.GetBytes(message);//对字符串编码,得带一个字节数组
            clientSocket.Send(meg);

            //接受客户端数据
            byte[] buffer = new byte[1024];
            int length = clientSocket.Receive(buffer);//接受客户端数据
            string mes = Encoding.UTF8.GetString(buffer, 0, length);
            Debug.Log("服务端收到:" + mes);

        } while (accept);

        //关闭服务器
        tcpSever.Close();
    }

    void OnDestroy()
    {
        closeT();
    }

    void closeT()
    {

        if (t.IsAlive)
        {
            t.Abort();
            Debug.Log("关闭线程");
        }
    }

}

 客户端实现

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

public class kehuduan : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //发送消息
        if(Input.GetKeyDown("s")) 
            socketClient("早上好");

    }

    private void socketClient(string msg)
    {
        Debug. Log("创建socket客户端!");
        //创建socket
        Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //发起连接请求
        EndPoint remoteIp = new IPEndPoint(IPAddress.Parse("192.168.124.20"), 8888);
        tcpClient.Connect(remoteIp);//连接远程已经绑定IP和端口号的服务器端。已连接远程主机。

        //从远程主机接受数据并显示在客户端
        byte[] buffer = new byte[1024];
        int byteNum = tcpClient.Receive(buffer);//将接受到的数据,存入buffer。返回值为接受到的字节数
        string message = Encoding.UTF8.GetString(buffer, 0, byteNum);//将接受到的数据,转化为字符串
        Debug.Log("客户端收到:" + message);

        //发送给服务器
        string clientToSeverMes = msg;
        byte[] cts = Encoding.UTF8.GetBytes(clientToSeverMes);
        tcpClient.SendTo(cts, remoteIp);
    }
}

然后创建一个空物体附加上两个脚本

 

 按s发送客户端数据就可以看到服务端接收到客户端消息并且返回数据

 需要注意的是我服务端Accept()时会暂停线程所以必须要用线程来运行,在主线程运行会卡死

客户端如果接收不到数据也会卡顿,建议也创建线程运行

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值