最近在尝试unity的Socket建立,直接白嫖的代码同时来自己学习。可以先去看一下这个up讲解的视频是否满足自己需求。

Unity一个脚本解决UDP双端通讯_哔哩哔哩_bilibili

下面是代码:(我把其分成几部分来细说,有错误的地方还请指出!感谢大家~)

第一部分:头文件函数等

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

此部分不做介绍。

第二部分:建立客户端通信插口

    //定义客户端通信插口Socket socket_c;[Header("---------------------客户端--------------------")]public string biji = "备注";[Header("存放对方的接收ip")]public string oppositeIP = "192.168.2.2";[Header("存放对方的接收端口")]public int oppositePort = 8888;//对方服务端ip端口对IPEndPoint oppositeIpEnd;//广播的所有ipList<string> allIPv4 = new List<string>();

这一部分主要建立两个变量分别存储对方ip地址和端口号。

其中IPEndPoint类,是将 IP 地址和服务端口号组合在一起。

第三部分:建立服务端通信插口

    //定义服务端通信插口Socket socket_s;[Header("---------------------服务端--------------------")][Header("本机开放的端口")]public int selfConnectPoint = 7777;// [Header("本机ip自动获取")]public static string selfAddress = "";//本机服务端所监听的ip端口对EndPoint selfListenEnd;//监听线程Thread connectThread;

第三部分是当unity作为服务端时,需要暴露出一个端口和ip地址,同时开启了一个监听线程。

(这里的ip地址后期会自动获取,详见下面)

第四部分:字符串接受面板显示

    [Header("------------------入站的字符串---------------")]public string recvStr;//定义接受byte数组的长度int recvLen = 0;//接收到的byte数据byte[] recvData = new byte[1024];//要发送的的byte数据byte[] sendData = new byte[1024];

第四部分,这里会在unity的spector面板显示传入的字符串,还有接受和发送的相关数组。

第五部分:Unity脚本初始化函数

   void Start(){//去除ip 前后空格oppositeIP = oppositeIP.Trim(); //去掉字符串的前后空格//定义本机服务器的ip和端口对if (selfAddress == ""){selfAddress = GetLocalIP();}selfAddress = selfAddress.Trim();GetBroadcastIP(selfAddress);//初始化InitSocket();}

第五部分,在这里分别对unity做客户端和服务端初始化。首先将对方的ip格式进行整理,即oppsoiteIP.Trim()。同时通过GetLocalIP()自定义函数获得本机的IP地址,将本机地址发送给广播函数,后期要以本机地址为基础向192.168.56.1到192.168.56.255发送广播数据报。

在这里同时进行socket()初始化。

第六部分:Socket()初始化

    void InitSocket(){//作为客户端//定义对方的ip和端口对oppositeIpEnd = new IPEndPoint(IPAddress.Parse(oppositeIP), oppositePort);socket_c = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//socketListen.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);//设置SOCKET允许多个SOCKET访问同一个本地IP地址和端口号 //作为服务端    //本机服务器监听的ip端口对selfListenEnd = new IPEndPoint(IPAddress.Parse(selfAddress), selfConnectPoint);socket_s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);socket_s.Bind(selfListenEnd);//开启本机服务器监听线程connectThread = new Thread(new ThreadStart(SocketReceive));connectThread.Start();//给目标服务端发送数据测试  SocketSendDefault(selfListenEnd.ToString() + ":first");print("对方接到表示连接成功");}

第六部分为socket的初始化:

对于客户端来说,将客户端的IP地址和端口统一并赋给oppositeEnd,建立一个客户端的socket_c。

对于服务端来说,将服务端的IP地址和端口统一并赋给selfListenEnd,建立一个服务端的socket_s,将此socket_s与selfListenEnd绑定。

开启一个监听线程,并传入参数SocketReceive.(下面会说)

通过SocketSendDefault()测试是否连接成功。

第七部分:服务器的监听

    //本机服务器监听void SocketReceive(){while (true){recvData = new byte[1024];recvLen = socket_s.ReceiveFrom(recvData, ref selfListenEnd);recvStr = Encoding.UTF8.GetString(recvData, 0, recvLen);Debug.Log("信息来自" + selfListenEnd.ToString() + ":" + recvStr);getNew = true;}}

第七部分为服务器的监听

socket_s.ReceiveFrom()为接收数据并存储其数据来源客户端,并最终返回数组长度。

Encoding.UTF8.GetString将字符串用UTF8方法编码。

Debug.Log为Unity的控制台打印内容。

第八部分:作为客户端发送

//默认ip端口发送public void SocketSendDefault(string sendStr){//清空sendData = new byte[1024];//数据转换sendData = Encoding.UTF8.GetBytes(sendStr);//发送给指定服务端socket_c.SendTo(sendData, sendData.Length, SocketFlags.None, oppositeIpEnd);}//自定义ip端口发送public void SocketSendCustom(string sendStr, string ip, int port){//清空sendData = new byte[1024];//数据转换sendData = Encoding.UTF8.GetBytes(sendStr);IPEndPoint aimIpEnd;aimIpEnd = new IPEndPoint(IPAddress.Parse(ip), port);//发送给指定服务端socket_c.SendTo(sendData, sendData.Length, SocketFlags.None, aimIpEnd);}//默认ip端口群发public void SendToAllDefault(string sendMsg){StartCoroutine(SocketBroadcastSend(sendMsg, oppositePort));}//自定义ip端口群发public void SendToAllCustom(string sendMsg, int port){StartCoroutine(SocketBroadcastSend(sendMsg, port));}IEnumerator SocketBroadcastSend(string sendStr, int port){//清空byte[] sendData_thread = new byte[1024];//数据转换sendData_thread = Encoding.UTF8.GetBytes(sendStr);IPEndPoint aimIpEnd;foreach (string ip in allIPv4){Debug.Log(ip);aimIpEnd = new IPEndPoint(IPAddress.Parse(ip), port);socket_c.SendTo(sendData_thread, sendData_thread.Length, SocketFlags.None, aimIpEnd);}yield return null;}

第九部分:线程的关闭

    //连接关闭void SocketQuit(){//关闭线程if (connectThread != null){connectThread.Interrupt();connectThread.Abort();}//最后关闭socketif (socket_c != null)socket_c.Close();if (socket_s != null)socket_s.Close();StopAllCoroutines();}void OnApplicationQuit(){SocketQuit();}

第十部分:Unity更新

    void Update(){if (getNew == true){getNew = false;//执行接收文本事件}}

第十一部分:自动获取本机地址

public static string GetLocalIP(){try{string HostName = Dns.GetHostName();             //得到主机名//返回一个IPHostEntry实例,其中包含有关 HostName 中指定的主机的地址信息// IPHostEntry为 Internet 主机地址信息提供容器类//方法 GetHostEntry 在 DNS 服务器中查询与主机名或 IP 地址关联的 IP 地址,并将 IP 地址解析为 IPHostEntry 实例。IPHostEntry IpEntry = Dns.GetHostEntry(HostName);for (int i = 0; i < IpEntry.AddressList.Length; i++){//从IP地址列表中筛选出IPv4类型的IP地址//AddressFamily.InterNetwork表示此IP为IPv4,//AddressFamily.InterNetworkV6表示此地址为IPv6类型if (IpEntry.AddressList[i].AddressFamily == AddressFamily.InterNetwork){Debug.Log(IpEntry.AddressList[i].ToString());return IpEntry.AddressList[i].ToString();}}return "noIp";}catch{Debug.Log("ipGetFailed");return ("ipGetFailed");}}

第十二部分:广播机制

    public void GetBroadcastIP(string ip){string[] nums = ip.Split('.');string head = nums[0] + "." + nums[1] + "." + nums[2] + ".";for (int i = 1; i < 255; i++){allIPv4.Add(head + i.ToString());}}

ps源码见b站链接

Unity/C# Socket框架学习遇到的相关方法相关推荐

  1. Unity游戏框架学习笔记——03基于观察者模式的事件中心

    Unity游戏框架学习笔记--03基于观察者模式的事件中心 基于观察者模式的事件中心 一如既往指路牌:https://www.bilibili.com/video/BV1C441117wU?p=5. ...

  2. Unity消息简易框架 Advanced C# messenger

    Unity消息简易框架 Advanced C# messenger Unity C# 消息机制  [转载 雨凇MOMO博客] https://www.xuanyusong.com/archives/2 ...

  3. python框架怎么学_Python框架学习

    Python框架学习 基于flask框架的MySql数据库交互系统. 1.开发环境 #系统:win10 #python版本:PY3.6 #MySQL版本:MySQL5.6 #开发工具:Pycharm ...

  4. PHP,mysql,Linux,CI框架学习总结

    PHP,mysql,CI框架学习总结 PHP标记 1.Xml风格<?php ?> 2.简短风格 <? ?> 需在php.ini中开启short_open_tag 3.asp风格 ...

  5. Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析)

    Netty网络框架学习笔记-16(心跳(heartbeat)服务源码分析_2020.06.25) 前言: Netty 作为一个网络框架,提供了诸多功能,比如编码解码等,Netty 还提供了非常重要的一 ...

  6. Django框架学习(一)Django框架安装和项目创建详解

    Django框架学习(一)Django框架安装和项目创建详解 文章目录 Django框架学习(一)Django框架安装和项目创建详解 一.简介 1.1介绍 1.2 URL 1.3.框架原理 二.安装 ...

  7. 框架学习——WCF框架

    框架学习--WCF框架 什么是WCF .NET平台下,有很多分布式技术 WCF 快速搭建一个WCF程序 1.ABC概念 2.如何定义WCF项目 参考资料 什么是WCF .NET平台下,有很多分布式技术 ...

  8. ET服务器框架学习笔记(十)

    ET服务器框架学习笔记(十) 文章目录 ET服务器框架学习笔记(十) 前言 一.ET之Service 1.Service主要数据 2.Service主要逻辑 3.Service其他逻辑 二.ET之Ne ...

  9. ET6.0服务器框架学习笔记(二、一条登录协议)

    ET6.0服务器框架学习笔记(二.一条登录协议) 上一篇主要记录ET6.0的服务器启动功能,本篇主要记录ET6.0完整的一条协议,从配置到生成协议数据,到从客户端发送给服务端,再发送回客户端的流程 文 ...

最新文章

  1. option:contains后面加变量_Python基础篇 -2:初识Python中的变量
  2. 正交多项式族(勒让德多项式跟切比雪夫多项式)理论
  3. anki vector robot入门语音指令大全
  4. 关于CS1061报错(XX不包含XXX的定义,并且找不到类型为XX的第一个参.....)的一种可能的解决的办法...
  5. JavaScript(七)—— BOM 浏览器对象模型
  6. 超级终端设置-基本配置(华为)
  7. Linux不用来写代码,我使用过的Linux命令之:(冒号) - 啥也不做(除了……)
  8. vue.js 模板语法
  9. html与css结合动效案例,写CSS动效的常用套路(附demo的效果实现与源码)
  10. 2021上半年ICPC各类赛事时间日程
  11. 超实用的XRD数据定性分析方法,三分钟上手,科研小白变大神!
  12. python办公自动化——批量向excel填充数据
  13. 亚马逊秒杀活动怎么报名?站斧浏览器亚马逊站内促销
  14. 材料力学 4.弯曲内力
  15. Python文本彩色图像去污
  16. C++ 11 内容总结
  17. Allegro 的一些实用操作技巧
  18. Termux 速成指南
  19. 计算机64位只有2g,电脑插了4G内存,但只有2G左右可以用,为什么 WIN7 64位
  20. 互斥事件的概念和公式_统计学中的基本概念和重要公式(一)

热门文章

  1. 一个对战程序的C++源代码
  2. e-Japen:看日本如何打造电子政府(转)
  3. 编一个程序完成从键盘上输入一个4位的16进制数,并以八进制形式显示出来。
  4. 【论文笔记】On Recognizing Texts of Arbitary Shapes with 2D Self-Attention(SATRN)
  5. 在安装eclipse时失败
  6. 计算机模拟退火算法,模拟退火算法
  7. 【愚公系列】2023年06月 网络安全高级班 092.CNVD原创漏洞证书(文件下载)
  8. Fragment重叠问题引发的思考
  9. [noj1034] 一只青蛙一张嘴
  10. 【Adobe Premiere】将视频的每一帧导出