TCPを使用してサーバーとクライアント間でデータを送信しています。私はバイトのストリームを送信するので、文字列をバイト配列に変換し、クライアントに送信してから、文字列に変換し直します。次に、この文字列を複数行のテキストボックスに挿入しますEnvironment.NewLine
。ただし、改行は表示されません。
文字列を配列に変換し、文字列に戻す複数の方法を試しましたが、すべて同じ結果になりました。Environment.NewLine
動作しません。\n\r
動作しません。
次の手法を使用して変換を試みました。
Encoding.ASCII.GetString()
とEncoding.ASCII.GetBytes()
Encoding.Unicode.GetString()
とEncoding.Unicode.GetBytes()
私はまた、以下を使用する次の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);
}
}