很抱歉,如果这很难理解,那么第一次尝试使用C#。
我正在尝试在连接到服务器的客户端之间进行简单的公共“聊天”。我已经尝试将整数传递给服务器并打印出来,一切都很好,但是,当我切换到字符串时,它似乎只能传递1个字符(因为ns.Write(converted, 0, 1);
)。如果我将ns.Write增加到ns.Write(converted,0,10)
,当我输入少于10个字符的消息时,一切都会崩溃(包括客户端和服务器)。
服务器代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
namespace MultiServeris
{
class Multiserveris
{
static void Main(string[] args)
{
TcpListener ServerSocket = new TcpListener(1000);
ServerSocket.Start();
Console.WriteLine("Server started");
while (true)
{
TcpClient clientSocket = ServerSocket.AcceptTcpClient();
handleClient client = new handleClient();
client.startClient(clientSocket);
}
}
}
public class handleClient
{
TcpClient clientSocket;
public void startClient(TcpClient inClientSocket)
{
this.clientSocket = inClientSocket;
Thread ctThread = new Thread(Chat);
ctThread.Start();
}
private void Chat()
{
byte[] buffer = new byte[10];
while (true)
{
NetworkStream ns = clientSocket.GetStream();
ns.Read(buffer,0,1);
string line = Encoding.UTF8.GetString(buffer);
Console.WriteLine(line);
}
}
}
}
客户代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
namespace Klientas
{
class Klientas
{
static void Main(string[] args)
{
while (true)
{
TcpClient clientSocket = new TcpClient("localhost", 1000);
NetworkStream ns = clientSocket.GetStream();
byte[] buffer = new byte[10];
string str = Console.ReadLine();
byte[] converted = System.Text.Encoding.UTF8.GetBytes(str);
ns.Write(converted, 0, 1);
}
}
}
}
答案 0 :(得分:9)
您最好使用BinaryReader / BinaryWriter类来正确格式化和读取数据。这消除了自己处理它的需要。例如,在客户端执行:
BinaryWriter writer = new BinaryWriter(clientSocket.GetStream());
writer.Write(str);
在服务器中:
BinaryReader reader = new BinaryReader(clientSocket.GetStream());
Console.WriteLine(reader.ReadString());
答案 1 :(得分:3)
在同一个流上使用BinaryReader或BinaryWriter,并且您拥有.NET Framework 4.5或更高版本时,请确保使用重载使基础流保持打开状态:
using (var w = new BinaryWriter(stream, Encoding.UTF8, true)) {}