2013-01-02 40 views
1

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

Server代码:

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(); 
} 

我似乎无法正确地在解密服务器上。任何人都可以帮我缓冲区和什么?

+0

你是什么意思,你不能解密它?你的意思是你没有看到字节,或者未加密的结果不是原始文件,或者试图解密它,你会得到一个错误信息? –

+0

我的意思是说,我得到的结果与\ 0 \ 0 \ 0混杂在一起,或者由于错误的缓冲区解析而导致文本乱码。 – user1943911

回答

0

Read对发送内容不知道什么; TCP基本上只是一个流 - 所以有绝对没有说,你有一个电话的所有数据Read;你可以有:你发送

  • 部分一个消息
  • 17消息
  • 一个消息的结束和下一个
  • 1孤字节的从一开始的

    • 准确的数据量一条消息

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

  • +0

    谢谢你的回应,我有一种灵感,并调整它的工作:p。 此致敬礼。 – user1943911