为什么在字节数组和字符串之间进行转换时Environment.NewLine不起作用

时间:2012-11-03 00:26:18

标签: c# string sockets type-conversion

我正在使用TCP在服务器和客户端之间发送数据。我发送一个字节流,所以我将字符串转换为字节数组,发送到客户端,然后将其转换回字符串。然后我将此字符串插入到多行文本框中,每个文本框后面都有Environment.NewLine。但是,没有出现新的一条线。

我尝试了多种方法将字符串转换为数组并返回字符串,但结果相同。 Environment.NewLine不起作用。 \n\r不起作用。

我尝试使用以下技术进行转换:

  1. Encoding.ASCII.GetString()Encoding.ASCII.GetBytes()
  2. Encoding.Unicode.GetString()Encoding.Unicode.GetBytes()
  3. 我还使用了以下网站上的代码:

    System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
    String to Byte Array Conversion in C# and VB.NET (and back)

  4. 我应该如何来回转换这些字符串才能使其正常工作?我的客户端目前是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);
        }
    }
    

1 个答案:

答案 0 :(得分:3)

  

我发送一个字节流

这是正确的,TCP是一个流。哪个不支持像“数据包”这样的东西。就像一行文字。除了接收所有内容之外,没有明显的方法将流转换为byte [],直到客户端关闭连接。这当然意味着您将显示所有内容,然后是单个 Environment.NewLine。

重新思考你的方法。就像实际发送数据中的行尾一样,所以你不必在接收器中添加它们。通过首先发送编码数据包长度的4个字节来人工创建数据包是另一种方法。