ここに自分のコードがありますが、このバグは何か分かりません。 「Handle Client」メソッドで「Net」オブジェクトを逆シリアル化するときに問題が発生していると誰かが話しました。私は新しいクライアントが来るたびにそれを上書きするので、これを解決するのを手伝ってもらえますか?私はまだ私が何をすべきか理解できません。このシリアライズ例外を解決するにはどうすればよいですか?
最初は2-3メッセージで動作し、クラッシュします。私が手
例外は次のとおりです。
シリアライゼーション例外 - 入力ストリームの有効なバイナリフォーマットではありません。 FF-FF-FF-FF-06-44-61-76-69-64-3A-20-66-75-63-6B-20 ...の開始内容(バイト単位)です。
また、私は同じシリアライゼーション例外を得ました。
コード:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Runtime.Serialization.Formatters.Binary;
using System.Net.Sockets;
using System.Net;
using Message;
namespace Chat
{
public partial class ChatWindow : Form
{
uMessage umsg = new uMessage();
BinaryFormatter bf = new BinaryFormatter();
NetworkStream Net;
TcpListener listener;
TcpClient client;
List<NetworkStream> Clients = new List<NetworkStream>();
public ChatWindow(string ip, int port)
{
InitializeComponent();
umsg.IP = ip;
umsg.Port = port;
}
public void OpenNewThread()
{
listener = new TcpListener(IPAddress.Parse(umsg.IP), umsg.Port);
listener.Start();
Thread a = new Thread(Listen);
a.Start();
}
public void Listen()
{
do
{
client = listener.AcceptTcpClient();
Net = client.GetStream();
Clients.Add(Net);
umsg.Name = bf.Deserialize(Net).ToString();
lstboxCurrentUsers.Invoke(new Action(() =>
{
lstboxCurrentUsers.Items.Add($"{umsg.Name} connected at " + DateTime.Now);
listboxHistory.Items.Add($"{umsg.Name} connected at " + DateTime.Now);
}));
LetSubsKnow(Clients);
Thread b = new Thread(() => HandleClient(Clients));
b.Start();
} while (true);
}
public void HandleClient(List<NetworkStream> ClientsStream)
{
while (true)
{
umsg.Message = bf.Deserialize(Net).ToString();
foreach (var client in ClientsStream)
{
bf.Serialize(client, umsg.Message);
}
}
}
public void LetSubsKnow(List<NetworkStream> clientsStream)
{
foreach (var client in clientsStream)
{
bf.Serialize(client, $"{umsg.Name} Has Connected.");
}
}
コードがスレッドセーフであることを確認してください。 –
'BinaryFormatter'を' string'をシリアル化するために使用せず、ペイロードを追加し、デバッグするのが難しく、非.NETクライアントと互換性がありません。代わりに 'Encoding.UTF8'を使用したいかもしれません。 –