我正在为我的一个学校项目做这个。我试图设计一个多线程服务器,接受客户端使用数据库(添加,删除记录等)。当我将客户端连接到服务器时,我想要接收数据库中的所有学生。如何通过tcp/ip协议发送一个包的长度
我访问服务器端的数据库,并将信息存储在ArrayList中,我试图通过网络发送它。我对XMLserializing没有任何知识,所以我试图将arrayList中的每个字符串发送到客户端。当我从服务器发送数据时,我有时会同时收到所有数据,有时候我不会,所以我的第一个猜测是我必须将我发送的数据分成一些长度的包。我不知道如何在包的开头添加长度。难道它不是一回事吗?也许我得到正确的长度,也许我没有。
这是我的代码;我没有尝试发送每个包的长度,因为我不知道如何。我尝试从服务器发送arraylist的长度,并从网络流中多次读取,但它不起作用(我在一个包中接收所有数据)。
服务器端:
private void HandleClient(object client)
{
try
{
ClientNo++;
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();
byte[] bytes = new byte[4096];
int i;
// Robot r = new Robot();
Protocol p = new Protocol();
ArrayList ListaStudentiResponse = p.ExecuteQueryOnStudents("select * from studenti");
byte[] Length = new byte[4];
Length = System.Text.Encoding.ASCII.GetBytes(ListaStudentiResponse.Count.ToString());
clientStream.Write(Length, 0, Length.Length);
foreach (String s in ListaStudentiResponse)
{
byte[] data = System.Text.Encoding.ASCII.GetBytes(s);
clientStream.Write(data, 0, data.Length);
}
tcpClient.Close();
ClientNo--;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
客户端:
private void connectToServerToolStripMenuItem_Click(object sender, EventArgs e)
{
tcpclient = new TcpClient();
NetworkStream netStream;
try
{
tcpclient.Connect("localhost", 8181);
netStream = tcpclient.GetStream();
Byte[] bytes = new Byte[10000];
int readBytes = netStream.Read(bytes, 0, bytes.Length);
int Length =Int32.Parse(Encoding.ASCII.GetString(bytes, 0, readBytes));
MessageBox.Show(Length.ToString());
int i = 0;
while (i < Length)
{
i++;
Byte[] b = new Byte[10000];
readBytes = netStream.Read(bytes, 0, bytes.Length);
String response = Encoding.ASCII.GetString(b, 0, readBytes);
MessageBox.Show(response);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
您应该匹配客户端上的缓冲区长度。即分别使用长度为4字节和10,000字节的缓冲区并记录。 – Smudge202 2011-04-19 23:20:07