热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Socket编程:客户端按照对方定义的协议(包头用16进制)如何发送、接收数据?大侠请帮忙!!

服务端是Java写的,约定的通信协议如下:ushOrgMachineID(2)|ushOrgCommPort(2)|ushDestMachineID(2)|ushDestCommPor
服务端是Java写的,约定的通信协议如下:
ushOrgMachineID(2) | ushOrgCommPort(2) | ushDestMachineID(2) | ushDestCommPort | ushPacketLength | ushCheckSum | xml content
说明:
 1. 发送端主机编码|发送端通信端口号|接收端主机编码|接收端通信端口号|xml包体的长度|校验码|xml包体的内容
 2. 弧内为字节数,帧内容为文本格式,其它为16进制格式

以下是我写的客户端代码:

unit ClientMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, IdAntiFreezeBase, IdAntiFreeze,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

//这里定义了一个结构,对应于通信协议
type
   TMyPack = packed Record
      OrgID:Word;
      OrgPort:Word;
      DestID:Word;
      DestPort:Word;
      PackLen:Word;
      CheckSum:Word;
      Body:Array[0..255] of Char;
   end;

type
  TfrmClient = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    edHost: TEdit;
    edPort: TEdit;
    btnConnect: TBitBtn;
    btnDisConnect: TBitBtn;
    Label3: TLabel;
    memSend: TMemo;
    btnSend: TBitBtn;
    Memo2: TMemo;
    IdTCPClient1: TIdTCPClient;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure btnConnectClick(Sender: TObject);
    procedure btnDisConnectClick(Sender: TObject);
    procedure IdTCPClient1Connected(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
  private
    fSockConnected: Boolean;
    procedure SetSockConnected(const Value: Boolean);

    Procedure Lg(Msg:String);
    { Private declarations }
  public
    { Public declarations }
    Property SockConnected:Boolean Read fSockConnected Write SetSockConnected;
  end;

var
  frmClient: TfrmClient;

implementation

{$R *.dfm}
//这里进行一些IP、端口设置、连接到对方的代码都省略。

//发送
procedure TfrmClient.btnSendClick(Sender: TObject);
Var
   sBody:String;
   myPack:^TMyPack;
begin
   sBody := Trim(memSend.Text);
   Lg('Send To Server:'+sBody);

   New(myPack);
   myPack.OrgID := 1;
   myPack.OrgPort := 1;
   myPack.DestID := 1;
   myPack.DestPort := 1;
   myPack.PackLen := Length(sBody);
   myPack.CheckSum := 1;
   strpcopy(myPack.Body,sBody);

   Try
      IdTCPClient1.WriteBuffer(myPack,SizeOf(myPack));
   Finally
      if myPack <> nil then
      begin
         FreeMem(myPack,SizeOf(myPack));
      end;
   end;
end;

end.

现在的问题是服务端收到消息后,解析出来的数据不对。
好象我传过去的包头的内容不对,服务端只读取了ushOrgMachineID和OriginPort,其中OriginID=25292,OriginPort=206,其它的没读到。
请各位帮忙看看,分不够可以再加。

3 个解决方案

#1


没有理解,帮你顶

#2


mark

#3


en,先问一下
您的所有主机编码、端口号、校验都置1是协议规定的?
应该自己填上有意义的值吧,否则一般主机会不收的。而且您的OriginID=25292,OriginPort=206,是不是主机从socket上读到的您的主机编码和端口号,要跟您传过来的进行校验呢?

推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
author-avatar
国务二局
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有