1

最近、Windows Phone 7.1 アプリケーションの開発を開始しました。アプリには、データベースから回答を取得するためのサーバーが必要です。そのために、ソケットと tcp 接続を使用するつもりです。

サーバーへの接続は非常にうまく機能しましたが、データのストリーミングを試み始めたとき、出力は常に「System.Byte[]」でした。byte[] から文字列への誤ったキャストに違いないと思いましたが、それよりも複雑なようです。バッファには、実際には、「System.Byte[]」だけを示す ASCII 記号の byte[] がロードされます。送信されたメッセージは「Bam!」でした。長さ 4 の byte[] で。理由はわかりませんが、私が収集できたものから、送信されたメッセージは単に送信中にいじられているように見えます。これで私を助けてください。

これは、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# サーバー コードです。

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

    }
}
4

1 に答える 1

1

問題はあなたのService方法にあります。

StreamWriterを使用すると、基になるStream に Unicode 文字列を書き込むことができます。Encodingを使用して、文字列をストリームに書き込む前にバイトに変換します。

自分で文字列をバイトに変換してから、 StreamWriter.Write メソッド (オブジェクト)"Bam!"を呼び出します— StreamWriterクラスには、.byte[]

StreamWriter.Write メソッド (オブジェクト)は、渡されたオブジェクトで ToString を呼び出しますToString メソッド"String.Byte[]"を 返します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);
于 2013-02-15T16:31:50.533 に答える