jjzjj

【Unity】Socket网络通信(TCP) - 最基础的客户端通信流程

IM雾凇 2024-06-23 原文

这篇文章主要内容是客户端与服务器通信的内容,服务端代码可以看我的这一篇文章【Unity】Socket网络通信(TCP) - 最基础的C#服务端通信流程
客户端与服务器的整个流程比较相似,客户端会更加简单一些:

  1. 创建socket
  2. 连接服务器
  3. 收发消息
  4. 释放socket,关闭连接

创建Socket

和服务端创建socket一样,直接new一个Socket对象就可以了,构造函数传入的参数分别是
1.IP地址类型。AddressFamily.InterNetwork是IPv4类地址,AddressFamily.InterNetworkV6是IPv6类地址,这里用的是IPv4地址。
2.socket类型。TCP协议对应的Socket类型是流类型,所以这个参数用的是SocketType.Stream。
3.协议类型。选择TCP协议。
注意:Socket需要引用命名空间using System.Net.Sockets;

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

连接服务器

使用socket提供的Connect方法即可,需要传入一个EndPoint对象。这里需要注意的是,IP地址填的是服务器的IP地址,端口号也是服务端的端口号。(我这里测试因为服务端和客户端是在同一台机器上,所以都是用的127.0.0.1)
注意:IPEndPoint需要引用命名空间using System.Net;

IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
socket.Connect(endpoint);

接收服务端发来的消息

由于我们在写服务端的时候是先发的消息,所以我们客户端先接收一下服务端发来的消息。接收消息的逻辑和服务端一致,使用socket提供的Receive方法接收就行,同样是先定义一个字节数组来接收消息,再解析字节数组就可以了。
这里服务端发过来的是字符串,我们直接将字节数组转化成字符串就行了,Encoding需要引用命名空间using System.Text;

byte[] msg = new byte[1024];
int msgLength = socket.Receive(msg);
Debug.Log("收到服务器发送的消息:" + Encoding.UTF8.GetString(msg, 0, msgLength));

发送消息

发送消息直接用socket提供的Send方法就行,参数需要一个字节数组,由于我们的服务端只写了解析字符串的逻辑,那我们客户端就发个字符串消息过去,字符串需要转成字节数组。

socket.Send(Encoding.UTF8.GetBytes("这里是unity客户端,over!"));

释放Socket,关闭连接

使用socket提供的Shutdown函数关闭发送/接收,然后Close关闭就可以释放连接了。
Shutdown传入的参数可以是以下3种,Both是接收/发送都关闭,Receive是关闭接收,Send是关闭发送。

socket.Shutdown(SocketShutdown.Both);
socket.Close();

调试

首先我们先运行服务端程序,然后再运行我们的unity客户端程序,就能在客户端看到服务端发来的消息了,同样服务端也可以收到我们客户端发送过去的消息。

完整代码

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

public class TCPLearn : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //创建socket
        Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //连接服务器
        IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
        //这里防止连接失败报错,SocketException能提供错误代码
        try
        {
            socket.Connect(endpoint);
        }catch(SocketException e)
        {
            Debug.Log("服务器连接失败:" + e.ErrorCode);//10061是服务器拒绝连接
        }
        
        //收发消息
        //收消息
        byte[] msg = new byte[1024];
        int msgLength = socket.Receive(msg);
        Debug.Log("收到服务器发送的消息:" + Encoding.UTF8.GetString(msg, 0, msgLength));
        //发消息
        socket.Send(Encoding.UTF8.GetBytes("这里是unity客户端,over!"));

        //释放连接
        socket.Shutdown(SocketShutdown.Both);
        socket.Close();
    }
}

以上就是这篇文章的所有内容了,此为个人学习记录,如有哪个地方写的有误,劳烦大佬指出,感谢,希望对各位看官有所帮助!

有关【Unity】Socket网络通信(TCP) - 最基础的客户端通信流程的更多相关文章

  1. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  4. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  5. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  6. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  7. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  8. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  9. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  10. 软件测试基础 - 2

    Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功

随机推荐