最近由于业务的需要,Linux系统嵌入式设备往我做的服务程序发送数据。 服务端: namespace consoleSocketServer ipAddress = IPAddress.Parse(“192.168.33.29”); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, portServer); Console.WriteLine(“服务器IP:” + ipServer + ” 端口:” + portServer); Console.WriteLine(“服务启动成功”); static void SocketListen() //接受客户端信息 //threadDoWork = new Thread(new ThreadStart(doWork)); } //获取客户端信息 //取消息 int ll = inBuffer[4] + inBuffer[5] * 255; inBufferStr = Encoding.UTF8.GetString(inBuffer, 8, ll); Console.WriteLine(inBufferStr); //回复收到 clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None); } } 客户端: namespace SocketClient clientSocket = new Socket(ipep.AddressFamily, SocketType.Stream, ProtocolType.Tcp); //将Socket连接到服务器 string outBufferStr; byte[] outBuffer = new byte[tempb.Length + 8]; //加功能和长度 for (int i = 0; i < tempb.Length; i++) // Byte[] inBuffer = new Byte[1024]; int kkk = 0; clientSocket.Send(outBuffer, outBuffer.Length, SocketFlags.None); } } |
|
1分 |
//收到的长度不够 忽略此次数据 if (rec <= 8) { continue; } 那有这么写的?长度不够也是数据啊,那能随便就不要了呢 |
协议部分实际上是包含了,功能码,长度,校验这些。现在测试很忙就把数据校验去掉了。socket做得少。不知道会不会丢包。串口会经常丢包。而且监控数据少一次没关系的。主要是根据软件的用途吧。我也希望。。。一点都不丢失 |
|
5分 |
Console.WriteLine(“服务启动成功”);
之后 要加上 Console.ReadLine(); 啊 否则程序运行完了不退出了 |
5分 |
还有,
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, portServer); 应该写成 IPEndPoint localEndPoint = new IPEndPoint(IpAddress.Any, portServer); 你指定了一个IP,只侦听这个IP来的数据 |
5分 |
还有既然是短连接,你recieve的时候要加ReadTimeOut啊
超时了赶紧进catch 否则某个客户端连接了但是不发送数据,你接收线程不永远阻塞住? 如果你想多客户端能够同时连接,要给每个子线程new一个socket对象(TCPClint)来接收不同客户端发送的数据 总之你这代码问题很多,先解决了这几个问题,再有新的问题再想办法解决吧 |
高人啊!一眼看出这么多问题。没错是无法完全退出,这其实也是一部分。因为所有的服务端已经超过500行代码太复杂了只是抽取了问题点的部分。 |
|
不用那样写,也可以接受其他IP过来的信息呀。我这个是服务端。客户端 很多,客户端都是往这个IP这个端口丢数据就好了。 |
|
超时部分,后来我加了。效果还是一样。目前解决的好像七七八八。解决的方法是在客户端处理的。 int kkk = 0; //Console.WriteLine(“服务器响应:”); 另外你说的 对象问题,也就是我头疼的问题。我用了一个字典来保存KEY IP VALUE SOCKET 对象。却发现短连接速度太快了。这个IP还在字典里面还没有进行完 DOWORK的流程 没有正常释放字典数据。又试着添加 字典已经存在的KEY 会报错。才写成目前这样。 所以关于回复给哪个IP地址的问题也还没解决。我测过3个客户端一起启动。服务端就很容易崩了。 求大神继续支招。 |
|
23分 |
1. 一个客户端起一个线程的模式只能支持少量客户端,程序没有可扩展性。
起步也得用select吧 2. 异步模式比同步模式性能要好些 3..net的SocketAsyncEventArgs足够强大了,为何不用呢 |
1分 |
至少有一个完全错误的严重问题,你的 clientSocket 应该是方法内的“局部”变量,决不能是全局共享的。否则就彻底乱了套了。
|
SocketAsyncEventArgs 在CSDN下载了一个。测试了一下,稳定性是不错。但是CPU 不忍直视啊…. I7的CPU 一个客户端不延迟的发送居然能用到百分之百。 请大神给一个简单基础的案列最好的中文的…英文还在脑补 |
|
谢谢提醒,这个问题已经回复3L了。 详细看8L |
|
后来的解决方式比较蛋疼吧。短连接改成长连接了。 因为50W的数据量 就要连接 与断开50W次 后来长连接解决这个问题。
|