- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些代码:
protected TcpListener ClientListener;
protected TcpClient ClientSocket;
protected Thread th1;
public static string server_ip = string.Empty;
public static string server_port = string.Empty;
internal void start_potok()
{
Protection.Ban.ban_del();
th1 = new Thread(start_listener);
th1.IsBackground = true;
th1.Start();
}
internal void stop_potok()
{
th1.Abort();
if (ClientSocket != null)
{
ClientSocket.Close();
}
ClientListener.Stop();
}
private void start_listener()
{
try
{
ClientListener = new TcpListener(IPAddress.Parse(server_ip), Convert.ToInt32(server_port));
ClientListener.Start();
ClientSocket = default(TcpClient);
while (true)
{
ClientSocket = ClientListener.AcceptTcpClient();
client_connected(ClientSocket);
}
catch (ThreadAbortException ex)
{
//not catch this exception
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message);
}
}
private void client_connected(TcpClient client)
{
//check bans and other
LoginClientProc lcp = new LoginClientProc(client);
}
听力等级:
class LoginClientProc
{
internal EndPoint address;
internal TcpClient client;
internal NetworkStream stream;
private byte[] buffer;
internal LoginClientProc(TcpClient Client)
{
address = Client.Client.RemoteEndPoint;
client = Client;
stream = Client.GetStream();
new System.Threading.Thread(read).Start();
}
void read()
{
try
{
buffer = new byte[2];
stream.BeginRead(buffer, 0, 2, new AsyncCallback(OnReceiveCallbackStatic), null);
}
catch (Exception ex)
{
throw ex;
}
}
private void OnReceiveCallbackStatic(IAsyncResult result)
{
int rs = 0;
try
{
rs = stream.EndRead(result);
if (rs > 0)
{
short Length = BitConverter.ToInt16(buffer, 0);
buffer = new byte[Length - 2];
stream.BeginRead(buffer, 0, Length - 2, new AsyncCallback(OnReceiveCallback), result.AsyncState);
}
else
//0 = client close connection
}
catch (Exception s)
{
}
}
private void OnReceiveCallback(IAsyncResult result)
{
stream.EndRead(result);
byte[] buff = new byte[buffer.Length];
buffer.CopyTo(buff, 0);
if (!verify_packet)
{
//Exception
}
else
{
handle(buff);
new System.Threading.Thread(read).Start();
}
}
private void handle(byte[] buff)
{
byte id = buff[0];
switch (id)
{
//cases for headers packets
default:
//unknown packet
//Here need correct Close connection
break;
}
//response for packet
}
所以,我有一些问题:
感谢您的回答!
最佳答案
您可能需要使用队列。这是服务器端可能的解决方案的草图:
class Program
{
Queue<Connection> queue = new Queue<Connection>();
TcpListener listener;
ManualResetEvent reset = new ManualResetEvent(true);
static void Main(string[] args)
{
new Program().Start();
}
void Start()
{
new Thread(new ThreadStart(HandleConnection)).Start();
while (true)
{
while (queue.Any())
{
var connection = queue.Dequeue();
connection.DoStuff();
if(!connection.Finished)
queue.Enqueue(connection);
}
reset.WaitOne();
}
}
static readonly byte[] CONNECTION_REFUSED = Encoding.ASCII.GetBytes("Cannot accept a connection right now.");
static readonly int CONNECTION_REFUSED_LENGTH = CONNECTION_REFUSED.Length;
void HandleConnection()
{
listener.Start();
while (true)
{
var client = listener.AcceptTcpClient();
if (queue.Count <= 10)
{
queue.Enqueue(new Connection(client));
reset.Set();
}
else
{
client.GetStream().Write(CONNECTION_REFUSED, 0, CONNECTION_REFUSED_LENGTH);
client.Close();
}
}
}
}
public sealed class Connection
{
readonly TcpClient client;
readonly Stopwatch stopwatch = new Stopwatch();
public Connection(TcpClient client)
{
this.client = client;
stopwatch.Start();
}
public void DoStuff()
{
}
public void Abort()
{
//You can write out an abort message to the client if you like.
client.Close();
completed = true;
}
bool completed;
public bool Finished
{
get
{
return stopwatch.ElapsedMilliseconds > 30 * 1000 || completed;
}
}
}
基本思想是使用一个线程将传入连接添加到队列中,然后使用另一个线程遍历队列以处理每个连接。当连接 Finished
时,连接将从队列中删除(或者更确切地说不重新排队)。
一个健壮的解决方案可能需要使用 lock
语句或 ConcurrentQueue
类。在我的草图中,为了简洁起见,我在 TCPClient
类上使用了阻塞方法,但是,当然您会希望使用非阻塞方法。
关于c# - 限制连接的数量和时间 TcpListener。如何正确close\stop TcpListener 和TcpClient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21783422/
我有一些代码: protected TcpListener ClientListener; protected TcpClient ClientSocket; protecte
我创建了一个新表单,并在顶部做了: using System; using System.Collections.Generic; using System.ComponentModel; using
我们目前在 Windows 上运行的自行编写的服务器应用程序遇到问题(出现在不同版本上)。服务器监听 TCP 端口,接受连接,交换一些数据,然后再次关闭连接。大约有 100 个客户端不时连接。 有时服
我正在玩一个用 F# 编写的简单网络服务器。正如我所注意到的,如果我在 Firefox 中点击刷新,经过一些尝试,我会收到一个错误页面: The connection was reset The co
为了这个问题的目的,我做了一个 super 简化的例子: using System; using System.Net; using System.Net.Sockets; namespace Loo
我有一个连接到多个客户端的 TcpListener。我可以获得所有已连接客户端的列表吗? 最佳答案 当您在服务器上接受连接时,您可以将客户端放在一个列表中。 TcpListener server =
以下代码与 TcpListener 的 Rust 文档中的代码几乎相同。当代码在 Ubuntu 14.04 上运行时,它不会产生任何错误,但同时它也不起作用! (netstat -an | grep
我有一个 TcpListener,它在关闭时会导致所有进行中的客户端在尝试调用 EndAcceptTcpClient 时抛出以下异常。是否可以使用更优雅的模式来允许所有现有客户端连接在 TcpList
我在 Windows 窗体应用程序中使用 TcpListener;它有一个启动 TcpListener 的“开始”按钮。但是,当我单击开始按钮时,会抛出以下异常: The requested addr
我的窗口上有两个 Button 连接到两个 ICommands: public ICommand Start { get; set; } public ICommand Stop { get; set
我在使用 TCPListener 时遇到问题。我在下面创建了这段代码,它可以与测试应用程序一起使用,但我无法让它接收来自生产环境的连接。在下图中,您可以看到 .44 不断尝试连接,但如控制台窗口输出所
大家好:我正在尝试确保我的 TcpListener 可以正确处理来自客户端的多个请求。我正在尝试在 for 循环内调用多个 BeginSend 方法,发现 Listener 的输出在我得到的响应数量方
我关注了this tutorial设置客户端 -> 服务器基于 TCP 的 Windows 窗体应用程序,其中服务器从客户端接收文件 并且运行良好。结构总结如下: Server uses TcpLis
我有一个通过 tcpListener 进行通信的服务。问题是当用户重新启动服务时 - 抛出“地址已在使用”异常,并且服务在几分钟左右无法启动。 有什么方法可以告诉系统终止旧连接以便我可以打开一个新连接
我如何检测客户端何时与 TcpListener 断开连接? 我的每个客户都在一个单独的线程中处理。 最佳答案 看NetworkStream.Read ,或者取决于您在代码中使用的内容可能是 TCPCl
据我了解,TcpListener一旦您调用Start(),将对连接进行排队.每次调用AcceptTcpClient (或 BeginAcceptTcpClient ),它将从队列中取出一项。 如果我们
你好我想问一下使用这个有什么区别: public TcpListener Listener; public TcpClient Client; Listener = new TcpListener(D
我有一个基于 TCPListener 的 ECHO 服务器应用程序.它接受客户端,读取数据,并返回相同的数据。我使用 async/await 方法开发了它,使用 XXXAsync框架提供的方法。 我已
抱歉发了这么长的帖子。我想使用 TcpListener 来监听端口,处理不同(后台)线程中传入连接请求的繁重工作,然后在准备就绪时将响应发送回客户端。我在MSDN上阅读了大量的代码和示例,并为服务器提
我有以下代码的实例,可以在Debug中或作为独立的Windows应用程序正确执行: TcpListener tcpListener = new TcpListener(IPAddress.Any, 4
我是一名优秀的程序员,十分优秀!