从TCP套接字读取数据,但没有获取所有数据

本文关键字:数据 获取 TCP 套接字 读取 | 更新日期: 2023-09-27 18:14:23

我正在开发一个c#和android客户端/服务器应用程序。

Android正在向c#发送一个消息,我可以看到它正在发送正确的数据,但是c#并没有接收到所有的数据。

下面是我用c#编写的代码

TcpListener tcpListener = new TcpListener(IPAddress.Any, serverTCPPort);
                tcpListener.Start();
                while (true)
                {
                    tcpClient = tcpListener.AcceptTcpClient();
                    stream = tcpClient.GetStream();
                    reader = new StreamReader(stream);
                    writer = new StreamWriter(stream);
                    writer.NewLine = "'r'n";
                    writer.AutoFlush = true;
                    byte[] serverData = new byte[tcpClient.ReceiveBufferSize];
                    int length = stream.Read(serverData, 0, serverData.Length);
                    string received = Encoding.ASCII.GetString(serverData, 0, length);
}

下面是我如何通过Android发送数据

f (contactInformation.photoBase64String != null) {
                bitmap = MediaStore.Images.Media.getBitmap(context.getContentResolver(), Uri.parse(contactInformation.photoBase64String));
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
                byte[] b = baos.toByteArray();
                bitmap64Encoded = Base64.encodeToString(b, Base64.DEFAULT);
            }
            Toast.makeText(context, "Incoming call from " + contactInformation.contactName, Toast.LENGTH_LONG).show();
            XmlSettings xmlSettings = new XmlSettings();
            xmlSettings.setIndent(true);
            XmlWriter xmlWriter = new XmlWriter(xmlSettings);
            xmlWriter.writeStartDocument();
            xmlWriter.writeStartElement("StatusManager");
            xmlWriter.writeElementString("Command", Defines.ServerCommands.IncomingCall.toString());
            xmlWriter.writeStartElement("CallInformation");
            xmlWriter.writeElementString("PhoneNumber", phoneNumber);
            xmlWriter.writeElementString("ContactName", contactInformation.contactName);
            if (contactInformation.photoBase64String != null)
            {
                xmlWriter.writeElementString("PhotoUri", bitmap64Encoded);
            }
            xmlWriter.writeEndElement();
            xmlWriter.writeEndElement();
            String xml = xmlWriter.returnXmlOutput();
            TCPSender tcpSender = new TCPSender(context, DeviceManagement.servers.get(0), xmlWriter.returnXmlOutput());
            Thread thread = new Thread(tcpSender);
            thread.start();

TCP发送方是

@Override
    public void run() {
        Log.d("TCPSender", xml);
        HelperClass helperClass = new HelperClass();
        try
        {
            Socket socket = new Socket(foundServerInformation.ipAddress, foundServerInformation.tcpServerPort);
            
            OutputStream out = socket.getOutputStream();
            PrintWriter output = new PrintWriter(out);
            output.println(xml);
            output.flush();

我猜数据对于字节数组来说太大了,但我找不到一种方法来确保我得到Android发送的所有信息

从TCP套接字读取数据,但没有获取所有数据

很难知道问题可能在哪里(我看到你的代码是OK的),但是这里你有一个来自微软的工作示例应该如何完成,也许它会给你一些线索。

TcpListener server=null;   
try
{
      // Set the TcpListener on port 13000.
      Int32 port = 13000;
      IPAddress localAddr = IPAddress.Parse("127.0.0.1");
      // TcpListener server = new TcpListener(port);
      server = new TcpListener(localAddr, port);
      // Start listening for client requests.
      server.Start();
      // Buffer for reading data
      Byte[] bytes = new Byte[256];
      String data = null;
      // Enter the listening loop.
      while(true) 
      {
        Console.Write("Waiting for a connection... ");
        // Perform a blocking call to accept requests.
        // You could also user server.AcceptSocket() here.
        TcpClient client = server.AcceptTcpClient();            
        Console.WriteLine("Connected!");
        data = null;
        // Get a stream object for reading and writing
        NetworkStream stream = client.GetStream();
        int i;
        // Loop to receive all the data sent by the client.
        while((i = stream.Read(bytes, 0, bytes.Length))!=0) 
        {   
          // Translate data bytes to a ASCII string.
          data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
          Console.WriteLine("Received: {0}", data);
          // Process the data sent by the client.
          data = data.ToUpper();
          byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
          // Send back a response.
          stream.Write(msg, 0, msg.Length);
          Console.WriteLine("Sent: {0}", data);            
        }
        // Shutdown and end connection
        client.Close();
      }
    }
    catch(SocketException e)
    {
      Console.WriteLine("SocketException: {0}", e);
    }
    finally
    {
       // Stop listening for new clients.
       server.Stop();
    }

    Console.WriteLine("'nHit enter to continue...");
    Console.Read();

我终于设法让它工作,这是与使用SendReceiveBuffer,我做了尝试,但没有工作,但现在它这样做,所以我想我错过了一些东西。

下面是我用来接收所有数据的代码
TcpListener tcpListener = new TcpListener(IPAddress.Any, serverTCPPort);
                tcpListener.Start();
                string received = "";
                while (true)
                {
                    tcpClient = tcpListener.AcceptTcpClient();
                    stream = tcpClient.GetStream();
                    reader = new StreamReader(stream);
                    writer = new StreamWriter(stream);
                    writer.NewLine = "'r'n";
                    writer.AutoFlush = true;
                    byte[] bytes = new byte[tcpClient.SendBufferSize];
                    int recv = 0;
                    while (true)
                    {
                        recv = stream.Read(bytes, 0, tcpClient.SendBufferSize);
                        received += System.Text.Encoding.ASCII.GetString(bytes, 0, recv);
                        if (received.EndsWith("'n'n"))
                        {
                            break;
                        }
                    }
}