我正在使用 TCP 在服务器和客户端之间发送数据。我发送一个字节流,所以我将字符串转换为字节数组,发送到客户端,然后将其转换回字符串。然后我将此字符串插入到一个多行文本框中,每个文本框Environment.NewLine
后面都有。但是,没有出现新行。
我尝试了多种将字符串转换为数组并返回字符串的方法,结果都相同。Environment.NewLine
不起作用。\n\r
不起作用。
我尝试使用以下技术进行转换:
Encoding.ASCII.GetString()
和Encoding.ASCII.GetBytes()
Encoding.Unicode.GetString()
和Encoding.Unicode.GetBytes()
我还使用了以下网站上的代码:
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);
}
}