使用我的代码,我可以在服务器上读取消息并从客户端写入消息。但我无法从服务器写入响应并在客户端中读取。
上的代码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();
}
如何才能让服务器端读取到数据后回复并让客户端读取到这个数据呢?
既然你正在使用
TcpClient client = tcpListener.AcceptTcpClient();
,可以直接回写给客户端,不需要它自我识别。您拥有的代码实际上可以工作如果你使用Stream.Read()
or .ReadLine()
代替.ReadToEnd()
. ReadToEnd()
将永远阻塞网络流,直到流关闭。看这个答案 https://stackoverflow.com/questions/4412686/c-how-to-send-multiline-string-over-namedpipe/4413156#4413156类似的问题,或来自MSDN http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend.aspx,
ReadToEnd 假设流
知道它什么时候结束。为了
交互协议,其中
服务器仅在您请求时才发送数据
对于它并且不关闭
连接,ReadToEnd 可能会阻塞
无限期,因为它没有达到
结束,应该避免。
如果您在一侧使用 ReadLine(),则需要在另一侧使用 WriteLine(),而不是 Write()。另一种方法是使用循环调用 Stream.Read() 直到没有任何内容可供读取。您可以在以下位置查看服务器端的完整示例MSDN 上的 AcceptTcpClient() 文档 http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient.aspx。相应的客户端示例位于TcpClient 文档 http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)