1

我试图通过套接字发送几个数据,所以它被转换为字节,然后返回到服务器上的字符串。但我显然只能做一个。

服务器代码:

static void Read(IAsyncResult ar)
{
    int fileNameLen = 1;
    //int userNameLen = 9;

    State newState = (State)ar.AsyncState; //gets state of Socket
    Socket handler = newState.Socket_w; //passes Socket to handler

    int bytesRead = handler.EndReceive(ar); //terminates Data Receive from Socket.

    if (bytesRead > 0)
    {
        if (flag == 0)
        {
            fileNameLen = BitConverter.ToInt32(newState.buffer, 0); //gets filename length
            fileName = Encoding.UTF8.GetString(newState.buffer, 4, fileNameLen); //gets filename
            //userNameLen = BitConverter.ToInt32(newState.buffer, 8);
            //getUsername = Encoding.UTF8.GetString(newState.buffer, 8, fileNameLen);

            flag++;
        }
    }    
}

客户端代码:

internal static void uploadFile(string host, string username, string getGame, string filename, string filepath)
{
    byte[] m_clientData;
    Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    byte[] fileName = Encoding.UTF8.GetBytes(username + "_" + filename);
    byte[] fileData = File.ReadAllBytes(filepath);
    byte[] fileNameLen = BitConverter.GetBytes(fileName.Length);
    //byte[] sendUsername = Encoding.UTF8.GetBytes(username);
    //byte[] sendUsernameLen = BitConverter.GetBytes(sendUsername.Length);
    //byte[] sendGame = Encoding.UTF8.GetBytes(getGame);
    //byte[] sendGameLen = BitConverter.GetBytes(sendGame.Length);

    m_clientData = new byte[4 + fileName.Length + fileData.Length];

    fileNameLen.CopyTo(m_clientData, 0);
    fileName.CopyTo(m_clientData, 4);
    fileData.CopyTo(m_clientData, 4 + fileName.Length);

    //sendUsernameLen.CopyTo(m_clientData, 0);
    //sendUsername.CopyTo(m_clientData, 4);

    //sendGameLen.CopyTo(m_clientData, 0);
    //sendGame.CopyTo(m_clientData, 4);

    clientSock.Connect(host, 8889);
    clientSock.Send(m_clientData); //tofix exception
    clientSock.Close();
}

我似乎无法在服务器上正确解密它。任何人都可以帮我解决缓冲区大小之类的问题吗?

4

1 回答 1

0

Read对发送的内容一无所知;TCP 基本上只是一个流 - 所以绝对没有什么可以说您在一次调用中拥有所有数据Read;你可以有:

  • 正是您发送的数据量
  • 一封邮件的一部分
  • 17 条信息
  • 一条消息的结束和下一条消息的开始
  • 消息中的 1 个单独字节

您需要设计某种成帧协议,让接收者知道他们何时拥有完整的消息。这可以像长度前缀一样简单,也可以更复杂。然后,您应该在内存中缓冲数据(或逐渐处理它),直到获得整个消息。一次调用Read不太可能代表一条完整的消息。实际上,如果消息大于您的 ,则保证不会出现这种情况,但即使对于小消息和大缓冲区,您也可以获得相同的结果。newstate.buffer

于 2013-01-02T20:37:02.983 回答