unity项目使用socket向服务端发送消息(序列化和反序列化)的问题(找不到程序集,找不到添加引用)

创建一个unity项目,然后创建一个c#的服务端项目,使用socket向服务端发送消息,如何序列化和反序列化?

1 这是前端代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using SocketRequest;
public class GameRoot : MonoBehaviour
{
    Socket client;
    byte[] buffers = new byte[1024];
    void Start()
    {
        client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        client.Connect("127.0.0.1", 6666);
        StartRecv();
        Send();
    }

    void Send()
    {
        Request request = new Request() { Str="你好服务器"};
        BinaryFormatter bf = new BinaryFormatter(); //创建序列化对象
        MemoryStream ms = new MemoryStream(); //创建内存流对象
        bf.Serialize(ms, request); //将p序列化到内存流中
        client.Send(ms.GetBuffer());
        Debug.Log("客户端向服务端发送消息");
        //client.Send(Encoding.UTF8.GetBytes("你好服务器"));
    }

    void StartRecv()
    {
        client.BeginReceive(buffers, 0, buffers.Length, SocketFlags.None, RecvCallBack, null);
    }

    void RecvCallBack(IAsyncResult iar)
    {
        int len = client.EndReceive(iar);
        if (len == 0) return;
        string s = Encoding.UTF8.GetString(buffers, 0, len);
        Debug.Log(s);
    }

}

然后挂载到一个空物体上就可以了

2 下面是服务端代码

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Reflection;  //根据反射获取要访问的信息
using SocketRequest;
    class Prograam
    {
        static Socket socket;
        static byte[] buffers = new byte[1024];
        static void Main(string[] args)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            socket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6666));
            //socket.Bind(new IPEndPoint(IPAddress.Any, 6666));
            socket.Listen(0);
            StartAccept();
            Console.ReadKey();
        }

        static void StartAccept()
        {
            socket.BeginAccept(AcceptCallBack, null);
        }

        static void AcceptCallBack(IAsyncResult iar)
        {
            Socket client = socket.EndAccept(iar);
            StartRecv(client);
            client.Send(Encoding.UTF8.GetBytes("连接到服务器"));
            StartAccept();
        }

        static void StartRecv(Socket client)
        {
            client.BeginReceive(buffers, 0, buffers.Length, SocketFlags.None, RecvCallBack, client);
        }

        static void RecvCallBack(IAsyncResult iar)
        {
            Socket client = iar.AsyncState as Socket;
            int len = client.EndReceive(iar);
            if (len == 0) return;
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream memory = new MemoryStream();

            memory.Write(buffers, 0, len);
            memory.Flush();
            memory.Position = 0;
            Request request = bf.Deserialize(memory) as Request;//反序列化
            //string s = Encoding.UTF8.GetString(buffers, 0, len);
            Console.WriteLine("服务端收到了消息: "+request.Str);
            
            Console.ReadKey();
        }

    }

然后就是这个Request类是报错的,因为前后端都没有定义

因为我们使用的是序列化和反序列化,假如你自己分别在服务端和前端都写了一个相同的类(Request)前端吧requset序列化发送到服务端 ,然后服务端在反序列化得到request类,是不行的,具体的报错大致意思就是 。。找不到程序集,这是因为如果消息类(request)分别写的话,他们会在不同的程序集,然后导致你的不成功。。。。。

3 类库

我们要想实现的话,必须导入一个自己写的类库,这个类库就是我们前后端所共有的类库(也叫消息库),如何新建一个类库请点击这里如何创建类库
类库的代码如下

using System;
namespace SocketRequest
{
	[Serializable]
    public class Request
    {
        public string Str;
    }
}

注意我用的命名空间是SocketRequest
一定要加上[Serializable]这句话,

4 添加类库到(.dll)到前后端项目

当我们创建完类库之后,吧这个类库导入到服务端是没有问题的(那个教程里可以看一下,不难的),但是导入到unity项目你会发现没有添加引用这个选项 那么如何把类库添加到unity项目中去呢?

在Assets文件夹下新建一个Plugins文件夹,有的话就不用了
然后找到你的消息类的bin目录下的 .dll文件,复制到Plugins文件夹下,
然后倒入命名空间SocketRequest(你的消息类用的什么命名空间你就倒入什么),然后你定义的消息类就可以用了。

吧上面的代码copy一下,运行,可以得到这样的结果
在这里插入图片描述
此时,利用socket的序列化与反序列化发发送消息类就已经实现了

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页