2

TCPを使用してサーバーとクライアント間でデータを送信しています。私はバイトのストリームを送信するので、文字列をバイト配列に変換し、クライアントに送信してから、文字列に変換し直します。次に、この文字列を複数行のテキストボックスに挿入しますEnvironment.NewLine。ただし、改行は表示されません。

文字列を配列に変換し、文字列に戻す複数の方法を試しましたが、すべて同じ結果になりました。Environment.NewLine動作しません。\n\r動作しません。

次の手法を使用して変換を試みました。

  1. Encoding.ASCII.GetString()Encoding.ASCII.GetBytes()
  2. Encoding.Unicode.GetString()Encoding.Unicode.GetBytes()
  3. 私はまた、以下を使用する次のWebサイトのコードを使用しました。

    System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
    C#およびVB.NETでの文字列からバイト配列への変換(およびその逆)

これを機能させるには、これらの文字列を前後に変換するにはどうすればよいですか?私のクライアントは現在C#ですが、本番環境ではJavaになります。

編集:

    AttachMessage(ByteArrayToStr(messageInByteArray)); // Doesn't work
    AttachMessage("TEST"); // works


    public void AttachMessage(string data)
    {
        textBox2.Text += data + Environment.NewLine;
    }

    public static string ByteArrayToStr(byte[] arr)
    {
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetString(arr);
    }

    public static byte[] StrToByteArray(string str)
    {
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetBytes(str);
    }

変換されていない文字列で機能するため、変換の問題です。

編集2:

public partial class Form1 : Form
{
    public volatile List<TcpClient> connectedClients;
    public volatile bool ServerOn;
    public volatile TcpListener server;
    public delegate void txtBoxDelegate(string data);
    public delegate void tcpCommand(string ipAddress);
    public delegate void chatMessageDelegate(byte[] message);

    public Form1()
    {
        InitializeComponent();
        connectedClients = new List<TcpClient>();
        ServerOn = false;
        server = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 6789);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (!ServerOn)
        {
            Thread serverThread = new Thread(new ThreadStart(TcpServer));
            serverThread.IsBackground = true;
            serverThread.Start();
            lblServerStatus.Text = "The server is On.";
            lblServerStatus.ForeColor = Color.Green;
            lstServerUpdates.Text = String.Empty;
            button1.Text = "Turn server Off";
            ServerOn = true;
        }
        else
        {
            ServerOn = false;
            lstServerUpdates.Text = "Server has been turned off.";
            lblServerStatus.Text = "The server is Off.";
            lblServerStatus.ForeColor = Color.Red;
        }
    }

    public static string ByteArrayToStr(byte[] arr)
    {
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetString(arr);
    }

    public static byte[] StrToByteArray(string str)
    {
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        return encoding.GetBytes(str);
    }

    private void TcpServer()
    {
        printToTextBox("Starting TCP Server.");

        server.Start();
        while (ServerOn)
        {
            if (!server.Pending())
            {
                Thread.Sleep(10);
                continue;
            }
            TcpClient clientSocket = server.AcceptTcpClient();

            NetworkStream stream = clientSocket.GetStream();

            connectedClients.Add(clientSocket);

            Thread clientThread = new Thread(new ParameterizedThreadStart(ClientThreads));
            clientThread.Start(clientSocket);

            byte[] bytes = StrToByteArray("Successfully connected to the server.");

            stream.Write(bytes, 0, bytes.Length);
            printToTextBox("Client successfully connected to server.");
        }


        server.Stop();
    }

    public void ClientThreads(object tcpClient)
    {
        TcpClient clientSocket = (TcpClient)tcpClient;
        NetworkStream clientStream = clientSocket.GetStream();

        byte[] clientMessage = new byte[100];

        while (ServerOn)
        {
            clientStream.Read(clientMessage, 0, clientMessage.Length);
            string message = ByteArrayToStr(clientMessage);
            if (message.Contains("!chat"))
            {
                SendChatMessage(StrToByteArray(message.Substring(5) + Environment.NewLine));
            }
            else if (message.Contains("!start")) 
            {
                StartWebcam(((IPEndPoint)clientSocket.Client.RemoteEndPoint).Address.ToString());
            }
            else if (message.Contains("!stop"))
            {
                StopWebcam(((IPEndPoint)clientSocket.Client.RemoteEndPoint).Address.ToString());
            }
        }
        clientSocket.Close();
        connectedClients.Clear();
    }

    public void printToTextBox(string data)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new txtBoxDelegate(printToTextBox), data);
            return;
        }
        lstServerUpdates.Text += data + Environment.NewLine;
    }

    public void SendChatMessage(byte[] message)
    {
        foreach (TcpClient client in connectedClients)
        {
            NetworkStream stream = client.GetStream();
            stream.Write(message, 0, message.Length);
            printToTextBox(ByteArrayToStr(message));
        }
    }

    public void StartWebcam(string IPAddress)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new tcpCommand(StartWebcam), IPAddress);
            return;
        }

        //code to stop webcam for the specified client
        printToTextBox("Starting webcam for IP: " + IPAddress);
    }

    public void StopWebcam(string IPAddress)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new tcpCommand(StopWebcam), IPAddress);
            return;
        }

        //code to stop webcam for specified client
        printToTextBox("Stopping webcam for IP: " + IPAddress);
    }
}
4

1 に答える 1

3

バイトのストリームを送信します

そうです、TCPはストリームです。これは「パケット」のようなものをサポートしていません。一行のテキストのように。クライアントが接続を閉じるまですべてを受信する以外に、ストリームをbyte[]に変換する明確な方法はありません。もちろん、これは、すべてを表示し、その後に1つのEnvironment.NewLineを表示することを意味します。

あなたのアプローチを再考してください。実際にデータの行末を送信するのと同じように、レシーバーに行末を追加する必要はありません。パケット長をエンコードする4バイトを最初に送信して人為的にパケットを作成することも別のアプローチです。

于 2012-11-03T00:49:53.460 に答える