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

相关问题