我正在使用visual studio来编写这个小型TcpServer.
这是非常具体的.服务器侦听端口1234并位于IP 127.0.0.1上.我们的老师给了我们一个程序,当您单击"连接"时,该程序尝试连接到该IP上的该端口.它适用于其他所有人,因此我必须是编码错误.
当我点击连接时,程序会在流上发送"GET"字样,我必须对所有已连接的IP地址列表进行响应,然后是仅包含a的换行符.
当我断开连接时,程序发送单词"REM",我只需要从我的列表中删除(这是一个通用列表)
我有一个类TCPServer(我们必须自己创建),它有这个作为主要代码:
this.tl = new TcpListener(IPAddress.Any, PORT); tl.Start(); while(true) { TcpClient tcl = tl.AcceptTcpClient();//here the server will wait forever untill someone connects, meaning the "new Thread" statement is never reached untill someone connects. TcpHelper th = new TcpHelper(tcl,conf); new Thread(new ThreadStart(th.Start)).Start();//should be multi-threaded, not sure if it is. //t.Start(); }
TcpHelper看起来像这样(在使用中查找注释文本"这里是问题"):
public class TcpHelper { private TcpClient tc; private IPEndPoint ipe; private string get; private Configuration conf; public TcpHelper(TcpClient tc, Configuration conf) { this.tc = tc; this.conf = conf; } public void Start() { using (NetworkStream nws = this.tc.GetStream()) { using (StreamReader sr = new StreamReader(nws)) { using (StreamWriter sw = new StreamWriter(nws)) { this.ipe = (IPEndPoint)tc.Client.RemoteEndPoint; this.conf.List.Add(this.ipe.Address); bool conn = true; while (conn) { this.get = sr.ReadLine();//here's the problem switch (this.get) { case "GET": foreach (IPAddress address in this.conf.Lijst) { sw.WriteLine(address.ToString()); } sw.WriteLine("."); break; case "REM": this.conf.List.Remove(this.ipe.Address); sw.WriteLine("OK."); conn = false; break; default: break; } } } } } } #region Properties public IPEndPoint Ipe { get { return this.ipe; } } #endregion }
Jonathan Rup.. 6
我的猜测是你的问题是你正在调用sr.ReadLine(),但是输入不包含换行符,所以它被阻塞在那里等待永远不会出现的换行符.
你可能想尝试调用StreamReader.Read 3次来构建命令字符串(GET/REM),然后再对其进行操作.(注意:3次是因为所有命令都是三个字符).
Read将返回整数,但在检查它们不是-1(表示文件结束)后,您可以将该整数转换为char.
我的猜测是你的问题是你正在调用sr.ReadLine(),但是输入不包含换行符,所以它被阻塞在那里等待永远不会出现的换行符.
你可能想尝试调用StreamReader.Read 3次来构建命令字符串(GET/REM),然后再对其进行操作.(注意:3次是因为所有命令都是三个字符).
Read将返回整数,但在检查它们不是-1(表示文件结束)后,您可以将该整数转换为char.