Unity 网络编程一: Echo程序

发布时间 2023-07-12 14:35:49作者: CatSevenMillion

1.Echo程序是什么?

  Echo程序是网络编程中最基础的一种案例,分为客户端与服务端。Echo程序的流程是客户端发送一段文本信息,服务器再把这个文本进行回应。

2.实现

  客户端:

   使用UGUI组件搭建一个简易的窗口,1是连接按钮,2是输入文本框,3是发送文本按钮,4是显示文字

  我们在再写一个Echo名称的脚本,挂在一个空物体上:

using System.Net.Sockets;
using TMPro;
using UnityEngine;
public class Echo : MonoBehaviour
{
    private Socket _socket;
    public TMP_InputField InputField;
    public TMP_Text Text;

    public void Connection()
    {
        // 地址族 , 套接字类型, 协议类型
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _socket.Connect("127.0.0.1",8888);
    }

    public void Send()
    {
        // Send
        string sendStr = InputField.text;
        byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
        _socket.Send(sendBytes);
        // Recv
        byte[] readBuff = new byte[1024];
        int count = _socket.Receive(readBuff);
        string recvStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
        Text.text = recvStr;
        // Close
        _socket.Close();
    }
}

  连接时:客户端只需要建立一个Socket,并且连接好目的地址的IP地址和端口号。

  发送时:socket中只能发送 byte[] 类型的字节流,所以要进行转换;之后会调用一个Receive方法,这个方法是一个阻塞的方法如果接收不到信息就会阻塞持续等待。

  值得注意:Socket对象中的套接字类型,Stream是游戏开发中最常用的,使用TCP实现,当然会还有很多,可自行查看文档。

  服务端:

    因为是简易的服务器,所以我们先使用本地的控制台当做一个服务器,从自己编译器中新建一个控制台程序,然后输入以下:

using System;
using System.Net;
using System.Net.Sockets;

namespace GameService
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World");
            // Bind
            Socket listenfd = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ipAdr = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);
            listenfd.Bind(ipEp);
            // Listen
            listenfd.Listen(0);
            Console.WriteLine("服务器-启动成功");
            while (true)
            {
                //Accept
                Socket connfd = listenfd.Accept();
                Console.WriteLine("服务器-Accept");
                // Receive
                byte[] readBuff = new byte[1024];
                int count = connfd.Receive(readBuff);
                string readStr = System.Text.Encoding.Default.GetString(readBuff, 0, count);
                Console.WriteLine("服务器接收: "+readStr);
                // Send
                byte[] sendByte = System.Text.Encoding.Default.GetBytes(readStr);
                connfd.Send(sendByte);
            }
        }
    }
}

  服务端首先也会创建一个 socket,并与Ip地址端口号进行绑定,之后开始监听客户端连接;开启监听后,会使用Accept方法进行接收,这个方法也是一个阻塞方法。如果能接收到就发送确认信息给客户端。

  这样一个Echo程序就完成了,测试一下:

   这样我们就实现了一个服务器与客户端的通讯,但是目前的系统服务器每次只能处理一个客户端的需求。如果要实现一对多则需要学习更多其他网络编程的知识。