使用我的代码,我可以在服务器上读取消息并从客户端写入。但我无法从服务器写入响应并在客户端中读取。
client
var cli = new TcpClient();
cli.Connect("127.0.0.1", 6800);
string data = String.Empty;
using (var ns = cli.GetStream())
{
using (var sw = new StreamWriter(ns))
{
sw.Write("Hello");
sw.Flush();
//using (var sr = new StreamReader(ns))
//{
// data = sr.ReadToEnd();
//}
}
}
cli.Close();
server
tcpListener = new TcpListener(IPAddress.Any, port);
tcpListener.Start();
while (run)
{
var client = tcpListener.AcceptTcpClient();
string data = String.Empty;
using (var ns = client.GetStream())
{
using (var sr = new StreamReader(ns))
{
data = sr.ReadToEnd();
//using (var sw = new StreamWriter(ns))
//{
// sw.WriteLine("Hi");
// sw.Flush();
//}
}
}
client.Close();
}
如何在读取数据后让服务器回复并让客户端读取此数据?
答案 0 :(得分:3)
因为您正在使用
TcpClient client = tcpListener.AcceptTcpClient();
,您可以直接回写客户端而无需自我识别。 如果您使用Stream.Read()
或.ReadLine()
而不是.ReadToEnd()
,那么您拥有的代码将实际运作。 ReadToEnd()
将永久阻止网络流,直到流关闭。请参阅this answer至类似问题,或MSDN,
ReadToEnd假设流 知道它什么时候结束了。对于 互动协议中的 服务器只在你问的时候发送数据 因为它并没有关闭 连接,ReadToEnd可能阻止 无限期,因为它没有到达 结束了,应该避免。
如果在一侧使用ReadLine(),则需要在另一侧使用WriteLine() - 而不是Write()。另一种方法是使用一个调用Stream.Read()的循环,直到没有东西可以读取。您可以在AcceptTcpClient() documentation on MSDN中查看服务器端的完整示例。相应的客户端示例位于TcpClient documentation。
答案 1 :(得分:0)
俗气,无能为力,但在一次性一次性计划中诀窍:
但是,this is a great place to start,请查看Sockets类以进行正确的双向通信。