【发布时间】:2013-11-13 14:32:20
【问题描述】:
我正在尝试让 TCP 服务器与“多个”TCP 客户端连接。
我的项目基本上是 2 个应用程序,其设计类似于 3 层模型。在每个应用程序的数据层中,我想要一个套接字连接,因此我可以将数据(字符串值)从一个应用程序发送到另一个应用程序。由于我的逻辑层中有多种方法要通过套接字连接发送(基本上是相同的客户端),所以我的 TCP 服务器有问题 - 它只接受一个 TCP 客户端(出于某种原因我不知道) .
我需要某种循环,所以我的服务器不会关闭连接吗?
我是 TCP 编程的新手,所以我很高兴能在我的项目中得到一些帮助。
这是我的 TCP 客户端代码:
public class Tx_Data
{
const int PORT = 9000;
private TcpClient clientSocket;
public Tx_Data()
{
Console.WriteLine("Client startet");
clientSocket = new TcpClient();
clientSocket.Connect("192.168.122.169", 9000);
Console.WriteLine("Forbindelse oprettet");
}
public void sendDataTCP(string puls, string QT, string QTc)
{
NetworkStream outToServer = clientSocket.GetStream();
string line = "Puls: " + puls + ", QT: " + QT + ", QTc: "+ QTc;
LIB.writeTextTCP(outToServer, line);
outToServer.Flush();
}
}
当我在我的逻辑层方法之一中调用 sendDataTCP 方法时,它看起来像这样:
public void sendData()
{
Tx_Data tD = new Tx_Data();
string puls = beregnPuls().ToString();
string QT = beregn_QT().ToString();
string QTc = beregn_QTC().ToString();
tD.sendDataTCP(puls,QT,QTc);
}
接收数据的 TCP 服务器看起来像这样的 atm:
public class Rx_Alarm
{
const int PORT = 9000;
public Rx_Alarm()
{
TcpListener serverSocket = new TcpListener(IPAddress.Any, 9000);
TcpClient clientSocket = default(TcpClient);
serverSocket.Start();
clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine(">> Accept connection from client");
NetworkStream io = clientSocket.GetStream();
Console.WriteLine(LIB.readTextTCP(io));
}
}
【问题讨论】:
-
Rx_Alarm是“接受一个套接字并监听它”代码;那叫什么?此外,这种类型的使用要求每个套接字有一个线程,这不是很大的可扩展性 - 不过对于少量的套接字应该没问题 -
Rx_Alarm 在其中一个应用程序的主方法(现在是控制台应用程序)中被调用。
-
它被调用了多少次?一次?在一个循环?当然,即使它在一个循环中——如果
readTextTCP是一个阻塞操作(阻塞直到那个套接字关闭),那么你一次只能有一个客户端...... -
它只在我的主要方法中被调用一次。那么我是否需要某种循环来让服务器继续收听? @MarcGravell
-
经典的套接字处理循环会让你的 listener only 接受连接 - 不处理它们;它将处理卸载到一个工作线程——它可以是专用的(每个套接字线程,不可扩展),或者一个工作池,或者只是使用 IO 回调。