- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基本的 TCP 客户端和服务器,它们都在我的机器上本地运行。
如果当我调用 ConnectAsync() 时服务器已经在监听,那么客户端连接到服务器,没问题。
如果我启动客户端并调用 ConnectAsync(),那么在监听客户端之后启动服务器,它不会建立连接。 ConnectAsync 挂起约 85 秒,然后出现以下错误:System.Net.Sockets.SocketException (0x80004005): Connection denied。尽管服务器已经开始监听这一事实。
不确定这是否会影响 TcpClient,但客户端正在 Xamarin 项目中运行。
这是我的代码:
客户:
public static class DataSource
{
private static TcpClient client;
private static NetworkStream networkStream;
public static bool Connected => client is null ? false : client.Connected;
public static async Task EstablishTcpConnection(string serverIP, int port)
{
CloseTcpConnection();
try
{
client = new TcpClient();
await client.ConnectAsync(IPAddress.Parse(serverIP), port);
networkStream = client.GetStream();
}
catch (Exception ex)
{
Console.WriteLine($"{nameof(EstablishTcpConnection)} Error: {ex}");
}
}
public static void CloseTcpConnection()
{
if (networkStream != null)
{
networkStream.Close();
networkStream.Dispose();
networkStream = null;
}
if (client != null)
{
client.Close();
client.Dispose();
client = null;
}
}
public static async Task SendTcp(string toSend)
{
if (client is null) return;
if (networkStream is null) return;
if (!Connected) return;
if (networkStream != null && networkStream.CanWrite)
{
byte[] bytesToSend = ASCIIEncoding.ASCII.GetBytes(toSend);
await networkStream.WriteAsync(bytesToSend, 0, bytesToSend.Length);
}
}
public static async Task TcpListener()
{
while (networkStream != null && networkStream.CanRead)
{
if (client is null) return;
if (networkStream is null) return;
if (!Connected) return;
byte[] bytesToRead = new byte[client.ReceiveBufferSize];
int bytesRead = await networkStream.ReadAsync(bytesToRead, 0, client.ReceiveBufferSize);
string received = Encoding.ASCII.GetString(bytesToRead, 0, bytesRead);
Console.WriteLine($"Received: {received}");
}
}
}
internal class Program
{
private const string serverIP = "MyServerIp";
private const int port = myPort;
private static void Main(string[] args)
{
Listener();
Console.ReadLine();
}
public static async Task Listener()
{
//---listen at the specified IP and port no.---
TcpListener listener = new TcpListener(IPAddress.Parse(serverIP), port);
listener.Start();
Console.WriteLine("Listening...");
while (true)
{
//---incoming client connected---
ReceiveClient(await listener.AcceptTcpClientAsync());
}
}
public static async Task ReceiveClient(TcpClient client)
{
if (client is null) return;
Console.WriteLine("Client Connected");
//---get the incoming data through a network stream---
NetworkStream networkStream = client.GetStream();
byte[] buffer = new byte[client.ReceiveBufferSize];
while (client != null && client.Connected)
{
//---read incoming stream---
int bytesRead = await networkStream.ReadAsync(buffer, 0, client.ReceiveBufferSize);
if (bytesRead == 0) break;
//---convert the data received into a string---
string dataReceived = Encoding.ASCII.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received : " + dataReceived);
//---write back the text to the client---
Console.WriteLine("Sending back : " + dataReceived);
networkStream.Write(buffer, 0, bytesRead);
}
client.Close();
client.Dispose();
Console.WriteLine("Client Disconnected");
}
}
最佳答案
Surely ConnectAsync() should still work, even if the server starts listening after and is within the timeout?
关于c# - TcpClient 仅在服务器在调用 ConnectAsync 之前开始监听时才连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60673614/
对于基于.net40的基础项目,而sokcet连接使用“socket.ConnectAsync”,现在,该项目需要遍历.net35。此连接方法在35上不支持。是否有其他软件包支持此连接?还是需要基于.
有什么方法可以获取 TcpClient 异步连接的状态?使用以下代码,如何使用 Connected 属性获取客户端的状态?我尝试异步建立远程连接,但同时不要等待超过 5 秒 ... TcpClient
我有一个基本的 TCP 客户端和服务器,它们都在我的机器上本地运行。 如果当我调用 ConnectAsync() 时服务器已经在监听,那么客户端连接到服务器,没问题。 如果我启动客户端并调用 Conn
.NET 中的 HTTP 代理支持实际上并不支持 TcpClient 或 Socket 等较低级别的类。但我想通过支持“CONNECT”命令的 HTTP 代理连接 TCPServer(ip、端口)。
我希望得到一些关于为我正在处理的工作增加弹性的意见,该工作涉及异步创建多个 TcpClient 连接到各种服务器,一旦成功建立 TCP 连接,然后存储TcpClient 是一个集合(只是需求的摘录)
我一直在阅读有关如何检查 LAN 上特定端口上的所有监听服务器的信息,最后我编写了一些代码,它可以按我的需要工作。 我正在使用 System.Threading.Tasks.Parallel 尽可能快
我有一个简单的 WinRT 应用程序,它将通过 TCP 与远程服务器通信。 为了做到这一点,我正在创建新的 StreamSocket 对象,并在单击适当的按钮后连接到远程服务器,如下所示: priva
BeginConnect 和 ConnectAsync 有什么区别?随后,BeginDisconnect 和 DisconnectAsync 有什么区别? ConnectAsync文档状态: "Beg
我正在使用 .NET 4.5 构建一个 SOCKS 代理检查器,一切正常,除非其中一个 SOCKS 代理非常慢并且需要 100 多秒才能响应。我想在几个阶段(ConnectAsync、ReadToEn
在 Windows Phone 8.1 应用程序中,我必须按如下方式创建套接字。我如何更改它,以便它在我可以指定的时间段后超时? _socket = new StreamSocket(); await
我正在为 WP7 构建一个应用程序。我正在努力建立 TCP 连接 代码 namespace TCP { public class SocketEventArgsExtension : Socke
我在 Unity 中使用 DotNetty,并具有以下客户端 Bootstrap ,当服务器关闭时,“clientBootstrap.ConnectAsync()”将在 17 秒左右放弃尝试建立连接,
到目前为止我找到的所有解决方案都基于 WaitOne: How to configure socket connect timeout或 spawning a worker thread 对我来说,用
至少可以说,Windows 商店应用程序令人沮丧;与常规 .net 足够接近就会惹上麻烦。 我在使用 Tasks、await 和 Socket.ConnectAsync 时遇到的问题。 我有以下代码:
TcpClient.ConnectAsync是一个任务,它不能很容易地与 F# 异步工作流一起工作。 我想我在这里遗漏了一些非常简单的东西——是否有一种通用的方法来使用工作流中的 Async 或 Be
问题:虽然不使用 VPN,但下面的代码可以正常工作。一旦我通过 VPN 连接到我的家庭网络,代码就会抛出异常(翻译自德语): 连接尝试失败,因为连接方在一定时间后没有正确响应,或者建立的连接失败,因为
我正在开发一个将连接到我的服务器的 Windows Phone 应用程序。它通过在您按下登录按钮时使用 ConnectAsync 来实现。但是如果服务器宕机了,你想取消连接尝试,怎么办? 这是我最近尝
我正在开发必须在蓝牙打印机上打印的 Windows Phone 8.1 商店应用程序 (XAML)。 使用前两种方法成功找到设备: PeerFinder.AllowBluetooth = True
我是一名优秀的程序员,十分优秀!