Unity的Socket通讯,Unity作为服务端

这篇具有很好参考价值的文章主要介绍了Unity的Socket通讯,Unity作为服务端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 最近在研究Socket通讯,发现对Unity来说,作为客户端的情况比较多,于是突发奇想搞一个服务器端,废话不多说直接上代码

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

public class Test : MonoBehaviour
{
    private static int myProt = 12345;   //端口  
    static Socket serverSocket;
    Thread myThread;
    Dictionary<string, Thread> threadDic = new Dictionary<string, Thread>();//存储线程,程序结束后关闭线程
    private void Start()
    {
        //服务器IP地址  ,127.0.0.1 为本机IP地址
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        //IPAddress ip = IPAddress.Any; //本机地址
        Debug.Log(ip.ToString());
        serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        IPEndPoint iPEndPoint = new IPEndPoint(ip, myProt);
        //serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口  
        serverSocket.Bind(iPEndPoint);  //绑定IP地址:端口  
        serverSocket.Listen(10);    //最多10个连接请求  
                                    //Console.WriteLine("creat service {0} success",
                                    //    serverSocket.LocalEndPoint.ToString());

        myThread = new Thread(ListenClientConnect);
        myThread.Start();
        //Console.ReadLine();
        Debug.Log("服务器启动...........");

    }

    // 监听客户端是否连接  
    private void ListenClientConnect()
    {
        while (true)
        {
            Socket clientSocket = serverSocket.Accept(); //1.创建一个Socket 接收客户端发来的请求信息 没有消息时堵塞
            clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello")); //2.向客户端发送 连接成功 消息
            Thread receiveThread = new Thread(ReceiveMessage); //3.为已经连接的客户端创建一个线程 此线程用来处理客户端发送的消息
            receiveThread.Start(clientSocket); //4.开启线程

            //添加到字典中
            string clientIp = ((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString();
            //Debug.Log( clientSocket.LocalEndPoint.ToString()); //获取ip:端口号
            if (!threadDic.ContainsKey(clientIp))
            {
                threadDic.Add(clientIp, receiveThread);
            }
        }
    }

    private byte[] result = new byte[1024]; //1.存入的byte值 最大数量1024
    //开启线程接收数据 (将Socket作为值传入)
    private void ReceiveMessage(object clientSocket)
    {
        Socket myClientSocket = (Socket)clientSocket; //2.转换传入的客户端Socket
        while (true)
        {
            try
            {
                //接收数据  
                int receiveNumber = myClientSocket.Receive(result); //3.将客户端得到的byte值写入
                //Debug.Log(receiveNumber);//子节数量
                if (receiveNumber > 0)
                {
                    Debug.Log("client say :" + Encoding.ASCII.GetString(result, 0, receiveNumber));
                }
                else
                {
                    Debug.Log("client: " + ((IPEndPoint)myClientSocket.RemoteEndPoint).Address.ToString() + "断开连接");
                    threadDic[((IPEndPoint)myClientSocket.RemoteEndPoint).Address.ToString()].Abort(); //清除线程
                }
            }
            catch (Exception ex)
            {
                //myClientSocket.Shutdown(SocketShutdown.Both); //出现错误 关闭Socket
                Debug.Log(" 错误信息" + ex); //打印错误信息
                break;
            }
        }
    }

    void OnApplicationQuit()
    {
        //结束线程必须关闭 否则下次开启会出现错误 (如果出现的话 只能重启unity了)
        myThread.Abort();

        //关闭开启的线程
        foreach (string item in threadDic.Keys)
        {
            Debug.Log(item);//de.Key对应于key/value键值对key
            //item.Value.GetType()
            threadDic[item].Abort();
        }
    }

}文章来源地址https://www.toymoban.com/news/detail-452133.html

到了这里,关于Unity的Socket通讯,Unity作为服务端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 通俗讲解什么是Socket通讯

    Socket ,即套接字。就是两台主机之间逻辑连接的 端点 。(通俗来说:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket)。 Socket是一套用于不同主机之间通信的API,它工作在我们的TCP/IP协议栈之上,可应用于浏览器、手机应用或用于

    2024年02月06日
    浏览(36)
  • 汇川AM403PLC作为ModbusTCP主站通讯实例

    一、通讯方案实例  1.客户端/服务端   客户端和服务端是计算机网络中常见的两种网络设备类型,在工业通信中也称之为主站/从站,它们在网络通信过程中扮演着不同的角色。简单来说,客户端通常在网络中发起请求,而服务端则为客户端提供资源或数据。本例中使用主

    2024年02月03日
    浏览(54)
  • ProEasy机器人:TCP无协议通讯(socket通讯)时打印log日志

    打印日志需要调用lua中的io相关文件函数与os相关时间函数,代码如下 --------TCP无协议视觉通讯------- function open_client_Vision()   --连接视觉服务器 打开以太网作为客户端     repeat         FreePort.ECM_CloseAll()                --关闭所有链接         FreePort.ECM_Clear(1)      

    2024年02月09日
    浏览(45)
  • Socket通讯使用的坑-消息合并发送-解决方法

    关联文章  Socket通讯使用的坑-消息合并发送-CSDN博客 解决方法 调用

    2024年01月17日
    浏览(49)
  • 基于西门子S7-200smart作为客户端的modbustcp通讯

    具体PLC实施及排配和上位机modbustcp对应地址关系 1.启动按钮—I0.0 -------modbus地址:2000 2.停止按钮—I0.1 -------modbus地址:2001 3.急停按钮—I0.2 -------modbus地址:2002 4.进料感应器—I0.3 -------modbus地址:2010 5.出料感应器—I0.4 -------modbus地址:2015 6.电机运行—Q0.0 -------modbus地址:2

    2024年02月03日
    浏览(69)
  • nodejs使用 Unix domain socket进行IPC通讯

    Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信。 socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket。虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.

    2024年01月21日
    浏览(36)
  • C语言 进程通讯 socket套接字(TCP/UDP)示例

    主机字节序(host-byte):指处理器存储数据的字节顺序,分两种         大端存储(big-endian):低地址存储数据高位(符合书写规则),由ARM、Motorola等采用         小端存储(little-endian):低地址存储数据低位(将数据不重要的部分保存在低地址,重要的部分保存在高地

    2024年02月05日
    浏览(50)
  • 山特UPS串口通讯协议研究

          山特中高端UPS默认配备串口通讯,可以通过串口获取UPS运行信息,通过自带电源管理软件WinPower可以实现断电远程关机功能。         网上关于山特UPS串口通讯协议,有一些简单的文档和研究,但是通过深入了解,发现这些文档已经和现在的实际情况有较大的出入

    2024年02月06日
    浏览(154)
  • C#和网络通讯:TcpClient、TcpListener和Socket的使用比较

    大家好,我是华山自控编程朱老师 在C#编程语言中,网络通讯是非常常见的需求。为了简化网络编程的复杂性,C#提供了TcpClient、TcpListener和Socket这三个类,用于实现TCP通信。本文将对它们进行比较,并介绍它们的主要用途。 首先,我们来看一下TcpClient和TcpListener这两个类。它

    2024年02月08日
    浏览(44)
  • Qt6教程之三(13) TCP/IP通讯与socket编程

    目录 一 前言 二 TCP/IP协议架构和通信原理 三 TCP/IP的连接与断开过程 四 Qt中开发TCP/IP原理概述 五 完整实例代码示范 在软件开发中,常用的技术体系里面网络通信属于最重要的 “联通” 技术,是必须要掌握的技术。 那为什么网络通信如此重要呢,我想大概有以下几点: 不

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包