Unity网络开发记录(一):实现最简单的unity客户端和服务器通信

12 篇文章 0 订阅

服务端

案例通过Socket网络套接字实现Tcp网络通讯

打开VS,新建一个项目

C#服务端整体流程依旧遵从socket开发的基本步骤,和其它语言下的socket开发一样,例如c++

  1. 新建socket对象
  2. 向socket对象绑定协议簇、传输格式、协议类型
  3. 新建一个能存储ip地址以及端口号的对象
  4. socket对象绑定ip地址以及端口号
  5. socket对象开启监听
  6. socket对象持续进行监听连接请求,如有新连接,返回客户端与服务端之间通信的socket对象(此过程阻塞,直到有新连接)
  7. 建立连接,此时可以进行信息的收发
  8. 切断通讯关闭socket

补充一下前置知识,在Tcp传输下,会经历三报文握手建立连接,四报文挥手释放连接。三报文握手防止以失效的连接请求重新传到服务端,四报文挥手之后要等待2MSL,确保此过程中的报文全部失效,并防止释放请求确认报文丢失,及时重传。Tcp传输具有无差错,不丢失,不重复,不乱序的特点,适合长连接的游戏

传输信息使用UTF-8编码

服务端代码:

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

namespace C_NetWorke
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            try
            {
                IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
                tcpSocket.Bind(ip);
            }
            catch (Exception)
            {
                return;                
            }

            tcpSocket.Listen(1024);

            Socket clientSocket = tcpSocket.Accept();

            clientSocket.Send(Encoding.UTF8.GetBytes("你好,我是服务端"));

            byte[] buffer = new byte[1024];
            int num = clientSocket.Receive(buffer);

            if (clientSocket.RemoteEndPoint != null)
            {
                Console.WriteLine($"收到来次{clientSocket.RemoteEndPoint.ToString()},发来的消息:{Encoding.UTF8.GetString(buffer, 0, num)}");
            }

            clientSocket.Shutdown(SocketShutdown.Both);
            clientSocket.Close();
            
            Console.ReadLine();
        }
    }
}

客户端

  1. 新建socket对象
  2. 向socket对象绑定,和服务端一样
  3. 启动连接,申请向服务器建立连接
  4. 连接成功,可以收发数据
  5. 切断通讯,关闭socket

在unity中新建一个脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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

public class Class5 : MonoBehaviour
{
	private void Start()
	{
		Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
		IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
		try
		{
			socket.Connect(ipPoint);
		}
		catch (SocketException e)
		{
			if (e.ErrorCode == 10061)
				print("服务器拒绝链接");
			else
				print("链接出错" + e.ErrorCode);
			return;
		}
		socket.Send(Encoding.UTF8.GetBytes("你好,我是客户端"));
		byte[] buffer = new byte[1024];
		int num = socket.Receive(buffer);
		if (socket.RemoteEndPoint != null)
		{
			print($"收到来次{socket.RemoteEndPoint.ToString()},发来的消息:{Encoding.UTF8.GetString(buffer, 0, num)}");
		}
		socket.Shutdown(SocketShutdown.Both);
		socket.Close();
    }



}

启动服务器后,再运行unity,发现连接成功,此时完成了网络通讯的初步搭建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值