俺初步定的是:
{ type MsgRecord=packed record {加packed的作用是什么,有数据压缩功能吗?}
Messagetyp:intger; 数据类型:如1--聊天消息 ;2--其它.....
UGUID:string; 唯一标识ID
MsgSize:integer ; 消息的长度,检测是不是与MsgContent的大小一致.(可略)
MsgContent:???? 这里用什么类型好?? 要解决:大聊天内容的问题及网络传输的问题().
end;
如何用IdUDPServer接收并转换成这个数据记录格式,因为是UDP方式的,如何考虑丢包等问题呢?怎样是此记录的数据大小在网络传输中最小而发送的内容最大化??请各大虾指点迷津...
哪位哥哥有这方面的源码?贴来鉴赏鉴赏...
{ type MsgRecord=packed record {加packed的作用是什么,有数据压缩功能吗?}
Messagetyp:intger; 数据类型:如1--聊天消息 ;2--其它.....
UGUID:string; 唯一标识ID
MsgSize:integer ; 消息的长度,检测是不是与MsgContent的大小一致.(可略)
MsgContent:???? 这里用什么类型好?? 要解决:大聊天内容的问题及网络传输的问题().
end;
如何用IdUDPServer接收并转换成这个数据记录格式,因为是UDP方式的,如何考虑丢包等问题呢?怎样是此记录的数据大小在网络传输中最小而发送的内容最大化??请各大虾指点迷津...
哪位哥哥有这方面的源码?贴来鉴赏鉴赏...
解决方案 »
- 散个分,给各位助个兴
- 这个软件是Delphi做的吗,望高手指点,找到它的题库在哪???(解决马上结贴)
- [高手请入]多个QUERY查询时速度明显减慢,尤其是在98和数据量大的情况下,如何能提高速度并简化查询语句?
- 怎样实现字符串的加密与解密...
- 假如我有一个网站供用户注册,另有一个客户段软件,在软件中用什么方法验证注册?
- 极简单问题,文件拷贝的,散100分,不够再开贴
- 几个简单的问题!麻烦各位进来看看,帮助解决!关系小弟的以后路怎么走的关键问题!!!谢谢了!!!
- 谁知道delphi的发送和接送消息!(进来讨论吧!)
- 如何使用DELPHI编写陷阱程序
- 请问DELPHI的CGI问题。。。
- 如何使保存的记录的主键字段的值唯一?高手请进,常见问题
- 游戏中显示网页
type _RecvBuf = packed record
S: byte;
L0: byte;
L1: byte;
L2: byte;
end;
有人喜欢用byte,实际传输的大小是不是要精简一些?如何使用及与string int类型的转换???跪求大虾们指点啊.....
控制聊天室提交的字符数吧,很多聊天的都有限制丢包,就不知道了,
但是string类型好像是明文的呀.发的是字符的话,什么都可见.不知word 这些可不可以拿来用??困惑.
最好不要用string,用定长的字符数组array[0..99] of char
to nyf1220(我是党员--不过听说最近风声紧,打算换名字) 大虾:
主要是用包捕获软件来看,全部可见,俺观察了一下QQ和其它聊天软件,内容是不可阅读的,因此奇怪它们用的是什么数据格式.
to bobshen369(迷糊)
您的意思是加了packed,每次发的Record的长度都可能不是一样?? 用定长数组的话,假设输入的内容长度超出上限怎么办?还是应该在发之前禁止?
再次感谢~~~~~~~
可以用string[n]类型,只是长度有限制,不能超过255
至于MsgContent,由于可能传递比较大的内容,而且内容的数据类型可能不同
我常用的方法是:type
MsgRecord=packed record
Messagetyp:intger; //数据类型:如1--聊天消息 ;2--其它.....
UGUID:string[40]; //存放GUID应该够了
MsgSize:integer ; //消息的长度,包括MsgContent
MsgContent:integer; //只是用来指示MsgContent的起始地址
end;var
Pkg: ^MsgRecord;
Cnt: ^TContent; // 可以是任意类型的消息内容
begin
GetMem(Pkg, sizeof(MsgRecord)+sizeof(TContent)); //设置消息头
. . .
Pkg.MsgSize := sizeof(MsgRecord)+sizeof(TContent);
Cnt := @Pkg.MsgContent;
//给MsgContent赋值
Cnt.xxx := xxxxx;
Cnt.yyy := yyyy; //发送
Socket.Send(Pkg^, Pkg.MsgSize); //记得释放
FreeMem(Pkg);
end;
嗯,这个方法可以用来传输不同类型的数据,比如传[上下线信号,传文件等],好好好,厉害~~~~~~~~~~~~~
非常感谢,令小生茅塞顿开,拔云见日,不过那个TContent能不能给点定义范例?现在是怎末样使输入的文本比较愉快地发出去..
如何接收不同类型的Record呢?定义的结构如下:
{数据头}
type DataHead=packed record
MsgType:integer; //判断消息的类型
DataBodySize:byte; //数据段的长度
end;
{聊天内容}
type TChatMsg=packed record
Account:string; //发送者ID
TGUID:string; //标识ID
MsgContent:array [0..MAXLEN-1] of char; //消息内容
end;
{登录结构}
type LogonData=packed record
UserID:string;
PWD:string;
Reserve:string;
end;Procedure UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var Header:DataHead;
RBuff:array of byte;
thisLogonData:LogonData;
Begin
adata.ReadBuffer(_UDPHead,sizeof(_UDPHead) )
MsgType:=_UDPHead.MsgType ;
if Msgtype=0 then exit;
case MsgType of
LogonSign: //登录
begin
Adata.ReadBuffer(_thisLogonData,sizeof(_thisLogonData));
showmessage( thisLogonData.Account) //这里要出错,好像没法正确读取LogonData结构来,请大虾们帮忙解决;
end;
end;
end;
showmessage( thisLogonData.Account)
请问大虾们:String[20] 和 array[0..20] of char 有什么大的区别特点,如在网络传输中,俺用的是结构体(Record),怎么看到的都是明文啊,有什么格式能让字符内容不可读吗?多谢...