socket监听久了cpu太高

m0_37748860 2018-07-25 02:24:53
服务器端socket服务一共有3个线程
1.监听接收消息
2.接收图片
3.向客户端发送图片
cpu几十分钟就飙到90多。求大佬给个解决方案。

...全文
638 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_37748860 2018-08-10
  • 打赏
  • 举报
回复
引用 10 楼 wangjun8868 的回复:
看这个文件 用异步
https://www.cnblogs.com/qc-id-01/p/7520633.html

或者用第三方组件,比如HP-SOCKET ,用起来很简单!

异步解决了,tks。
编程有钱人了 2018-07-27
  • 打赏
  • 举报
回复
像传输文件这种工作,如果是业务量大,完全不建议用TCP!除非使用情况比较少,文件小等
编程有钱人了 2018-07-27
  • 打赏
  • 举报
回复
看这个文件 用异步
https://www.cnblogs.com/qc-id-01/p/7520633.html

或者用第三方组件,比如HP-SOCKET ,用起来很简单!
编程有钱人了 2018-07-27
  • 打赏
  • 举报
回复
while 写线程

client_Thread = new Thread(ReceiveData);
client_Thread.Start(connection);

不合适,因为每次收到消息都开启一个线程!切线程里面有嵌套了线程,极其不合理,
像你这杨的业务,需要用异步,不用线程!


m0_37748860 2018-07-26
  • 打赏
  • 举报
回复
//第三个,发送图片

private void SendImg()
{

while (true)
{
string path=Application.StartupPath + "\\订单\\";
DirectoryInfo TheFolder = new DirectoryInfo(path);
foreach (FileInfo NextFile in TheFolder.GetFiles())
{
string[] split_msg_order = NextFile.Name.Split('-');
string orderno=split_msg_order[1];
string[] splitMSG = split_msg_order[0].Split(',');
string ToUsername=splitMSG[3];
for (int i = 0; i < userList.Count; i++)
{
if (userList[i].username == ToUsername)
{
// 给在线的其他用户发送广播消息
// 通知有新用户加入
SendtoClient(null, userList[i], split_msg_order[0]);
IPAddress IMGIP = IPAddress.Parse(userList[i].ImgIPEndPoint.Split(':')[0]);
int port = int.Parse(userList[i].ImgIPEndPoint.Split(':')[1]);
IPEndPoint imgip = new IPEndPoint(IMGIP,port);
SendFile(imgip, NextFile.FullName);
File.Delete(NextFile.FullName);
}
}
}
Thread.Sleep(30000);
}

}
m0_37748860 2018-07-26
  • 打赏
  • 举报
回复
引用 6 楼 wangjun8868 的回复:
肯定代码有问题,贴代码给你解决!

代码写的不好将就看吧,解决问题。

void Start()
{
//第一个,收发消息
server_Thread = new Thread(ServerStart);
server_Thread.Start();

//第二个,接收图片
InitIMG();

//第三个,发送图片
threadSendIMG = new Thread(SendImg);
threadSendIMG.Start();
}


//第一个,收发消息
 private void ServerStart()
{
Socket connection = null;
// Socket socketWatch = o as Socket;
while (true)
{
try
{
//接受Andorid信息
connection = server_Socket.Accept();


}
catch (Exception ex)
{
// MessageBox.Show("start error: " + ex.Message);
return;
}
clientep = (IPEndPoint)connection.RemoteEndPoint;
string str = string.Format("connectsuccess,{0},{1}", "", clientep.Address + ":" + clientep.Port);
byte[] data = new byte[1024];
data = Encoding.UTF8.GetBytes(str);
connection.Send(data, data.Length, SocketFlags.None);

client_Thread = new Thread(ReceiveData);
client_Thread.Start(connection);
}
}
private void ReceiveData(object o)
{
Socket socketSend = o as Socket;
Byte[] buffer;
while (true)
{
string message = null;
//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度
try
{
buffer = new Byte[1024];
int length = socketSend.Receive(buffer);
if (length <= 0)
{
string outname = "";
for (int i = 0; i < userList.Count; i++)
{
if (userList[i].usersocket == socketSend)
{

outname = userList[i].username;
userList.RemoveAt(i);
UpdateDGV(userList);
}
}
for (int i = 0; i < userList.Count; i++)
{
string outline = string.Format("logout,{0},{1}", outname, "");
SendtoClient(socketSend, userList[i], outline);
}
socketSend = null;
return;
}
//将机器接受到的字节数组转换为人可以读懂的字符串
message = Encoding.UTF8.GetString(buffer, 0, length);
UpdateTxt(message);

}
catch (Exception ex)
{

}

clientep = (IPEndPoint)socketSend.RemoteEndPoint;

try
{
string[] splitstring = message.Split(',');
IPEndPoint clientIPEndPoint = clientep;
switch (splitstring[0])
{
// 如果是登录信息,向客户端发送应答消息和广播有新用户登录消息
case "login":
User user = new User(splitstring[1], clientIPEndPoint, socketSend, splitstring[3]);
string userItem = user.username + "," + user.userIPEndPoint;
// 往在线的用户列表添加新成员
bool usercontain = false;
int index = 0;
foreach (var l in userList)
{
if (l.username.Equals(user.username))
{
usercontain = true;
index = userList.FindIndex(item => item.Equals(l));
}

}
if (!usercontain)
{

userList.Add(user);
// AddItemToListView(userItem);
UpdateDGV(userList);
}
else
{

}

Thread sendThread = new Thread(SendData);
sendThread.Start(socketSend);
sendThread.Join();
for (int i = 0; i < userList.Count; i++)
{
if (userList[i].username != user.username)
{
SendtoClient(socketSend, userList[i], message);
}
}


break;
case "logout":
for (int i = 0; i < userList.Count; i++)
{
if (userList[i].username == splitstring[1])
{

userList.RemoveAt(i);
UpdateDGV(userList);
}
}
for (int i = 0; i < userList.Count; i++)
{
SendtoClient(socketSend, userList[i], message);
}

break;
case "talk":
string tousername = splitstring[3];
for (int i = 0; i < userList.Count; i++)
{
if (userList[i].username == tousername)
{

SendtoClient(socketSend, userList[i], message);
}
}

break;
}
}
catch
{ }


}
}


//第二个,接收图片
  public void InitIMG()
{

serverIMGSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint SelfImgIPEndPoint = new IPEndPoint(Dns.GetHostAddresses("")[2], 8888);
serverIMGSocket.Bind(SelfImgIPEndPoint); //绑定IP地址:端口
serverIMGSocket.Listen(20); //设定最多10个排队连接请求
Console.WriteLine("启动监听{0}成功", serverIMGSocket.LocalEndPoint.ToString());
Thread myThread = new Thread(ListenIMGConnect);
myThread.Start();
}

private void ListenIMGConnect()
{
while (true)
{

try
{
Socket clientSocket = serverIMGSocket.Accept();
Thread receiveThread = new Thread(RECVIMG);
receiveThread.Start(clientSocket);
}
catch
{
break;
}

}
}
public static void RECVIMG(object clientSocket)
{
Socket client = clientSocket as Socket;
//获得客户端节点对象
IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;
//获得[文件名]
string SendFileName = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
//获得[包的大小]
string bagSize = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
//获得[包的总数量]
byte[] dd = TransferFiles.ReceiveVarData(client);
string ss = System.Text.Encoding.UTF8.GetString(dd);
int bagCount = int.Parse(ss);

//获得[最后一个包的大小]
string bagLast = System.Text.Encoding.UTF8.GetString(TransferFiles.ReceiveVarData(client));
string fullPath = Path.Combine(Application.StartupPath + "\\订单\\", SendFileName);
if (File.Exists(fullPath))
return;
//创建一个新文件
FileStream MyFileStream = new FileStream(fullPath, FileMode.Create, FileAccess.Write);
//已发送包的个数
int SendedCount = 0;
while (true)
{
byte[] data = TransferFiles.ReceiveVarData(client);
if (data.Length == 0)
{
break;
}
else
{
SendedCount++;
//将接收到的数据包写入到文件流对象
MyFileStream.Write(data, 0, data.Length);
//显示已发送包的个数

}
}
//关闭文件流
MyFileStream.Close();
//关闭套接字
client.Close();

}

放不下了,下面第三个

编程有钱人了 2018-07-26
  • 打赏
  • 举报
回复
肯定代码有问题,贴代码给你解决!
  • 打赏
  • 举报
回复
什么叫做“一共有3个线程”呢?


异步、事件驱动的程序,当没有消息到来时不会占用任何线程,十几万客户端跟服务器联系可能也不过有十几个、二十几个线程在瞬间工作几十毫秒,然后就结束了。哪有什么阻塞着的线程在那里?
xuzuning 2018-07-25
  • 打赏
  • 举报
回复
你都不说你是怎么写的,如何能有正确解法?
m0_37748860 2018-07-25
  • 打赏
  • 举报
回复
引用 1 楼 twotuli_software 的回复:
解决方案是重写。

重写应该是什么思路?
维秀斯丢丢 2018-07-25
  • 打赏
  • 举报
回复
解决方案是重写。
cheng2005 2018-07-25
  • 打赏
  • 举报
回复
找个真正有水平的开发人员重写你说的这些内容是最简单可靠的解决方案。
内容概要:本文围绕基于CNN-BiLSTM-Attention混合神经网络模型的电力负荷预测展开研究,提出一种结合卷积神经网络(CNN)、双向长短期记忆网络(BiLSTM)与注意力机制(Attention)的深度学习框架,并通过Python代码实现高精度的短期与超短期负荷预测。该模型充分利用CNN对局部特征的提取能力,捕捉负荷数据中的周期性与趋势性模式;借助BiLSTM对时间序列前后向依赖关系的建模能力,增强对动态变化的感知;并通过Attention机制自适应地聚焦关键历史时刻,提升预测准确性。文中详细阐述了数据预处理、模型结构设计、训练流程及超参数调优方法,并在真实负荷数据集上进行了实验验证,结果表明该混合模型相比传统单一模型和其他基准模型具有更优的预测性能,尤其在应对非线性、非平稳负荷波动方面表现突出。; 适合人群:具备一定Python编程能力和机器学习基础,从事电力系统分析、能源管理、智能电网或时序预测相关工作的科研人员、工程师及高校研究生。; 使用场景及目标:①应用于电网调度、电力市场出清、需求响应管理等场景下的精细化负荷预测;②为研究人员提供一套完整的、可复现的深度学习负荷预测代码框架,推动AI技术在能源领域的落地应用;③帮助理解CNN、BiLSTM与Attention模块之间的协同机制及其在时序建模中的集成方式。; 阅读建议:建议读者结合所提供的Python代码进行动手实践,重点掌握数据归一化、滑动窗口构造、模型搭建与训练技巧,并尝试在不同地区、不同季节的负荷数据上进行迁移测试,以深入理解模型泛化能力与调参策略。
内容概要:本文围绕“MATLAB具有储能的经济调度及机会约束和鲁棒优化”展开,系统研究了电力系统中融合储能技术的经济调度问题,重点探讨了机会约束规划与鲁棒优化方法在应对新能源出力不确定性、负荷波动及系统运行风险中的应用。内容涵盖风光储协同调度、多微网共享储能、电动汽车参与调度、低碳经济调度等多种典型场景,深入分析了储能的选址定容、功率协调控制、状态估计与优化调度模型。核心技术包括粒子群优化(PSO)、分布鲁棒机会约束(DRCC)、模型预测控制(MPC)、鲁棒优化、二阶锥规划(SOCP)等先进算法,并提供了基于Matlab/Simulink的完整仿真代码实现,旨在提升新型电力系统的运行灵活性、经济性与抗风险能力。; 适合人群:具备电力系统、自动化、电气工程或相关专业背景,熟悉Matlab/Simulink仿真环境与基本优化算法,从事新能源并网、微电网运行、储能系统规划、电力市场调度等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:① 学习并构建含储能的电力系统经济调度优化模型;② 掌握机会约束与鲁棒优化在处理新能源不确定性问题中的建模思路与求解方法;③ 利用提供的Matlab代码进行算法复现、仿真验证与性能对比,支撑科研项目攻关;④ 为撰写高水平学术论文、学位论文或工程优化方案提供可靠的模型参考与代码支持。; 阅读建议:建议读者结合文档中具体的案例(如风电-水电联合调度、电动汽车集群调度、多微网共享储能等)和配套的Matlab代码进行动手实践,重点关注优化模型的构建逻辑、约束条件设定与求解器配置过程,同时可关注公众号“荔枝科研社”获取完整资源包、复现教程及持续的技术支持。

111,128

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧