gpt4 book ai didi

c# - 通过 TCP 发送大字符串 - Windows Phone

转载 作者:可可西里 更新时间:2023-11-01 02:34:51 26 4
gpt4 key购买 nike

我在Windows Phone上开发了一个简单的TCP客户端,如图here on MSDN

这正如预期的那样工作。

现在,我想通过这个客户端发送非常大的 Base64 字符串(用于传输图像)。但是,当我尝试从此客户端发送 Base64 字符串时,我在服务器上只收到了字符串的一部分,因此我无法在服务器上生成整个图像。

用于接收字符串的服务器端代码是:(已编辑)

            IPAddress ipAd = IPAddress.Any;

Console.Write("Port No. (leave blank for port 8001): ");
string port;
port = Console.ReadLine();

if (port == "")
port = "8001";

/* Initializes the Listener */
TcpListener myList = new TcpListener(ipAd, int.Parse(port));

/* Start Listeneting at the specified port */
myList.Start();

Console.WriteLine("\nThe server is running at port " + port);
Console.WriteLine("The local End point is :" +
myList.LocalEndpoint);
Console.WriteLine("\nWaiting for a connection.....");

Socket s = myList.AcceptSocket();
Console.WriteLine("\nConnection accepted from " + s.RemoteEndPoint);

byte[] b = new byte[5 * 1024 * 1024]; // BIG SIZE for byte array, is this correct?
String message = String.Empty;

int k = s.Receive(b);
Console.WriteLine("\nRecieved...");
for (int i = 0; i < k; i++)
{
message += Convert.ToChar(b[i]);
Console.Write(Convert.ToChar(b[i]));
}

System.IO.File.WriteAllText(@"Message.txt", message); // write it to a file

ASCIIEncoding asen = new ASCIIEncoding();
s.Send(asen.GetBytes("The string was recieved by the server."));
Console.WriteLine("\n\nSent Acknowledgement");
/* clean up */
s.Close();
myList.Stop();

我真的被困在这里了。请帮助我。

我认为问题出在客户端而不是服务器。请帮助我。

我在客户端中使用的类可以在 MSDN article 中找到如上所述。

PS:我已经尝试在类里面增加TIMEOUT_MILLISECONDSMAX_BUFFER_SIZE 的值。但这并没有帮助。

更新:

这是一些客户端代码 ( look here on MSDN for reference ):

        // Make sure we can perform this action with valid data
if (ValidateRemoteHost() && ValidateInput())
{
// Instantiate the SocketClient
SocketClient client = new SocketClient();

// Attempt to connect to the echo server
Log(String.Format("Connecting to server '{0}' over port {1} (echo) ...", txtRemoteHost.Text, ECHO_PORT), true);
string result = client.Connect(txtRemoteHost.Text, ECHO_PORT);
Log(result, false);

byte[] bytearray = null;

// Attempt to send our message to be echoed to the echo server
Log(String.Format("Sending '{0}' to server ...", txtInput.Text), true);
if (checkBox1.IsChecked == true) // this checkbox is for image selection
{


// This is the part where we send images


using (MemoryStream ms = new MemoryStream())
{
WriteableBitmap wbitmp = new WriteableBitmap((BitmapImage)image1.Source);

wbitmp.SaveJpeg(ms, (int)wbitmp.PixelWidth, (int)wbitmp.PixelHeight, 0, 10);
bytearray = ms.ToArray();
string str = Convert.ToBase64String(bytearray);

result = client.Send(str);
System.Diagnostics.Debug.WriteLine("\n\nMessge sent:\n\n" + str + "\n\n");
}
}
else
{
result = client.Send(txtInput.Text);
}

Log(result, false);

// Receive a response from the server
Log("Requesting Receive ...", true);
result = client.Receive();
Log(result, false);

// Close the socket connection explicitly
client.Close();
}

最佳答案

                    while ((RecBytes = netstream.Read(RecData, 0, RecData.Length)) > 0)
{
Fs.Write(RecData, 0, RecBytes);
totalrecbytes += RecBytes;
}

编辑:现在那部分代码已经减少到只有

        int k = s.Receive(b);

很糟糕:它假定所有数据都一次完美发送,这不是网络的工作方式。

两种选择:

  • 在字符串的开头,包括它应该有多长。
  • 在字符串的末尾,有一个结束符号(可能是 null),它不会出现在消息的其他任何地方

然后那个 while 循环应该继续下去,直到找到整个长度或找到结束符号。

(此外,发送 Base64 是一个坏主意,如果你可以避免的话。为什么不作为原始字节流发送呢?)

[ED:这部分不再相关](另外,为什么服务器要选择保存文件的位置[并延迟一切,直到服务器做出选择] - 客户端应该在开始时指示保存文件的位置,然后服务器只是对其进行健全性检查。[除非你有充分的理由不那样做])

编辑:我所说内容的快速简单实现:

此服务器代码

        int k = s.Receive(b);
Console.WriteLine("\nRecieved...");
for (int i = 0; i < k; i++)
{
message += Convert.ToChar(b[i]);
Console.Write(Convert.ToChar(b[i]));
}

改为

        while (true)
{
int k = s.Receive(b);
Console.WriteLine("\nRecieved...");
for (int i = 0; i < k; i++)
{
char bc = Convert.ToChar(b[i]); // This is a very wrong way of doing this but it works I guess meh.
if (bc == ' ')
{ // You've struck the end! Get out of this infinite loop!
goto endmyloop;
}
message += bc;
Console.Write(bc);
}
}
endmyloop:

这段客户端代码

                result = client.Send(str);

改为

                result = client.Send(str + " ");

-- Base64 中不能有空格,因此将用于标记结束。

请注意,如果客户端出错(并且由于某些奇怪的原因未在末尾发送空格),此代码将永远陷入 while 循环(零 CPU 使用率无限等待)

关于c# - 通过 TCP 发送大字符串 - Windows Phone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17398454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com