输入流是不是一个有效的二进制格式。序列化问题 [英] The input stream is not a valid binary format. Serialization issue

查看:602
本文介绍了输入流是不是一个有效的二进制格式。序列化问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我有一些问题这块code的:

 公共无效SendRegistrationPacket()
    {
        分组P =新的数据包(PacketType.Registration,服务器);
        p.Gdata.Add(ID);
        clientSocket.Send(p.ToBytes());
    }

发送 p.ToBytes()来的:

 众包(字节[] packetbytes)
    {
        BinaryFormatter的BF =新的BinaryFormatter();
        MemoryStream的毫秒=新的MemoryStream(packetbytes);
        分组P =(数据包)bf.Deserialize(毫秒);
        ms.Close();
        this.Gdata = p.Gdata;
        this.packetInt = p.packetInt;
        this.packetBool = p.packetBool;
        this.senderID = p.senderID;
        this.packetType = p.packetType;
    }

我在分组P =(数据包)bf.Deserialize(MS)收到以下错误;


  

类型的'System.Runtime.Serialization.SerializationException'未处理的异常出现在mscorlib.dll
  其他信息:输入流是不是一个有效的二进制格式。起始含量(以字节计)为:35-2D-33-39-61-30-63-65-33-65-37-38-33-65-05-FB-FF ...


我不知道我做错了...

任何人可以帮我吗?

您的时间非常感谢!

---- ----编辑

Server.cs

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Threading.Tasks;
使用ServerData;
使用的System.Net.Sockets;
使用System.IO;
使用的System.Threading;
使用System.Net;
使用Newtonsoft.Json;
使用服务器;命名空间服务器
{
    类服务器
    {        静态插座listenerSocket;
        静态列表< ClientData>客户;        静态无效的主要(字串[] args)
        {            Console.WriteLine(启动服务器开:+ Packet.GetIP4Address());
            listenerSocket =新的Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            客户=新的List< ClientData>();            IPEndPoint的ip =新IPEndPoint(IPAddress.Parse(Packet.GetIP4Address()),4242);            listenerSocket.Bind(IP);            螺纹listenThread =新主题(ListenThread);
            listenThread.Start();        } //启动服务器
        //听者 - 监听客户端试图连接
        静态无效ListenThread()
        {
            而(真)
            {
                listenerSocket.Listen(0);                clients.Add(新ClientData(listenerSocket.Accept()));            }
        }        // ClientData话题 - 从每个客户端接收数据分别
        公共静态无效DATA_IN(对象CSocket类)
        {
            插座ClientSocket的=(插座)CSocket类;
            字节[]缓冲区;
            INT的ReadBytes;
            而(真)
            {
                尝试
                {                    缓冲区=新的字节[clientSocket.SendBufferSize]
                    的ReadBytes = clientSocket.Receive(缓冲液);                    如果(的ReadBytes大于0)
                    {
                        //处理数据
                        分组包=新包(缓冲);
                        DataManger(包);
                    }
                }
                赶上(SocketException前)
                {
                    //Console.WriteLine(\"A客户其断开)!;
                }
            }
        }        //数据管理器
        公共静态无效DataManger(分组P)
        {
            开关(p.packetType)
            {
                案例PacketType.Chat:
                    的foreach(在客户ClientData C)
                    {
                        c.clientSocket.Send(p.ToBytes());
                    }
                    打破;
                案例PacketType.Connect:
                    //Console.WriteLine(\"User:\\+ p.Gdata [0] +\\已从IP连接:+ p.Gdata [1]);                    字符串的响应= System.IO.File.ReadAllText(@D:\\ json.txt); //{\\一\\:\\0 \\,\\二\\:\\45 \\, \\三\\:\\5 \\,\\四\\:\\86 \\,\\十一五\\:\\75 \\,\\六\\:\\32 \\,\\计数\\:\\6883197667 \\};                    响应= response.Substring(1,response.Length - 2);                    Rootobject根= JsonConvert.DeserializeObject< Rootobject>(响应);                    的foreach(在客户ClientData C)
                    {
                        如果(c.id == p.Gdata [1])
                        {
                            分组包=新的数据包(PacketType.Message,服务器);
                            packet.Gdata.Add(root.one);
                            packet.Gdata.Add(root.two);
                            packet.Gdata.Add(root.three);
                            packet.Gdata.Add(root.four);
                            packet.Gdata.Add(root.five);
                            packet.Gdata.Add(root.six);
                            packet.Gdata.Add(root.Count);
                            packet.Gdata.Add(root.Found);
                            c.clientSocket.Send(packet.ToBytes());
                            打破;
                        }
                    }                    打破;
                案例PacketType.Message:                    清单< Rootobject>数据=新的List< Rootobject>();                    data.Add(
                        新Rootobject
                        {
                            1 = p.Gdata [0],
                            2 = p.Gdata [1],
                            3 = p.Gdata [2],
                            4 = p.Gdata [3],
                            5 = p.Gdata [4],
                            6 = p.Gdata [5],
                            计数= p.Gdata [6],
                            实测值= p.Gdata [7]
                        }
                        );                    串JSON = JsonConvert.SerializeObject(data.ToArray());                    System.IO.File.WriteAllText(@D:\\ json.txt,JSON);                    字符串responseB = System.IO.File.ReadAllText(@D:\\ json.txt);                    responseB = responseB.Substring(1,responseB.Length -2);                    Rootobject rootB = JsonConvert.DeserializeObject< Rootobject>(responseB);                    的foreach(在客户ClientData C)
                    {
                        如果(c.id == p.Gdata [8])
                        {
                            分组包=新的数据包(PacketType.Message,服务器);
                            packet.Gdata.Add(rootB.one);
                            packet.Gdata.Add(rootB.two);
                            packet.Gdata.Add(rootB.three);
                            packet.Gdata.Add(rootB.four);
                            packet.Gdata.Add(rootB.five);
                            packet.Gdata.Add(rootB.six);
                            packet.Gdata.Add(rootB.Count);
                            packet.Gdata.Add(rootB.Found);
                            c.clientSocket.Send(packet.ToBytes());
                            打破;
                        }
                    }                    打破;
                案例PacketType.Disconnect:
                    Console.WriteLine(用户:\\+ p.Gdata [0] +\\已从IP断开连接:+ p.Gdata [1]);
                    打破;
            }
        }    }
}

ClientData.cs

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Threading.Tasks;
使用的System.Net.Sockets;
使用System.IO;
使用的System.Threading;
使用ServerData;
使用System.Runtime.Serialization.Formatters.Binary;命名空间服务器
{
    类ClientData
    {        公共插座ClientSocket的;
        公共主题clientThread;
        公共字符串ID;        公共ClientData()
        {
            ID = Guid.NewGuid()的ToString()。
            clientThread =新主题(Server.Data_IN);
            clientThread.Start(ClientSocket的);
            SendRegistrationPacket();
        }
        公共ClientData(插座ClientSocket的)
        {
            this.clientSocket = ClientSocket的;
            ID = Guid.NewGuid()的ToString()。
            clientThread =新主题(Server.Data_IN);
            clientThread.Start(ClientSocket的);
            SendRegistrationPacket();
        }        公共无效SendRegistrationPacket()
        {
            //分组P =新的数据包(PacketType.Registration,服务器);
            //p.Gdata.Add(id);
            //// clientSocket.Send(p.ToBytes());
            // BinaryFormatter的BF =新的BinaryFormatter();
            //的MemoryStream毫秒​​=新的MemoryStream();            分组P =新的数据包(PacketType.Registration,服务器);
            p.Gdata.Add(ID);            BinaryFormatter的BF =新的BinaryFormatter();
            MemoryStream的毫秒=新的MemoryStream();
            bf.Serialize(MS,P);
            clientSocket.Send(ms.ToArray());
        }
    }
}

Packet.cs

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Threading.Tasks;
使用ServerData;
使用System.IO;
使用System.Runtime.Serialization.Formatters.Binary;
使用System.Net;命名空间ServerData
{
    [Serializable接口]
    公共类包
    {
        公开名单<串GT; gdata的;
        公众诠释packetInt;
        公共BOOL packetBool;
        公共字符串senderID;
        公共PacketType packetType;        众包(PacketType型,串senderID)
        {
            GDATA =新的List<串GT;();
            this.senderID = senderID;
            this.packetType =类型;
        }        众包(字节[] packetbytes)
        {
            BinaryFormatter的BF =新的BinaryFormatter();
            MemoryStream的毫秒=新的MemoryStream(packetbytes);
            分组P =(数据包)bf.Deserialize(毫秒);
            ms.Close();
            this.Gdata = p.Gdata;
            this.packetInt = p.packetInt;
            this.packetBool = p.packetBool;
            this.senderID = p.senderID;
            this.packetType = p.packetType;
        }        公众的byte [] ToBytes()
        {
            BinaryFormatter的BF =新的BinaryFormatter();
            MemoryStream的毫秒=新的MemoryStream();            bf.Serialize(MS,这一点);            字节[]字节= ms.ToArray();
            ms.Close();            返回字节;
        }        公共静态字符串GetIP4Address()
        {
            ip地址[] = IPS Dns.GetHostAddresses(Dns.GetHostName());            的foreach(在IPS ip地址IP)
            {
                如果(ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    返回ip.ToString();
                }
            }            返回127.0.0.1;
        }    }    公共枚举PacketType
    {
        注册,
        聊天,
        连接,
        断开,
        信息
    }
}

Client.cs

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Threading.Tasks;
使用ServerData;
使用System.Net;
使用的System.Net.Sockets;
使用System.IO;
使用的System.Threading;
使用System.Security.Cryptography;命名空间客户端
{
    类客户端
    {
        公共静态套接字主;
        公共静态字符串ID;        #地区的MD5破解瓦尔
        公共静态布尔发现= FALSE;
        公共静态字符串charsS = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQESTUVWXYZ0123456789~!@#$%^&*_-+=`|\\\\(){}[]:;\\\"'<>,.?/ëÿüïöäêÛîôâéýúíóáé\";
        公共静态INT长度= 6;
        公共静态INT threadCountInt = 1;
        公共静态INT []计数;
        公共静态柜长= 0;
        公共静态长的柜台= 0;
        公共静态字符串测试=;
        公共静态的char []字符;
        公共静态的DateTime启动;
        公共静态INT THREADCOUNT = 0;
        公共静态列表&LT;串GT;线程=新的List&LT;串GT;();
        公共静态字符串结果;
        公共静态字符串[]电流A;
        公共静态对象thisLock =新的对象();
       //公共静态INIFILE INI;
        公共静态长的运行时间;
        公共静态字符串电流;
        #endregion        静态无效的主要(字串[] args)
        {
            Console.Write(线程数来运行:);
            threadCountInt = int.Parse(到Console.ReadLine());
            字符= charsS.ToArray();
            开始= DateTime.Now;
            电流A =新的字符串[threadCountInt]            数=新INT [长度]            而(真)
            {
                Console.Clear();
                Console.Write(输入主机IP地址​​:);
                串IP =到Console.ReadLine();                主=新的Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);                IPEndPoint IPE =新IPEndPoint(IPAddress.Parse(IP),4242);                尝试
                {
                    master.Connect(IPE);
                    分组P =新的数据包(PacketType.Connect,身份证);
                    p.Gdata.Add(Packet.GetIP4Address());
                    p.Gdata.Add(ID);
                    master.Send(p.ToBytes());
                    打破;
                }
                抓住
                {
                    Console.WriteLine(无法连接到主机!);
                    Thread.sleep代码(1000);
                }
            }
            线程t =新主题(DATA_IN);
            t.Start();            //分组包=新的数据包(PacketType.Connect,身份证);
            //packet.Gdata.Add(Packet.GetIP4Address());
            //packet.Gdata.Add(id);
            //master.Send(packet.ToBytes());            //而(真)
            // {
            // Console.Write(::&gt;中);
            //字符串输入=到Console.ReadLine();
            //如果(input.ToLower()==退出|| input.ToLower()==关闭)
            // {
            //分组P =新的数据包(PacketType.Disconnect,身份证);
            // p.Gdata.Add(名);
            // p.Gdata.Add(Packet.GetIP4Address());
            // master.Send(p.ToBytes());
            // Environment.Exit(0);
            //}
            //其他
            // {
            //分组P =新的数据包(PacketType.Chat,身份证);
            // p.Gdata.Add(名);
            // p.Gdata.Add(输入);
            // master.Send(p.ToBytes());
            //}
            //}            螺纹T2 =新主题(statusUpdate);
            t2.Start();            对于(INT TT = 0; TT&LT; threadCountInt; TT ++)
            {
                新的Thread(()=&GT;工作(TT - 1))启动()。
            }            到Console.ReadLine();
            Environment.Exit(0);
            到Console.ReadLine();
        }        静态无效DATA_IN()
        {
            字节[]缓冲区;
            INT的ReadBytes;            而(真)
            {
                尝试
                {
                    缓冲区=新的字节[master.SendBufferSize]
                    的ReadBytes = master.Receive(缓冲液);                    如果(的ReadBytes大于0)
                    {
                        DataManager的(新分组(缓冲液));
                    }
                }
                赶上(SocketException前)
                {
                    ConsoleColor C = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(丢失到服务器的连接!);
                    Console.ForegroundColor = C;
                    Console.Write(::&gt;中);
                    到Console.ReadLine();
                    Environment.Exit(0);
                }
            }
        }        静态无效的DataManager(分组P)
        {
            开关(p.packetType)
            {
                案例PacketType.Registration:
                    ID = p.Gdata [0];
                    打破;
                案例PacketType.Chat:
                    ConsoleColor C = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.WriteLine(p.Gdata [0] +:+ p.Gdata [1]);
                    Console.ForegroundColor = C;
                    Console.Write(::&gt;中);
                    打破;
                案例PacketType.Message:
                    算上[0] = int.Parse(p.Gdata [0]);
                    计[1] = int.Parse(p.Gdata [1]);
                    算上[2] = int.Parse(p.Gdata [2]);
                    算[3] = int.Parse(p.Gdata [3]);
                    算上[4] = int.Parse(p.Gdata [4]);
                    算[5] = int.Parse(p.Gdata [5]);
                    计数器= long.Parse(p.Gdata [6]);
                    打破;
            }
        }        公共静态无效statusUpdate()
        {
            Thread.sleep代码(1000);
            长TMP = 0;
            而(!找到)
            {
                Console.Clear();
                Console.WriteLine();
                Console.WriteLine(+ threadCount.ToString()+线程中运行);
                Console.Write();
                的foreach(线程中的字符串s)
                {
                    如果(S =线程![threads.Count - 1])
                    {
                        Console.Write(S +,);
                    }
                    其他
                    {
                        Console.Write(多个);
                    }                }
                Console.WriteLine();                Console.WriteLine(+(专柜+计数器)的ToString()+/+(长)Math.Pow(charsS.Length,6)+(+((浮点)((浮点)(柜+计数器)/(浮点)Math.Pow(charsS.Length,6))* 100)的ToString()+%));
                Console.WriteLine(+((长)Math.Pow(charsS.Length,6) - 计数器)的ToString()+左);                如果(计数器大于0&放大器;&放大器; TimeSpanInSecs(开始)大于0)
                {
                    TMP =(计数器/ TimeSpanInSecs(开始));
                }
                其他
                {
                    TMP = 0;
                }                Console.WriteLine(+ tmp.ToString()+H / S);
                如果(TMP大于0)
                {
                    长ETA =((长)Math.Pow(charsS.Length,6) - (柜+计数器))/ tmp目录;
                    Console.WriteLine(+的String.Format({} 0:00:{} 1:00:{} 2:00,ETA / 3600,(ETA / 60)%60,ETA 60%)+ETA );
                }
                其他
                {
                    Console.WriteLine(南埃塔);
                }                长totalRun = +运行TimeSpanInSecs(开始);
                Console.WriteLine(当前会话:+的String.Format({} 0:00:{} 1:00:{} 2:00,TimeSpanInSecs(开始)/ 3600(TimeSpanInSecs(开始)/ 60)% 60,TimeSpanInSecs(开始)%60));
                Console.WriteLine(总的运行时间:+的String.Format({} 0:00:{} 1:00:{} 2:00,totalRun / 3600,(totalRun / 60)%60,totalRun 60% ));                Console.WriteLine(当前:+电流);                如果(找到)
                {
                    Console.WriteLine(结果:+导致);
                }                Thread.sleep代码(1000);
            }
        }        公共静态字符串MD5hasher(字符串值)
        {
            公顷的HashAlgorithm = MD5.Create();
            字节] cryptedData = ha.ComputeHash(Encoding.UTF8.GetBytes(值));            StringBuilder的sBuilder =新的StringBuilder();            的for(int i = 0; I&LT; cryptedData.Length;我++)
            {
                sBuilder.Append(cryptedData [I]的ToString(×2));
            }
            ha.Clear();
            返回sBuilder.ToString();
        }        公共静态长TimeSpanInSecs(DateTime的开始)
        {
            时间跨度TMP = DateTime.Now - 启动;
            长秒= tmp.Seconds;
            秒+ = tmp.Minutes * 60;
            秒+ =(tmp.Hours * 60)* 60;
            秒+ =((tmp.Days * 24)* 60)* 60;            返回秒;        }        公共静态无效的工作(INT TID)
        {
            INT localCount = 0;
            THREADCOUNT ++;
            threads.Add(Thread.CurrentThread.ManagedThreadId.ToString());
            而(!找到)
            {
                测试=的String.Empty;
                StringBuilder的SB =新的StringBuilder();
                对于(INT X = 0; X&LT;长度; X ++)
                {
                    而(真)
                    {
                        尝试
                        {
                            sb.Append(字符[计[X]);
                            打破;
                        }
                        赶上{}
                    }                }                测试= sb.ToString();
                电流=试验;                算上[count.Length - 1] =计[count.Length - 1] + 1;                为(中间体Y = count.Length y与其所连接; = 0; y--)
                {
                    如果(Y!= 0)
                    {
                        如果(计数[Y - 1]&GT; = chars.Length - 1)
                        {
                            如果(γ→1)
                            {
                                算上[Y - 2] ++;
                            }
                            算上[Y - 1] = 0;
                        }
                    }
                    其他
                    {
                        如果(计数[Y] == chars.Length - 1)
                        {
                            算上[Y] = 0;
                        }
                    }                }                如果(MD5hasher(测试)==de99823d330004610cba3592ce7382b8)
                {
                    结果=测试;
                    发现= TRUE;
                }
                localCount ++;                //锁(thisLock)
                // {
                //计数器+ = localCount;
                // localCount = 0;
                //};                分组P =新的数据包(PacketType.Message,身份证);
                的foreach(INT我在计数)
                {
                    p.Gdata.Add(i.ToString());
                }
                p.Gdata.Add(localCount.ToString());
                localCount = 0;
                p.Gdata.Add(found.ToString());
                p.Gdata.Add(ID);                master.Send(p.ToBytes());                如果(找到)
                {
                    Thread.CurrentThread.Abort();
                }
            }
        }
    }
}

JSON.cs

 使用系统;
使用System.Collections.Generic;
使用System.Linq的;
使用System.Text;
使用System.Threading.Tasks;命名空间服务器
{
    公共类Rootobject
    {
        公共串的一个{搞定;组; }
        公共线二{搞定;组; }
        公共字符串3 {搞定;组; }
        公共串的四个{搞定;组; }
        公共弦五{搞定;组; }
        公共字符串时,6 {搞定;组; }
        公共字符串计数{搞定;组; }
        公共字符串找到{搞定;组; }
    }
}


解决方案

问题是从

 的ReadBytes = clientSocket.Receive(缓冲);如果(的ReadBytes大于0)
{
    //处理数据
    分组包=新包(缓冲);
    DataManger(包);
}

从客户端发送一个不等于一个服务器上接收。你需要消息Frameing ,你的分组只包含发送的数据的第一部分。

最简单的方法是首先发送一个字节数组的长度则具有接收方只接收长度,分配的大小,然后循环的缓冲区中,直到它完全填满缓冲区。

下面是接收方的一个简单的例子

 私有静态的byte []的readFully(ClientSocket的插座,诠释长度)
{
    INT偏移= 0;
    字节[]缓冲区=新的字节[长度]
    而(偏移&LT;长度)
    {
        INT读= clientSocket.Receive(缓冲区,偏移,长度 - 偏移,SocketFlags.None);
        如果(读= 0)
           返回null; //套接字关闭
        胶印+ =读;
    }
    返回缓冲区;
}
//读取长度
字节[] = lengthBuffer的readFully(ClientSocket的,4);
如果(lengthBuffer == NULL)
{
    //做一下关闭的连接东西
}
INT长度= BitConverter.ToInt32(lengthBuffer,0);//读取由长度指定的字节数。
字节[] = packetBuffer的readFully(ClientSocket的,长度);如果(packetBuffer!= NULL)
{
    //处理数据
    分组包=新包(packetBuffer);
    DataManger(包);
}

我让你做的发送端。

Hello I'm having some problems with this piece of code:

This:

public void SendRegistrationPacket()
    {
        Packet p = new Packet(PacketType.Registration, "server");
        p.Gdata.Add(id);
        clientSocket.Send(p.ToBytes());
    }

sends p.ToBytes() to this:

public Packet(byte[] packetbytes)
    {
        BinaryFormatter bf = new BinaryFormatter();
        MemoryStream ms = new MemoryStream(packetbytes);
        Packet p = (Packet)bf.Deserialize(ms);
        ms.Close();
        this.Gdata = p.Gdata;
        this.packetInt = p.packetInt;
        this.packetBool = p.packetBool;
        this.senderID = p.senderID;
        this.packetType = p.packetType;
    }

I'm getting following error at Packet p = (Packet)bf.Deserialize(ms); :

An unhandled exception of type 'System.Runtime.Serialization.SerializationException' occurred in mscorlib.dll Additional information: The input stream is not a valid binary format. The starting contents (in bytes) are: 35-2D-33-39-61-30-63-65-33-65-37-38-33-65-05-FB-FF ...

I have no idea what I'm doing wrong...

Could anybody help me out?

Many thanks for your time!

---- EDIT ----

Server.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerData;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Net;
using Newtonsoft.Json;
using Server;

namespace Server
{
    class Server
    {

        static Socket listenerSocket;
        static List<ClientData> clients;

        static void Main(string[] args)
        {

            Console.WriteLine("Starting Server On: " + Packet.GetIP4Address());
            listenerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clients = new List<ClientData>();

            IPEndPoint ip = new IPEndPoint(IPAddress.Parse(Packet.GetIP4Address()), 4242);

            listenerSocket.Bind(ip);

            Thread listenThread = new Thread(ListenThread);
            listenThread.Start();

        } //Start server


        //Listner - listens for clients trying to connect
        static void ListenThread()
        {
            while (true)
            {
                listenerSocket.Listen(0);

                clients.Add(new ClientData(listenerSocket.Accept()));

            }
        }

        //ClientData thread - receives data from each client individually
        public static void Data_IN(object cSocket)
        {
            Socket clientSocket = (Socket)cSocket;
            byte[] buffer;
            int readBytes;
            while (true)
            {
                try
                {

                    buffer = new byte[clientSocket.SendBufferSize];
                    readBytes = clientSocket.Receive(buffer);

                    if (readBytes > 0)
                    {
                        //handle data
                        Packet packet = new Packet(buffer);
                        DataManger(packet);
                    }
                }
                catch (SocketException ex)
                {
                    //Console.WriteLine("A Client Had Disconnected!");
                }
            }
        }

        //Data Manager
        public static void DataManger(Packet p)
        {
            switch (p.packetType)
            {
                case PacketType.Chat:
                    foreach (ClientData c in clients)
                    {
                        c.clientSocket.Send(p.ToBytes());
                    }
                    break;
                case PacketType.Connect:
                    //Console.WriteLine("User: \"" + p.Gdata[0] + "\" Has connected from IP: " + p.Gdata[1]);

                    string response = System.IO.File.ReadAllText(@"D:\json.txt");//"{\"one\": \"0\",\"two\": \"45\",\"three\": \"5\",\"four\": \"86\",\"five\": \"75\",\"six\": \"32\",\"Count\": \"6883197667\"}";

                    response = response.Substring(1, response.Length - 2);

                    Rootobject root = JsonConvert.DeserializeObject<Rootobject>(response);

                    foreach (ClientData c in clients)
                    {
                        if (c.id == p.Gdata[1])
                        {
                            Packet packet = new Packet(PacketType.Message, "Server");
                            packet.Gdata.Add(root.one);
                            packet.Gdata.Add(root.two);
                            packet.Gdata.Add(root.three);
                            packet.Gdata.Add(root.four);
                            packet.Gdata.Add(root.five);
                            packet.Gdata.Add(root.six);
                            packet.Gdata.Add(root.Count);
                            packet.Gdata.Add(root.Found);
                            c.clientSocket.Send(packet.ToBytes());
                            break;
                        }
                    }

                    break;
                case PacketType.Message:

                    List<Rootobject> data = new List<Rootobject>();

                    data.Add(
                        new Rootobject
                        {
                            one = p.Gdata[0],
                            two = p.Gdata[1],
                            three = p.Gdata[2],
                            four = p.Gdata[3],
                            five = p.Gdata[4],
                            six = p.Gdata[5],
                            Count = p.Gdata[6],
                            Found = p.Gdata[7]
                        }
                        );

                    string json = JsonConvert.SerializeObject(data.ToArray());

                    System.IO.File.WriteAllText(@"D:\json.txt", json);

                    string responseB = System.IO.File.ReadAllText(@"D:\json.txt");

                    responseB = responseB.Substring(1, responseB.Length -2);

                    Rootobject rootB = JsonConvert.DeserializeObject<Rootobject>(responseB);

                    foreach (ClientData c in clients)
                    {
                        if (c.id == p.Gdata[8])
                        {
                            Packet packet = new Packet(PacketType.Message, "Server");
                            packet.Gdata.Add(rootB.one);
                            packet.Gdata.Add(rootB.two);
                            packet.Gdata.Add(rootB.three);
                            packet.Gdata.Add(rootB.four);
                            packet.Gdata.Add(rootB.five);
                            packet.Gdata.Add(rootB.six);
                            packet.Gdata.Add(rootB.Count);
                            packet.Gdata.Add(rootB.Found);
                            c.clientSocket.Send(packet.ToBytes());
                            break;
                        }
                    }

                    break;
                case PacketType.Disconnect:
                    Console.WriteLine("User: \"" + p.Gdata[0] + "\" Has disconnected from IP: " + p.Gdata[1]);
                    break;
            }
        }



    }
}

ClientData.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using ServerData;
using System.Runtime.Serialization.Formatters.Binary;

namespace Server
{
    class ClientData
    {

        public Socket clientSocket;
        public Thread clientThread;
        public string id;

        public ClientData()
        {
            id = Guid.NewGuid().ToString();
            clientThread = new Thread(Server.Data_IN);
            clientThread.Start(clientSocket);
            SendRegistrationPacket();
        }
        public ClientData(Socket clientSocket)
        {
            this.clientSocket = clientSocket;
            id = Guid.NewGuid().ToString();
            clientThread = new Thread(Server.Data_IN);
            clientThread.Start(clientSocket);
            SendRegistrationPacket();
        }

        public void SendRegistrationPacket()
        {
            //Packet p = new Packet(PacketType.Registration, "server");
            //p.Gdata.Add(id);
            ////clientSocket.Send(p.ToBytes());
            //BinaryFormatter bf = new BinaryFormatter();
            //MemoryStream ms = new MemoryStream();

            Packet p = new Packet(PacketType.Registration, "server");
            p.Gdata.Add(id);

            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();
            bf.Serialize(ms, p);
            clientSocket.Send(ms.ToArray());
        }
    }
}

Packet.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerData;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Net;

namespace ServerData
{
    [Serializable]
    public class Packet
    {
        public List<string> Gdata;
        public int packetInt;
        public bool packetBool;
        public string senderID;
        public PacketType packetType;

        public Packet(PacketType type, string senderID)
        {
            Gdata = new List<string>();
            this.senderID = senderID;
            this.packetType = type;
        }

        public Packet(byte[] packetbytes)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream(packetbytes);
            Packet p = (Packet)bf.Deserialize(ms);
            ms.Close();
            this.Gdata = p.Gdata;
            this.packetInt = p.packetInt;
            this.packetBool = p.packetBool;
            this.senderID = p.senderID;
            this.packetType = p.packetType;
        }

        public byte[] ToBytes()
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream ms = new MemoryStream();

            bf.Serialize(ms, this);

            byte[] bytes = ms.ToArray();
            ms.Close();

            return bytes;
        }

        public static string GetIP4Address()
        {
            IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());

            foreach (IPAddress ip in ips)
            {
                if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
                {
                    return ip.ToString();
                }
            }

            return "127.0.0.1";
        }

    }

    public enum PacketType
    {
        Registration,
        Chat,
        Connect,
        Disconnect,
        Message
    }
}

Client.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerData;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Security.Cryptography;

namespace Client
{
    class Client
    {
        public static Socket master;
        public static string id;

        #region MD5 Crack vars
        public static bool found = false;
        public static string charsS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQESTUVWXYZ0123456789~!@#$%^&*_-+=`|\\(){}[]:;\"'<>,.?/ëÿüïöäêÛîôâéýúíóáé";
        public static int length = 6;
        public static int threadCountInt = 1;
        public static int[] count;
        public static long counter = 0;
        public static long counterS = 0;
        public static string test = "";
        public static char[] chars;
        public static DateTime start;
        public static int threadCount = 0;
        public static List<string> threads = new List<string>();
        public static string result;
        public static string[] currentA;
        public static Object thisLock = new Object();
       // public static IniFile ini;
        public static long runtime;
        public static string current;
        #endregion

        static void Main(string[] args)
        {
            Console.Write("Number of threads to run: ");
            threadCountInt = int.Parse(Console.ReadLine());
            chars = charsS.ToArray();
            start = DateTime.Now;
            currentA = new string[threadCountInt];

            count = new int[length];

            while (true)
            {
                Console.Clear();
                Console.Write("Enter Host IP Address: ");
                string ip = Console.ReadLine();

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

                IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(ip), 4242);

                try
                {
                    master.Connect(ipe);
                    Packet p = new Packet(PacketType.Connect, id);
                    p.Gdata.Add(Packet.GetIP4Address());
                    p.Gdata.Add(id);
                    master.Send(p.ToBytes());
                    break;
                }
                catch
                {
                    Console.WriteLine("Could Not Connect To Host!");
                    Thread.Sleep(1000);
                }
            }
            Thread t = new Thread(Data_IN);
            t.Start();

            //Packet packet = new Packet(PacketType.Connect, id);
            //packet.Gdata.Add(Packet.GetIP4Address());
            //packet.Gdata.Add(id);
            //master.Send(packet.ToBytes());

            //while (true)
            //{
            //    Console.Write("::>");
            //    string input = Console.ReadLine();
            //    if (input.ToLower() == "exit" || input.ToLower() == "close")
            //    {
            //        Packet p = new Packet(PacketType.Disconnect, id);
            //        p.Gdata.Add(name);
            //        p.Gdata.Add(Packet.GetIP4Address());
            //        master.Send(p.ToBytes());
            //        Environment.Exit(0);
            //    }
            //    else
            //    {
            //        Packet p = new Packet(PacketType.Chat, id);
            //        p.Gdata.Add(name);
            //        p.Gdata.Add(input);
            //        master.Send(p.ToBytes());
            //    }
            //}

            Thread t2 = new Thread(statusUpdate);
            t2.Start();

            for (int tt = 0; tt < threadCountInt; tt++)
            {
                new Thread(() => work(tt - 1)).Start();
            }

            Console.ReadLine();
            Environment.Exit(0);
            Console.ReadLine();
        }

        static void Data_IN()
        {
            byte[] buffer;
            int readBytes;

            while (true)
            {
                try
                {
                    buffer = new byte[master.SendBufferSize];
                    readBytes = master.Receive(buffer);

                    if (readBytes > 0)
                    {
                        DataManager(new Packet(buffer));
                    }
                }
                catch (SocketException ex)
                {
                    ConsoleColor c = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Lost Connection To The Server!");
                    Console.ForegroundColor = c;
                    Console.Write("::>");
                    Console.ReadLine();
                    Environment.Exit(0);
                }
            }
        }

        static void DataManager(Packet p)
        {
            switch (p.packetType)
            {
                case PacketType.Registration:
                    id = p.Gdata[0];
                    break;
                case PacketType.Chat:
                    ConsoleColor c = Console.ForegroundColor;
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.WriteLine(p.Gdata[0] + ": " + p.Gdata[1]);
                    Console.ForegroundColor = c;
                    Console.Write("::>");
                    break;
                case PacketType.Message:
                    count[0] = int.Parse(p.Gdata[0]);
                    count[1] = int.Parse(p.Gdata[1]);
                    count[2] = int.Parse(p.Gdata[2]);
                    count[3] = int.Parse(p.Gdata[3]);
                    count[4] = int.Parse(p.Gdata[4]);
                    count[5] = int.Parse(p.Gdata[5]);
                    counter = long.Parse(p.Gdata[6]);
                    break;
            }
        }

        public static void statusUpdate()
        {
            Thread.Sleep(1000);
            long tmp = 0;
            while (!found)
            {
                Console.Clear();
                Console.WriteLine();
                Console.WriteLine(" " + threadCount.ToString() + " Threads Running");
                Console.Write(" ");
                foreach (string s in threads)
                {
                    if (s != threads[threads.Count - 1])
                    {
                        Console.Write(s + ", ");
                    }
                    else
                    {
                        Console.Write(s);
                    }

                }
                Console.WriteLine();

                Console.WriteLine(" " + (counterS + counter).ToString() + "/" + (long)Math.Pow(charsS.Length, 6) + " (" + ((float)((float)(counterS + counter) / (float)Math.Pow(charsS.Length, 6)) * 100).ToString() + "%)");
                Console.WriteLine(" " + ((long)Math.Pow(charsS.Length, 6) - counter).ToString() + " Left");

                if (counter > 0 && TimeSpanInSecs(start) > 0)
                {
                    tmp = (counter / TimeSpanInSecs(start));
                }
                else
                {
                    tmp = 0;
                }

                Console.WriteLine(" " + tmp.ToString() + " H/S");
                if (tmp > 0)
                {
                    long ETA = ((long)Math.Pow(charsS.Length, 6) - (counterS + counter)) / tmp;
                    Console.WriteLine(" " + string.Format("{0:00}:{1:00}:{2:00}", ETA / 3600, (ETA / 60) % 60, ETA % 60) + " ETA");
                }
                else
                {
                    Console.WriteLine(" NaN ETA");
                }

                long totalRun = runtime + TimeSpanInSecs(start);
                Console.WriteLine(" Current Session: " + string.Format("{0:00}:{1:00}:{2:00}", TimeSpanInSecs(start) / 3600, (TimeSpanInSecs(start) / 60) % 60, TimeSpanInSecs(start) % 60));
                Console.WriteLine(" Total Run Time:  " + string.Format("{0:00}:{1:00}:{2:00}", totalRun / 3600, (totalRun / 60) % 60, totalRun % 60));

                Console.WriteLine(" Current: " + current);

                if (found)
                {
                    Console.WriteLine(" Result: " + result);
                }

                Thread.Sleep(1000);
            }
        }

        public static string MD5hasher(string value)
        {
            HashAlgorithm ha = MD5.Create();
            Byte[] cryptedData = ha.ComputeHash(Encoding.UTF8.GetBytes(value));

            StringBuilder sBuilder = new StringBuilder();

            for (int i = 0; i < cryptedData.Length; i++)
            {
                sBuilder.Append(cryptedData[i].ToString("x2"));
            }
            ha.Clear();
            return sBuilder.ToString();
        }

        public static long TimeSpanInSecs(DateTime start)
        {
            TimeSpan tmp = DateTime.Now - start;
            long seconds = tmp.Seconds;
            seconds += tmp.Minutes * 60;
            seconds += (tmp.Hours * 60) * 60;
            seconds += ((tmp.Days * 24) * 60) * 60;

            return seconds;

        }

        public static void work(int Tid)
        {
            int localCount = 0;
            threadCount++;
            threads.Add(Thread.CurrentThread.ManagedThreadId.ToString());
            while (!found)
            {
                test = string.Empty;
                StringBuilder sb = new StringBuilder();
                for (int x = 0; x < length; x++)
                {
                    while (true)
                    {
                        try
                        {
                            sb.Append(chars[count[x]]);
                            break;
                        }
                        catch { }
                    }

                }

                test = sb.ToString();
                current = test;

                count[count.Length - 1] = count[count.Length - 1] + 1;

                for (int y = count.Length; y >= 0; y--)
                {
                    if (y != 0)
                    {
                        if (count[y - 1] >= chars.Length - 1)
                        {
                            if (y > 1)
                            {
                                count[y - 2]++;
                            }
                            count[y - 1] = 0;
                        }
                    }
                    else
                    {
                        if (count[y] == chars.Length - 1)
                        {
                            count[y] = 0;
                        }
                    }

                }

                if (MD5hasher(test) == "de99823d330004610cba3592ce7382b8")
                {
                    result = test;
                    found = true;
                }


                localCount++;

                //lock (thisLock)
                //{
                //    counter += localCount;
                //    localCount = 0;
                //};

                Packet p = new Packet(PacketType.Message, id);
                foreach (int i in count)
                {
                    p.Gdata.Add(i.ToString());
                }
                p.Gdata.Add(localCount.ToString());
                localCount = 0;
                p.Gdata.Add(found.ToString());
                p.Gdata.Add(id);

                master.Send(p.ToBytes());

                if (found)
                {
                    Thread.CurrentThread.Abort();
                }
            }
        }
    }
}

JSON.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Server
{
    public class Rootobject
    {
        public string one { get; set; }
        public string two { get; set; }
        public string three { get; set; }
        public string four { get; set; }
        public string five { get; set; }
        public string six { get; set; }
        public string Count { get; set; }
        public string Found { get; set; }
    }
}

解决方案

The problem is from

readBytes = clientSocket.Receive(buffer);

if (readBytes > 0)
{
    //handle data
    Packet packet = new Packet(buffer);
    DataManger(packet);
}

One send from the client does not equal one receive on the server. You need "Message Frameing", your Packet only contains the first part of the data that was sent.

The easiest solution is first send the length of the byte array then have the receiving side receive only that length, allocate a buffer of that size then loop until it has fully filled the buffer.

Here is a quick example of the receiving side

private static byte[] ReadFully(Socket clientSocket, int length)
{
    int offset = 0;
    byte[] buffer = new byte[length];
    while(offset < length)
    {
        int read = clientSocket.Receive(buffer, offset, length - offset, SocketFlags.None);
        if(read = 0)
           return null; //Socket closed
        offset += read;
    }
    return buffer;
}


//read the length
byte[] lengthBuffer = ReadFully(clientSocket, 4);
if(lengthBuffer == null)
{
    //Do something about the closed connection
}
int length = BitConverter.ToInt32(lengthBuffer, 0);

//read the number of bytes specified by the length.
byte[] packetBuffer = ReadFully(clientSocket, length);

if (packetBuffer != null)
{
    //handle data
    Packet packet = new Packet(packetBuffer);
    DataManger(packet);
}

I leave it to you to do the sending side.

这篇关于输入流是不是一个有效的二进制格式。序列化问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆