我在C#中创建一个简单的TCP客户端/服务器,我遇到了问题。当我使用telnet测试我的代码时,服务器正在读取套接字并写入结果。但是当我的客户端在套接字上写一个句子时,服务器在readLine函数处阻塞。
这里有我的客户:
public Boolean initConnection(String ip)
{
try
{
this.client.Connect("127.0.0.1", 40000);
this.output = this.client.GetStream();
this.reader = new StreamReader(this.output, Encoding.UTF8);
this.writer = new StreamWriter(this.output, Encoding.UTF8);
writer.Write("one sentence");
return (true);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return (false);
}
}
在这里你有我的服务器:
class SNetwork
{
private Thread Tread;
private TcpListener server;
private TcpClient client;
private StreamReader reader;
private StreamWriter writer;
private NetworkStream output;
private State state;
public void initReading()
{
this.server = new TcpListener(IPAddress.Any, 40000);
output = client.GetStream();
reader = new StreamReader(output, Encoding.UTF8);
writer = new StreamWriter(output, Encoding.UTF8);
this.Tread = new Thread(new ThreadStart(this.read)); // this.Tread is a thread
this.Tread.Start();
}
private void read()
{
try
{
while (Thread.CurrentThread.IsAlive)
{
String result;
if (this.client.Client.Poll(10, SelectMode.SelectRead))
{
this.state = State.Closed;
break;
}
else
{
result = reader.ReadLine();
if (result != null && result.Length > 0)
Console.WriteLine(result);
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
任何人都可以帮助我PLZ?我没有找到解决方案
答案 0 :(得分:1)
此代码:
writer.Write("one sentence");
没有编写行终止符 - 因此您的服务器代码不知道您已完成该行。将其更改为WriteLine
(并刷新作者)它应该没问题。
您始终需要记住TCP / IP是基于流的协议 - 您不能指望服务器接收与您一样多Read
次呼叫的数据已发出Write
个电话,如果您要在线路终止协议,则需要确保终止线路。
(作为一个单独的问题,遵循.NET命名约定是个好主意......)