socket服务器端数据处理问题

问题描述

我只有1个客户端和我长期连接,客户端不断向服务器端发送告警信息。每一条告警数据长度不固定,以START开始,以ENDSTART结束。我是服务器端,采用LISTEN,一旦收到数据,就从缓冲区取数据,现问题如下:如何每次从缓冲区取出一条完整数据(以START开始,以ENDSTART结束。)我现在的程序每次取1024个字节,大部分告警数据都完整,但少部分数据数据不完整(例如,某次取的数据包括本次数据和下次数据的一部分),而且数据一旦不完整,就会延续几次,然后又完整了,怎么解决呢?另外,数据要进行解析,分析,呈现,入库等操作,正操作期间,客户端又发来数据,怎么办呢?多线程吗?如何做?有没有类似程序可以参考

解决方案

解决方案二:
一般来说,想开一个大小合适的buffer,就要根据传过来的数据的长度来定义.可是socket没有提供将有多少数据会收到.因此,我们可以定义一个自定义包头,如包的定义///<summary>///BYTEDESCRIPTION///0包类型///1-4包长度///5-N聊天内容,XML封装///</summary>publicclassChatPacket:PacketBase{publicChatPacket(byte[]p,intsize){packet=p;packetSize=size;}publicChatPacket(stringfrom,stringto,stringtext,stringfromnickname){stringcontent="<From>"+from+"</From><To>"+to+"</To><FromNickName>"+fromnickname+"</FromNickName><Content><![CDATA["+text+"]]></Content>";byte[]chatbytes=NetHelper.Compress(content);//处理缓冲区packetSize=heaersize+chatbytes.Length;packet=newbyte[packetSize];SetHeader(packet,PacketTypes.PT_Chat);//NetHelper.AppEncoding.GetBytes(content,0,content.Length,packet,heaersize);Buffer.BlockCopy(chatbytes,0,packet,heaersize,chatbytes.Length);}publicstringTo{get{returnNetHelper.ParseConent(Content,"//To");}}publicstringFromNickName{get{returnNetHelper.ParseConent(Content,"//FromNickName");}}publicstringChatText{get{returnNetHelper.ParseConent(Content,"//Content");}}publicoverridestringContent{get{if(_content==null){byte[]chatbytes=newbyte[ContentLength];Buffer.BlockCopy(packet,heaersize,chatbytes,0,ContentLength);_content=NetHelper.Decompress(chatbytes);}return_content;}}}如此一来的话,当我们发觉有数据包来时,我们可以分二次来收取,第一次,只收前5个字节,其中第一个字节表示包的类型,如聊天,文件请求,登录等,而1-4位,则表示后面真正的数据的长度,我用4个字节32位来表示,int型就是4字节.这样我就可以知道开多少合适的缓冲区了.下面的操作就比较简单了.
解决方案三:
请联系我。QQ:250623008
解决方案四:
正如一楼回复,对于大数据包的发送与接收,当欲发送的数据包大于定义的大小时,将其按定义的大小拆分,然后指定数据包的序号(数据包对象自定义),然后发送,在接收端接收到数据时,检测其是否是被拆分发送的数据包,如果是,则将其加入到缓存列表中,然后定义检查该列表再合成数据包.

时间: 2024-11-17 19:16:40

socket服务器端数据处理问题的相关文章

socket服务器端接收不到sokit工具客户端发送来的信息

问题描述 socket服务器端接收不到sokit工具客户端发送来的信息 try { ServerSocket serverSocket =new ServerSocket(1086); while (true) { Socket socket = serverSocket.accept(); BufferedReader bufferedReader =new BufferedReader(new InputStreamReader(socket.getInputStream())); Stri

socket服务器端处理客户端发来的数据问题

问题描述 我的程序用socket方式接收告警数据流并进行解析处理,解析和处理数据比较耗时,这时又来了数据怎么办.多线程吗?怎么多线程.我是个新手,只了解SOCKET的基本用法.而且:我现在的数据还存在下面的问题:(如果多线程,是否还要拼接不完整的数据,如何拼接呢?)每一条告警数据长度不固定,以START开始,以ENDSTART结束.我是服务器端,采用LISTEN,一旦收到数据,就从缓冲区取数据,现问题如下:如何每次从缓冲区取出一条完整数据(以START开始,以ENDSTART结束.)我现在的程序

Socket服务器端接收数据怎么只接收第一次,后面就不接收了

问题描述 各位大神,现在我做的一个winform控制系统,从测试客户端发送数据到服务器端,为什么只是第一次能够接收到数据后面就没反应了,这个问题苦恼了我很久,请帮我看一下,服务器端界面设计和代码如下所示,测试客户端是一个测试工具.usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSyste

php socket客户端及服务器端应用实例_php技巧

经常有朋友会对php的socket应用充满疑惑,本文就以实例代码作一讲解,希望能对初学php的朋友起到一点帮助作用 具体代码如下: 1.服务器端代码: <?php class SocketServer{ private $_port='9000'; private $_address='127.0.0.1'; private $_client_socket_list=array(); public function __set($name,$val){ $this--->$name=$val;

如何用PHP实现Socket服务器

想要构建聊天应用,或者甚至是游戏吗?那么,socket服务器将成为你迈出的第一步.一旦你了解了创建服务器的基本功能,那么后续的优化步骤就会变得同样简单. socket服务器的工作方式是这样的,不间断地运行以等待客户端的连接.一旦客户端连接上了,服务器就会将它添加到客户名单中,然后开始等待来自客户端的消息. 不要走开,下面是完整的源代码: // Set time limit to indefinite execution  set_time_limit (0);    // Set the ip 

Linux Socket编程获取服务器时间

客户端向服务器端发送请求,服务器收到请求做相应的处理,将处理结果传回客户端.下面采用TCP协议实现服务器和客户端之间的连接. 1. 客户端 约定双方的传输协议(UDP或者TCP),根据传输协议创建socket: 服务器的IP地址和端口号: 连接服务器: 获取服务器传递回来的数据. #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/time.h> #i

手机网游制造之数据处理篇

开发程序:疯狂的炸弹 开发进度:第三期 本期要点:设计服务器端数据处理功能 开发平台:java平台 手机网游只有客户端是玩不起来的,必须要有服务器端.开发服务器端,最核心的就是设计服务器端的数据处理功能(完整的实例程序请到http://www.shudoo.com/bzsoft下载). 在一般的服务器端程序中,服务器端程序主要包含数据存储.程序逻辑控制和网络编程等部分,数据存储和程序逻辑控制结合的比较紧密,可以统称为数据处理.为了方便网络数据的传输和整个程序的维护,程序的服务器端最好跟客户端的开

Socket 通信原理(Android客户端和服务器以TCP&amp;amp;&amp;amp;UDP方式互通)

ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当,还望指教. 一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那

Android Socket通信详解_Android

一.Socket通信简介  Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过