2013-01-02 69 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