Golang 绑定mac和ip地址,限制服务器

Golang 绑定mac和ip地址,限制服务器,第1张

namespace SocketTest{ class Program { public static void SendMessage() { Socket socket = serverSocketAccept(); ConsoleWriteLine("Connected a client:{0}",socketRemoteEndPoint); socketSend(EncodingASCIIGetBytes("welcome to server")); //Thread thread = new Thread(ReceiveMessage); // threadStart(); } public static void ReceiveMessage(object obj) { Socket socket = (Socket)obj; byte[] data = new byte[1024]; int len = socketReceive(data); string dataString = EncodingASCIIGetString(data, 0, len); ConsoleWriteLine("Receive Data:{0} from {1}", dataString,socketRemoteEndPoint); //Thread thread = new Thread(SendMessage); //threadStart(socket); } static Socket serverSocket; static void Main(string[] args) { //定义接收数据长度变量 int recv; //定义接收数据的缓存 byte[] data = new byte[1024]; //定义侦听端口 IPEndPoint ipEnd = new IPEndPoint(IPAddressAny, 5566); //定义套接字类型 serverSocket = new Socket(AddressFamilyInterNetwork, SocketTypeStream, ProtocolTypeTcp); //连接 serverSocketBind(ipEnd); //开始侦听 serverSocketListen(10); //控制台输出侦听状态 ConsoleWrite("Waiting for a client"); //Socket client; while (true) { //一旦接受连接,创建一个客户端 Socket client = serverSocketAccept(); //获取客户端的IP和端口 IPEndPoint ipEndClient = (IPEndPoint)clientRemoteEndPoint; //输出客户端的IP和端口 ConsoleWriteLine("Connect with {0} at port {1}", ipEndClientAddress, ipEndClientPort); //定义待发送字符 string welcome = "Welcome to my server"; //数据类型转换 data = EncodingASCIIGetBytes(welcome); while (true) { try { //发送 clientSend(data, dataLength, SocketFlagsNone); //接收数据可以用线程也可以不用 //ReceiveMessage(client); Thread thread = new Thread(ReceiveMessage); threadStart(client); ////对data清零 //data = new byte[1024]; ////获取收到的数据的长度 //recv = clientReceive(data); ////如果收到的数据长度为0,则退出 //if (recv == 0) // break; ////输出接收到的数据 //ConsoleWriteLine(EncodingASCIIGetString(data, 0, recv)); //将接收到的数据再发送出去 // clientSend(data, recv, SocketFlagsNone); } catch (Exception) { clientClose(); serverSocketClose(); } } clientClose(); } //ConsoleWriteLine("Disconnect form{0}", ipEndClientAddress); serverSocketClose(); } }}

网站访问量比较小,但是有个问题一直困扰着我们,就是was服务器隔一段时间就报线程挂起,时间有长有短,短的重启5分钟内就报。
一般情况是:
1开应用服务器——用户下载——报线程挂起——下载量下降——报线程N长时间没活动,超过was设置的阀值,释放掉。
2开应用服务器——用户下载——报线程挂起——下载量继续或者上升,挂起线程越来越多——was自动调整线程阀值——调不过来,挂。
经过查找,基本确定问题:是因为用户在用浏览器下载文件时,网络瞬断或其他原因,导致抛出异常,但是下载的线程并未释放。可打开浏览器下载,下到一半直接关掉浏览器来模拟这个现象。
byte[] b = new byte[1024];

while ((len = inread(b)) != -1) {
outwrite(b, 0, len);
}

登录后复制
修改为
byte[] b = new byte[1024];

while ((len = inread(b)) != -1) {
Threadsleep(50);
Threadyield();
outwrite(b, 0, len);
}

登录后复制
一些人建议的方法是,在服务器端给线程做个时间限制,超过时间的就关掉;但是这样做,较低网速下载大文件的用户,又会受到影响。因此用上面的做法是:线程处理一段时间,停一会,让出CPU控制权,不至于造成堵塞。
这个方法可能不是最好的,但是至少是比较合适的,现在服务器上线程挂起的现象已经大大减少,并且额外加了一句
if (requestgetHeader("Range") != null) {
ErrShow(request, response, "不支持多线程!");
return;
}
登录后复制
这样避免掉用下载工具的多线程下载。
哪位有更优解,请提出来,一起讨论一下。
刚才看到用守护线程来处理超时线程的解决方案,但另外一个技术主管极力反对,哪位能解释一下,为什么不可用?守护线程在什么情况下可用?谢谢


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/13443026.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-08-07
下一篇 2023-08-07

发表评论

登录后才能评论

评论列表(0条)

保存