我最近開始開發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();
}
}
}
所以'message1'和'message2'相等且都包含字符串' 「System.Byte []」'?在你的代碼中,我希望'message1'包含''System.Byte []「',message2'包含''Bam!」'(或''Bam「'或''Ba」'或' 「B」')。 – dtb 2013-02-15 16:17:20
他們是一樣的,測試證明了它。兩者都是「System.Byte []」。 – Switchice 2013-02-15 16:23:45