【发布时间】:2012-08-10 14:59:20
【问题描述】:
嗨,我是 C# 的新手,正在做服务器和客户端,通过 tcp/ip 套接字连接共享文本文件。我使用 BinaryReader / BinaryWriter 从客户端上传到服务器,但从服务器到客户端卡住了: 从客户端到服务器:
Socket clientSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
var stream = new MemoryStream();
var writer = new BinaryWriter(stream);
writer.Write(fileName);
writer.Write(authorName);
writer.Write(fileContent);
var data = stream.ToArray(); // send this data array to server
clientSock.Connect("192.168.7.48", 9050); // targets machine ip add and port num
clientSock.Send(data);
writer.Dispose();
stream.Dispose();
clientSock.Close();
在服务器中:
public void ReadCallBack(IAsyncResult ar) {
String content = String.Empty;
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
bytesRead = handler.EndReceive(ar);
System.Diagnostics.Debug.WriteLine("Error asshole-0");
if (bytesRead > 0)
{
if (flag == 0)
{
var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);
fileName = reader.ReadString();
authorName = reader.ReadString();
fileContent = reader.ReadString();
reader.Dispose();
stream.Dispose();
flag++;
Console.Write(fileName + authorName);
Console.Write(fileContent);
}
string path = @"C:\"+fileName;
StreamWriter sw = new StreamWriter(path);
sw.Write(fileContent);
sw.Close();
sw.Dispose();
SqlCmd();
}
else
{
Invoke(new MyDelegate(LabelWrite));
}
}
stream.Dispose();
现在我尝试使用相同的方式从服务器到客户端,但出现错误
var stream = new MemoryStream(state.buffer);
var reader = new BinaryReader(stream);
stateObject 是错误的?
【问题讨论】:
-
请提供一些更具体的错误信息,例如堆栈跟踪引发的异常。
-
提供网络代码,否则我们无法为您提供帮助。
-
BinaryReader.ReadString()期望整个字符串出现在缓冲区中,并以它的长度为前缀。ReadInt32()期望存在四个字节。Socket.Receive()可以接收部分消息,因此要么不能读取整个字符串,要么 int 缺少一个或多个字节。在开始处理之前,您必须缓冲所有输入(即在Receive()调用之间存储数据)。
标签: c# sockets client-server binaryreader binarywriter