使用 TCP/IP 通信将随机生成的字节数组从客户端发送到服务器
Sending randomly generated byte array from client to the server using TCP/IP communication
我有一个数组,其中元素的数量是在 1-11 之间随机生成的,值也是从 0 到 254 之间随机生成的。
我想将这些值从客户端发送到服务器,并用 Console.WriteLine()
写出原始数组值。我已经尝试了好几天了,我尝试了很多选择,但我无法解决这个问题。我分享了我认为最接近的代码,但服务器发送了这样的错误:
“输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或填充字符中的非白色 space 字符”
之后我尝试将 ("-","+") 替换为 ("_","/") 但它没有用。
客户端程序为:
static void Main(string[] args)
{
Random rnd = new Random();
byte[] array = new byte[rnd.Next(1, 11)];
for (int i = 0; i < array.Length; ++i)
{
array[i] = (byte)rnd.Next(255);
Console.WriteLine(array[i]);
}
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("111.11.11.111", 8888);
while (true)
{
NetworkStream serverStream = clientSocket.GetStream();
string str = Convert.ToBase64String(array);
byte[] outStream = System.Text.Encoding.UTF8.GetBytes(str);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
}
服务器程序为:
IPAddress ipAd = IPAddress.Parse("111.11.11.111");
TcpListener serverSocket = new TcpListener(ipAd, 8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine("*****Server started*****");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine("Accepted connection from client");
while(true)
{
try
{
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
if(networkStream.DataAvailable)
{
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
byte[] decByte = Convert.FromBase64String(dataFromClient);
foreach (var item in decByte)
{
Console.WriteLine(item.ToString());
}
networkStream.Flush();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
此代码在同一控制台应用程序中完美运行,但可能无法在客户端和服务器之间运行:
string str = Convert.ToBase64String(array);
Console.WriteLine(str);
byte[] decByte = Convert.FromBase64String(str);
Console.WriteLine(decByte[0]);
我可能把整个事情复杂化了,但最后我很困惑。如果我已经有了一个字节数组,还需要编码吗?有人可以告诉我最简单的方法或方法如何完成吗?提前感谢您的时间和帮助。
我注意到的第一个问题是,在您的服务器代码中,您使用整个缓冲区调用了 UTF8.GetString
,而不是指定您实际收到的字节数。改变这个:
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
进入这个:
var receivedCount = networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom, 0, receivedCount);
您最终会 运行 遇到另一个问题,但是,因为消息有时会变得支离破碎,并且您的设计不包含任何用于指示是否已收到整个消息的方法。您需要在每条消息的末尾放置一个换行符,或者在消息前加上预期的总大小,或者 something 以便服务器知道所有数据何时被发送已收到。你不能指望所有东西都一件一件地到达。
我有一个数组,其中元素的数量是在 1-11 之间随机生成的,值也是从 0 到 254 之间随机生成的。
我想将这些值从客户端发送到服务器,并用 Console.WriteLine()
写出原始数组值。我已经尝试了好几天了,我尝试了很多选择,但我无法解决这个问题。我分享了我认为最接近的代码,但服务器发送了这样的错误:
“输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或填充字符中的非白色 space 字符”
之后我尝试将 ("-","+") 替换为 ("_","/") 但它没有用。
客户端程序为:
static void Main(string[] args)
{
Random rnd = new Random();
byte[] array = new byte[rnd.Next(1, 11)];
for (int i = 0; i < array.Length; ++i)
{
array[i] = (byte)rnd.Next(255);
Console.WriteLine(array[i]);
}
System.Net.Sockets.TcpClient clientSocket = new System.Net.Sockets.TcpClient();
clientSocket.Connect("111.11.11.111", 8888);
while (true)
{
NetworkStream serverStream = clientSocket.GetStream();
string str = Convert.ToBase64String(array);
byte[] outStream = System.Text.Encoding.UTF8.GetBytes(str);
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
}
}
服务器程序为:
IPAddress ipAd = IPAddress.Parse("111.11.11.111");
TcpListener serverSocket = new TcpListener(ipAd, 8888);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
Console.WriteLine("*****Server started*****");
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine("Accepted connection from client");
while(true)
{
try
{
NetworkStream networkStream = clientSocket.GetStream();
byte[] bytesFrom = new byte[10025];
if(networkStream.DataAvailable)
{
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
byte[] decByte = Convert.FromBase64String(dataFromClient);
foreach (var item in decByte)
{
Console.WriteLine(item.ToString());
}
networkStream.Flush();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
此代码在同一控制台应用程序中完美运行,但可能无法在客户端和服务器之间运行:
string str = Convert.ToBase64String(array);
Console.WriteLine(str);
byte[] decByte = Convert.FromBase64String(str);
Console.WriteLine(decByte[0]);
我可能把整个事情复杂化了,但最后我很困惑。如果我已经有了一个字节数组,还需要编码吗?有人可以告诉我最简单的方法或方法如何完成吗?提前感谢您的时间和帮助。
我注意到的第一个问题是,在您的服务器代码中,您使用整个缓冲区调用了 UTF8.GetString
,而不是指定您实际收到的字节数。改变这个:
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom);
进入这个:
var receivedCount = networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);
string dataFromClient = System.Text.Encoding.UTF8.GetString(bytesFrom, 0, receivedCount);
您最终会 运行 遇到另一个问题,但是,因为消息有时会变得支离破碎,并且您的设计不包含任何用于指示是否已收到整个消息的方法。您需要在每条消息的末尾放置一个换行符,或者在消息前加上预期的总大小,或者 something 以便服务器知道所有数据何时被发送已收到。你不能指望所有东西都一件一件地到达。