当前位置: 首页 > news >正文

Socket通信Demo(Unity客户端和C#)

Socket通信基本流程

  • 首先要启动服务器创建Socket,然后要绑定服务器的一个端口
  • 这样客户端通过服务器IP+端口号就能连接到服务器了
  • 服务器接下来会设置监听队列,监听并等待要连接到它的客户端
  • 客户端在服务器启动之后也建立自己的Socket,然后使用客户端的Socket去连接服务器
  • 连接成功之后客户端和服务器之间就可以发送数据和接收数据
  • 当客户端关闭的时候,服务器会捕捉到客户端连接关闭
  • 服务器会把对应客户端的Socket也进行关闭

实现 

新建一个Unity项目新建脚本编写客户端

using System.Net.Sockets;
using System.Net;
using System;
using System.Text;public class Client : MonoBehaviour
{private Socket socket;//定义用来存消息的容器private byte[] buffer = new byte[1024];// Start is called before the first frame updatevoid Start(){//参数: IPV4协议, 套接字的传输类型(流式传输), socket传输协议(TCP)socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream ,ProtocolType.Tcp);  //连接服务器: 服务器IP, 服务器端口号socket.Connect("127.0.0.1", 6666);  //连接完成//连接成功调用接收方法异步接收消息StartReceive();//连接成功发送消息Send();}//接收消息void StartReceive(){socket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,ReceiveCallback,null);}//接收消息的回调方法(作为参数传递的函数)void ReceiveCallback(IAsyncResult iar){//接收返回消息长度int len = socket.EndReceive(iar);//接收为0代表终止连接if (len == 0){return;}//解析bufferstring str = Encoding.UTF8.GetString(buffer, 0, len);Debug.Log(str);//解析完在执行接收方法 StartReceive();}void Send(){socket.Send(Encoding.UTF8.GetBytes("服务器你好,我是客户端!"));}// Update is called once per framevoid Update(){}
}

创建一个空物体挂载客户端脚本

 新建一个窗体应用编写服务端

using System.Net.Sockets;
using System.Net;
using System;
using System.Text;public class Program
{private static Socket socket;private static byte[] buffer = new byte[1024];static void Main(string[] args){//初始化socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//绑定socket.Bind(new IPEndPoint(IPAddress.Any, 6666));//监听:  挂起的连接队列最大长度 —— 同时处理连接请求的最大数,超出最大数会排队等待socket.Listen(0);StartAccept();Console.Read(); //阻塞住让程序不会结束}//开始应答static void StartAccept(){//开始异步应答连接   参数: 回调函数,objectsocket.BeginAccept(AcceptCallback, null);}static void AcceptCallback(IAsyncResult iar){//异步接受传入的连接尝试,并创建新的 Socket 来处理远程主机通信。Socket client = socket.EndAccept(iar);//开始接收StartReceive(client);//重新开始应答StartAccept();}//接收消息static void StartReceive(Socket client){//开始从连接的 Socket 中异步接收数据client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);}//回调函数static void ReceiveCallback(IAsyncResult iar){Socket client = iar.AsyncState as Socket;//结束接收返回消息长度int len = client.EndReceive(iar);//接收为0代表终止连接if (len == 0){return;}//解析bufferstring str = Encoding.UTF8.GetString(buffer, 0, len);Console.WriteLine(str);//解析完在执行接收方法 StartReceive(client);}
}

先运行服务端然后运行客户端

http://www.lryc.cn/news/317598.html

相关文章:

  • Lucene 自定义词库
  • 【LeetCode热题100】73. 矩阵置零(矩阵)
  • 使用Barrier共享鼠标键盘,通过macos控制ubuntu系统
  • c++:类和对象中:拷贝构造和赋值运算符重载详解
  • Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制
  • Log4j如何支持多线程环境?你如何优化Log4j的性能?
  • golang sync.Pool 指针数据覆盖问题
  • VUE+内置iframe传值失效问题解决
  • Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测
  • Go Zero微服务个人探究之路(十六)回顾api服务和rpc服务的本质
  • 基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的夜间车辆检测系统(深度学习代码+UI界面+训练数据集)
  • Spring体系架构
  • 【PLC】现场总线和工业以太网汇总
  • 【吊打面试官系列】Java虚拟机JVM篇 - 关于JVM分析
  • Mysql锁与MVCC
  • rancher是什么
  • 阿里云服务器安全狗免费使用多引擎智能查杀引擎
  • 使用rust实现九九乘法表
  • 突破编程_C++_设计模式(简单工厂模式)
  • C语言——快速排序
  • FP独立站获客秘籍大揭秘:简单高效,一看就会!
  • 英伟达tx2光驱烧录功能支持
  • 关于stm32(CubeMX+HAL库)的掉电检测以及flash读写
  • Elastic script_score的使用
  • 【Spring Boot 3】获取已注入的Bean
  • C# 对于点位置的判断
  • 最新CLion + STM32 + CubeMX 开发环境搭建
  • 【Python3】观察者模式
  • HTML5 Web Worker之性能优化
  • 应对恶意IP攻击的有效方法