如何将 TCPListener 设置为始终侦听以及新连接何时丢弃当前连接
How to set TCPListener to always listen and when new connection discard current
我想承认我在c#方面不是最强的,我是通过看几个教程开发这个程序的,如果你能详细回答我将不胜感激。
我希望我的 TCP 服务器始终侦听传入连接,并且当新的 TCP 客户端连接时,我希望它丢弃旧连接并使用新连接。
我已经尝试实现这个答案;
但我的问题是当我模拟一个 TCP 客户端时,但不知何故上面的答案只会收到一条消息(我当前的代码接收所有发送的消息),我也尝试转换数据所以我收到它与下面的代码相同,但没有成功。
另外我认为上面的代码只是接受新客户端,而不丢弃以前连接的客户端。
我当前的代码可以处理连接并在断开连接后搜索新连接,我想做到这一点,所以我一直在寻找新连接,如果有新客户端想要连接我' m 丢弃当前的让新的通过
public class TCPListener
{
public static void Listener()
{
TcpListener server = null;
try
{
// Set the TcpListener on carPort.
Int32 port = 5002;
// TcpListener server = new TcpListener(port);
server = new TcpListener(IPAddress.Any, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
while (true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
// Get a stream object for reading
NetworkStream stream = client.GetStream();
int i;
// Loop to receive all the data sent by the client.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
}
// Shutdown and end connection
Console.WriteLine("Client close");
client.Close();
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Stop listening for new clients.
Console.WriteLine("Stop listening for new clients.");
server.Stop();
}
}
}
编辑: 如果有人需要我的问题的解决方案,那么这就是我应用 Cecilio Pardo 建议时代码的样子,效果非常好!
public class TCPListener
{
Form form = new Form();
public static void Listener()
{
TcpListener server = null;
try
{
// Set the TcpListener on carPort.
Int32 port = 5002;
// TcpListener server = new TcpListener(port);
server = new TcpListener(IPAddress.Any, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
while (true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
data = null;
bool dataAvailable = false;
// Get a stream object for reading
NetworkStream stream = client.GetStream();
int i;
while (true)
{
if (!dataAvailable)
{
dataAvailable = stream.DataAvailable;
//Console.WriteLine("Data Available: "+dataAvailable);
if (server.Pending())
{
Console.WriteLine("found new client");
break;
}
}
if (dataAvailable)
{
// Loop to receive all the data sent by the client.
i = stream.Read(bytes, 0, bytes.Length);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
dataAvailable = false;
}
if (server.Pending())
{
Console.WriteLine("found new client");
break;
}
}
Console.WriteLine("Client close");
// Shutdown and end connection
client.Close();
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Stop listening for new clients.
Console.WriteLine("Stop listening for new clients.");
server.Stop();
}
}
}
当您处于内部 while
循环中时,您无法检查新连接。所以你必须在循环中添加这样的东西:
if ( server.Pending() ) break;
这将在另一个连接等待时立即退出循环。
另一个问题是 stream.Read
会阻塞,直到有一些数据可用,所以如果活动连接空闲,新连接将不会得到处理。所以你必须改变它,而不是调用 Read
除非有一些数据,使用 stream.DataAvailable
这就是我正在使用的,到目前为止它运行良好,我刚刚开始使用这种类型的应用程序。如果我对这段代码进行任何重大更改或发现错误,我将更新:
class ClientListener
{
const int PORT_NO = 4500;
const string SERVER_IP = "127.0.0.1";
private TcpListener listener;
public async Task Listen()
{
IPAddress localAddress = IPAddress.Parse(SERVER_IP);
listener = new TcpListener(localAddress, PORT_NO);
Console.WriteLine("Listening on: " + SERVER_IP + ":" + PORT_NO);
listener.Start();
while (true)
{
// Accept incoming connection that matches IP / Port number
// We need some form of security here later
TcpClient client = await listener.AcceptTcpClientAsync();
if (client.Connected)
{
// Get the stream of data send by the server and create a buffer of data we can read
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
// Convert the data recieved into a string
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Recieved Data: " + data);
}
}
}
public void StopListening()
{
listener.Stop();
}
}
我想承认我在c#方面不是最强的,我是通过看几个教程开发这个程序的,如果你能详细回答我将不胜感激。
我希望我的 TCP 服务器始终侦听传入连接,并且当新的 TCP 客户端连接时,我希望它丢弃旧连接并使用新连接。
我已经尝试实现这个答案;
但我的问题是当我模拟一个 TCP 客户端时,但不知何故上面的答案只会收到一条消息(我当前的代码接收所有发送的消息),我也尝试转换数据所以我收到它与下面的代码相同,但没有成功。
另外我认为上面的代码只是接受新客户端,而不丢弃以前连接的客户端。
我当前的代码可以处理连接并在断开连接后搜索新连接,我想做到这一点,所以我一直在寻找新连接,如果有新客户端想要连接我' m 丢弃当前的让新的通过
public class TCPListener
{
public static void Listener()
{
TcpListener server = null;
try
{
// Set the TcpListener on carPort.
Int32 port = 5002;
// TcpListener server = new TcpListener(port);
server = new TcpListener(IPAddress.Any, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
while (true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
// Get a stream object for reading
NetworkStream stream = client.GetStream();
int i;
// Loop to receive all the data sent by the client.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Translate data bytes to a ASCII string.
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
}
// Shutdown and end connection
Console.WriteLine("Client close");
client.Close();
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Stop listening for new clients.
Console.WriteLine("Stop listening for new clients.");
server.Stop();
}
}
}
编辑: 如果有人需要我的问题的解决方案,那么这就是我应用 Cecilio Pardo 建议时代码的样子,效果非常好!
public class TCPListener
{
Form form = new Form();
public static void Listener()
{
TcpListener server = null;
try
{
// Set the TcpListener on carPort.
Int32 port = 5002;
// TcpListener server = new TcpListener(port);
server = new TcpListener(IPAddress.Any, port);
// Start listening for client requests.
server.Start();
// Buffer for reading data
Byte[] bytes = new Byte[256];
String data = null;
// Enter the listening loop.
while (true)
{
Console.Write("Waiting for a connection... ");
// Perform a blocking call to accept requests.
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Connected!");
data = null;
bool dataAvailable = false;
// Get a stream object for reading
NetworkStream stream = client.GetStream();
int i;
while (true)
{
if (!dataAvailable)
{
dataAvailable = stream.DataAvailable;
//Console.WriteLine("Data Available: "+dataAvailable);
if (server.Pending())
{
Console.WriteLine("found new client");
break;
}
}
if (dataAvailable)
{
// Loop to receive all the data sent by the client.
i = stream.Read(bytes, 0, bytes.Length);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: {0}", data);
dataAvailable = false;
}
if (server.Pending())
{
Console.WriteLine("found new client");
break;
}
}
Console.WriteLine("Client close");
// Shutdown and end connection
client.Close();
}
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// Stop listening for new clients.
Console.WriteLine("Stop listening for new clients.");
server.Stop();
}
}
}
当您处于内部 while
循环中时,您无法检查新连接。所以你必须在循环中添加这样的东西:
if ( server.Pending() ) break;
这将在另一个连接等待时立即退出循环。
另一个问题是 stream.Read
会阻塞,直到有一些数据可用,所以如果活动连接空闲,新连接将不会得到处理。所以你必须改变它,而不是调用 Read
除非有一些数据,使用 stream.DataAvailable
这就是我正在使用的,到目前为止它运行良好,我刚刚开始使用这种类型的应用程序。如果我对这段代码进行任何重大更改或发现错误,我将更新:
class ClientListener
{
const int PORT_NO = 4500;
const string SERVER_IP = "127.0.0.1";
private TcpListener listener;
public async Task Listen()
{
IPAddress localAddress = IPAddress.Parse(SERVER_IP);
listener = new TcpListener(localAddress, PORT_NO);
Console.WriteLine("Listening on: " + SERVER_IP + ":" + PORT_NO);
listener.Start();
while (true)
{
// Accept incoming connection that matches IP / Port number
// We need some form of security here later
TcpClient client = await listener.AcceptTcpClientAsync();
if (client.Connected)
{
// Get the stream of data send by the server and create a buffer of data we can read
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
int bytesRead = stream.Read(buffer, 0, client.ReceiveBufferSize);
// Convert the data recieved into a string
string data = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Recieved Data: " + data);
}
}
}
public void StopListening()
{
listener.Stop();
}
}