1

我最近開始開發Windows Phone 7.1應用程序。該應用程序需要一個服務器才能從數據庫中獲取答案。爲此,我打算使用套接字和tcp連接。SocketAsyncEventArgs緩衝區填充「System.Byte []」而不是發送消息

它很好地連接到服務器,但當我開始嘗試流數據輸出總是「System.Byte []」。我認爲它只是一個錯誤的從一個字節[]轉換爲一個字符串,但它似乎比這更復雜。該緩衝區實際上裝載了ASCII字符的byte [],只是說「System.Byte []」。發送的消息是「Bam!」在一個長度爲4的字節[]中。我不知道這是爲什麼,但是從我所能收集的信息看來,它似乎只是在傳輸過程中發送的消息或其他東西。請幫我解決一下這個。

這是我爲Windows Phone客戶端

public partial class MainPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 
    private IPAddress ServerAddress = new IPAddress(0xff00ff00); //I sensored my IP 
    private int ServerPort = 13000; 
    private Socket CurrentSocket; 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      ConnectToServer(); 
     } 
     catch (Exception exception) 
     { 
      Dispatcher.BeginInvoke(() => MessageBox.Show("Error: " + exception.Message)); 
     } 
    } 

    private void ConnectToServer() 
    { 
     CurrentSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

     //Create a new SocketAsyncEventArgs 
     SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs(); 
     socketEventArgs.RemoteEndPoint = new IPEndPoint(ServerAddress, ServerPort); 
     socketEventArgs.Completed += ConnectionCompleted; 

     socketEventArgs.SetBuffer(new byte[32], 0, 32); 

     CurrentSocket.ConnectAsync(socketEventArgs); 
    } 

    private void ConnectionCompleted(object sender, SocketAsyncEventArgs e) 
    { 
     Dispatcher.BeginInvoke(() => MessageBox.Show("You are connected to the server")); 

     //Create a new SocketAsyncEventArgs 
     SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs(); 
     socketEventArgs.RemoteEndPoint = new IPEndPoint(ServerAddress, ServerPort); 
     socketEventArgs.Completed += MessageReceived; 

     socketEventArgs.SetBuffer(new byte[32], 0, 32); 

     CurrentSocket.ReceiveAsync(socketEventArgs); 
    } 

    private void MessageReceived(object sender, SocketAsyncEventArgs e) 
    { 
     Dispatcher.BeginInvoke(() => MessageBox.Show("You have received a message!")); 

     string message1 = Convert.ToString(e.Buffer); 
     string message2 = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransferred); 

     if (message1.Equals(message2)) 
      Dispatcher.BeginInvoke(() => MessageBox.Show(message1)); 

     CurrentSocket.ReceiveAsync(e); 
    } 
} 

這是C#Server代碼

class ConnectionHandler 
{ 
    TcpListener listener; 

    public ConnectionHandler() 
    { 
     listener = new TcpListener(System.Net.IPAddress.Any, 13000); 
     listener.Start(); 

     while (true) 
     { 
      Thread thread = new Thread(Service); 
      Socket socket = listener.AcceptSocket(); 
      Console.WriteLine("Socket accepted"); 
      thread.Start(socket); 
     } 
    } 

    public void Service(object arg) 
    { 
     Socket socket = (Socket)arg; 

     try 
     { 
      Stream stream = new NetworkStream(socket); 
      Console.WriteLine("Stream created"); 

      string output = "Bam!"; 

      Byte[] bytes = Encoding.UTF8.GetBytes(output); 

      StreamWriter writer = new StreamWriter(stream); 

      writer.Write(bytes); 
      writer.Flush(); 
      writer.Close(); 

      output = Encoding.UTF8.GetString(bytes); 

      Console.WriteLine("Message sent: " + output); 

      stream.Close(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("You got an error in ConnectionHandler"); 
      Console.WriteLine(e.Message); 
      socket.Close(); 
     } 

    } 
} 
+0

所以'message1'和'message2'相等且都包含字符串' 「System.Byte []」'?在你的代碼中,我希望'message1'包含''System.Byte []「',message2'包含''Bam!」'(或''Bam「'或''Ba」'或' 「B」')。 – dtb 2013-02-15 16:17:20

+0

他們是一樣的,測試證明了它。兩者都是「System.Byte []」。 – Switchice 2013-02-15 16:23:45

回答

1

的問題是在你的Service方法的代碼。

A StreamWriter允許您將Unicode字符串寫入底層Stream。它使用Encoding將字符串轉換爲字節,然後將它們寫入流。

你將你的字符串"Bam!"到自己的字節,然後調用StreamWriter.Write Method (Object) —的StreamWriter類沒有一個接受byte[]寫入方法。

StreamWriter.Write Method (Object)對傳遞的對象調用ToString。並且ToString Method針對byte[]返回"String.Byte[]"

解決方案:

string output = "Bam!"; 

StreamWriter writer = new StreamWriter(stream); 
writer.Write(output); 
writer.Flush(); 
writer.Close(); 

string output = "Bam!"; 

Byte[] bytes = Encoding.UTF8.GetBytes(output); 

stream.Write(bytes, 0, bytes.Length); 
+0

是的,這解決了它!非常感謝!我實際上試圖用一個字符串輸出運行服務器端,但它一定是在我用兩個不同的字節[]來檢查字符串方法之前。 – Switchice 2013-02-15 16:38:11

相關問題