golang做服务器,C#(unity)作为客户端,Socket通信问题

服务器 datalen+Message----->PackageData------>网络传输([]byte)----->客户端---->UnPackageData---->datalen+Message

用Soket写网络程序,需要自己定制协议。

{len+data}    len 解析出来的是data数据的长度,data 解析出来的是想要传输的数据

服务器上的Message

客户端的Message

需要注意的是客户端Message的字段命名需要和服务端的json标签保持一直。否则服务端解析json会丢失字段(这个bug我找了一个晚上加一个早上)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
[Serializable]
public class Message
{
    public string execute_type;
    public string struct_name;
    public string data;
}
class util
{
    /// <summary>
    /// 包装数据
    /// </summary>
    /// <param name="data"></param>
    /// <param name="exeCuteType"></param>
    /// <param name="className"></param>
    public static byte[] PackageData(object data,string exeCuteType,string className)
    {
        string jsonData = JsonConvert.SerializeObject(data);

        //byte[] byteData = Encoding.UTF8.GetBytes(jsonStr);
        Message message = new Message();
        message.struct_name = className;
        message.data = jsonData;
        message.execute_type = exeCuteType;

        byte[] byteData =Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));
        Int32 len = byteData.Length;
        byte[] lenData = BitConverter.GetBytes(len);
        byte[] finalData = new byte[lenData.Length + byteData.Length];
        lenData.CopyTo(finalData, 0);
        byteData.CopyTo(finalData, 4);
        return finalData;

    }
    /// <summary>
    /// 拆分数据
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    public static Message UnPackageData(byte[] data)
    {
        Int32 len = BitConverter.ToInt32(data, 0);
        System.Console.WriteLine(len);
        byte[] strByte = new byte[len];
        Array.Copy(data,4,strByte,0,len);
        Message message = JsonConvert.DeserializeObject<Message>(Encoding.UTF8.GetString(strByte));
        return message;

    }
}
//没有go??
//包装数据
func  PackageData(data interface{},executeType string,structType string)[]byte{
    dataByte,err:=json.Marshal(&data)
    if err!=nil{
        config.Logger.Fatalln("解析出错",err)
    }
    strJson:=string(dataByte)
    msg:=Message{}
    msg.ExecuteType=executeType
    msg.Data=strJson
    msg.StructName=structType
    finalData,err:=json.Marshal(&msg)
    if err!=nil{
        log.Fatalln("解析失败",err)
    }
    var lenByte =make([]byte,4)
    length:=uint32(len(finalData))
    binary.LittleEndian.PutUint32(lenByte,length)

    allData:=[][]byte{lenByte,finalData}
    newData:=bytes.Join(allData,[]byte(""))

    return newData

}
//解析数据
func UnPackageData(data []byte)(Message, error){
    //println("总长度=:",len(data))
    mes:=Message{}
    //utf8.
    byteBuffer:=bytes.NewBuffer(data[0:4])
    var dataLen int32
    err:=binary.Read(byteBuffer,binary.LittleEndian,&dataLen)//binary.BigEndian.Uint32(data[:4])
    if err!=nil{
        config.Logger.Println(err)
    }
    err=json.Unmarshal(data[4:4+dataLen],&mes)
    if err!=nil{
        fmt.Println("解析失败",err)
    }

    return mes,err
}

原文地址:https://www.cnblogs.com/Jokerlearn/p/10929818.html

时间: 2024-10-10 06:04:02

golang做服务器,C#(unity)作为客户端,Socket通信问题的相关文章

java多线程实现多客户端socket通信

一.服务端 package com.czhappy.hello.socket; import java.io.IOException; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { //创建ServerSocket示例,指定端口,侦听 try { Ser

[socket编程] 一个服务器与多个客户端之间通信

转自:http://blog.csdn.net/neicole/article/details/7539444 并加以改进 Server程序: 1 // OneServerMain.cpp 2 3 #include <iostream> 4 #include <cstdio> 5 #include <string> 6 #include <cstring> 7 #include <vector> 8 #include <iterator&g

服务器与多个客户端通信

使用多路复用实现一个服务器与多个客户端的通信:代码范例: 服务器: #include<stdio.h> #include<netinet/in.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include<pthread.h> #include<strings.h> void se

PHP Socket通信编程

Socket用于进程间通信.进程间通信通常基于客户端-服务端模型.此时,客户端-服务端是可以彼此交互的应用程序.客户端和服务端之间的交互需要连接.Socket编程负责的就是为应用程序之间建立可进行交互的连接. 用PHP创建一个简单的客户端-服务端,开发一个客户端用于发送string消息到服务端,服务端将相同的信息反转后返回给客户端. 服务器端 列表内容设置主机和端口 端口号可以是1024 -65535之间的任何正整数. $host = "127.0.0.1"; $port=5353;

android 初识socket通信--java程序做服务器

1.新建一个java工程做服务器 public class MyServer { String str ; public MyServer(){ try { //服务器端的声明用serversocket,括号里面写端口号,端口号是自己指定的 ServerSocket ss = new ServerSocket(4700); //accept方法在这里会一直等待客户端连接进来 Socket accept = ss.accept(); //新建一个读入流,字符集是utf-8 BufferedRead

Android客户端与本地服务器Socket通信

Android客户端与本地服务器Socket通信 Socket服务器运行结果图?? 一.客户端和服务器端的选择: 客户端是我们手机端,关于服务器端,只要安装了JDK,自然就拥有通讯的功能,我们只需要在Eclipse或者MyEclipse中写好文章中服务器端的代码,运行起来即可,用accept()方法启动服务器端,等待客户端的连接,在未连接的情况下,服务器端处于堵塞的状态. 二.客户端注意事项 andriod客户端添加网络访问权限 <uses-permission android:name="

C++Socket通信(客户端和服务器)

win32控制台版 获取本机IP: cmd:       ipconfig/all 我写的是一个服务器和客户端点对点的信息传递(实现相互的可以适当更改代码): 服务器发送给客户端的是一个结构体数据 typedef struct Date { float m1; float m2; float m3; float m_roll; float m_pitch; float m_rotate; }Datablock; 上服务器代码(阻塞式的): #include "stdafx.h" #in

Socket 通信原理(Android客户端和服务器以TCP&amp;&amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是s

Linux C利用Socket套接字进行服务器与多个客户端进行通讯

服务器端 #include <stdlib.h> #include <sys/types.h> #include <stdio.h> #include <sys/socket.h> #include <string.h> #include <signal.h> #include <arpa/inet.h> #include <unistd.h> #include <pthread.h> //服务器端