如何发送"hello"发送和回复一个“你好”
本文关键字:quot 一个 你好 hello 何发送 回复 | 更新日期: 2023-09-27 17:49:31
使用我的代码,我可以在服务器上读取消息并从客户端写入。但是我不能从服务器写入响应并在客户端读取。
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()
或.ReadLine()
而不是.ReadToEnd()
,您拥有的代码将实际工作。ReadToEnd()
将永远阻塞网络流,直到流被关闭。参见对类似问题的回答,或来自MSDN,
ReadToEnd假定流知道什么时候结束。为的交互式协议服务器只在您请求时发送数据为它而不关闭连接,ReadToEnd可能会阻塞无限,因为它没有到达结束,应避免使用。
如果在一侧使用ReadLine(),则需要在另一侧使用WriteLine()而不是Write()。另一种方法是使用循环调用Stream.Read(),直到没有东西可读为止。您可以在MSDN上的AcceptTcpClient()文档中看到服务器端的完整示例。相应的客户端示例见TcpClient文档。
俗气,低效,但在一次性丢弃的程序中很有用:
- 客户端:在流中,包括它希望接收响应的端口和IP地址。
- Client:为它创建一个监听器
- 服务器:读取端口/IP信息和依次连接,然后发送回复流。
然而,这是一个很好的开始,查看Sockets类以获得正确的双向通信。