Java和C++的socket通信时如何传送结构体
delphi中Socket程序发送PChar类型结构体的问题

delphi中Socket程序发送PChar类型结构体的问题delphi中Socket程序发送PChar类型结构体的有趣问题10-25 [:(] 我想通过Socket在局域网传输数据,而且这个数据可能是命令可能是字符串或者其他类型数据,所以我定义了一个如下记录类型:TSocketMessage = recordMsg: string[255];end;(其他数据域暂时忽略不谈,反正我觉得数据和命令同时传输时用记录类型方便一些)然后在客户端把要传输的字符串装到这个记录里面,用ClientSocket1.Socket.SendBuf方法发出去,然后在服务器端用ServerSocket1.Socket.ReceiveBuf方法接收这个记录,并将记录里的字符串显示出来一切正常,以下程序能正确传输信息。
问题来了,因为我传输的数据量可能很大,所以记录域Msg string[255]太小了,所以我改类型为string或者PChar类型,结果出现什么都发不过来或者是乱码的问题,请问为什么?以下是程序源码,unit1是服务器端,unit2是客户端,unit3是公共单元大家需要将'192.168.100.148'这个改成自己机器的IP地址。
unit1程序窗口上放了ServerSocket1,Button1,memo1unit2程序窗口上放了ClientSocket1,edit1,button1,button2,button3--------------------------------unit Unit3;interfacetypeTSocketMessage = recordMsg: string[255]; //我想把此行改成Msg: PChar;结果什么消息都不能发送了end;implementationend.--------------------------unit Unit1;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ScktComp, StdCtrls;TForm1 = class(TForm)ServerSocket1: TServerSocket;Memo1: TMemo;Button1: TButton;procedure ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementationuses Unit3;{$R *.DFM}procedure TForm1.ServerSocket1ClientRead(Sender: TObject; Socket: TCustomWinSocket);varpack: TSocketMessage;beginSocket.ReceiveBuf(Pack, SizeOf(Pack));memo1.lines.add( Pack.Msg );end;procedure TForm1.Button1Click(Sender: TObject);beginServerSocket1.Port:= 8090;ServerSocket1.Open;end;end.------------------------------unit Unit2;interfaceWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp;typeTForm2 = class(TForm)ClientSocket1: TClientSocket;Button1: TButton;Edit1: TEdit;Button2: TButton;Button3: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);procedure Button3Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm2: TForm2;implementationuses Unit3;{$R *.DFM}procedure TForm2.Button1Click(Sender: TObject);beginClientSocket1.Port:= 8090;ClientSocket1.Address:= '192.168.100.148';ClientSocket1.Active:= true;end;procedure TForm2.Button2Click(Sender: TObject);varpack: TSocketMessage;beginpack.Msg := Edit1.Text; //此行改成pack.Msg := PChar(Edit1.Text); ClientSocket1.Socket.SendBuf(Pack, SizeOf(Pack));end;procedure TForm2.Button3Click(Sender: TObject);beginif ClientSocket1.Active thenShowMessage('true')elseShowMessage('False');end;end.1:用string或pchar的话,是不是SizeOf(Pack)会有问题随便说说,主要是听课!2:procedure TForm1.ServerSocket1ClientRead(Sender: TObject;Socket: TCustomWinSocket);varS: string;beginSocket.ReceiveText(S);memo1.lines.add(S);end;procedure TForm2.Button2Click(Sender: TObject);varpack: TSocketMessage;beginpack.Msg := PChar(Edit1.Text);ClientSocket1.Socket.SendBuf(Pack.Msg^, StrLen(Pack.Msg));end;string[0..Len]已经是静态分配内存了,而string or PChar,则无,所以sizeof(s) // s[0..len]是求出长度sizeof(s) // s: string or PChar,则永远=43:像Char, Byte, Word, Integer, DWORD以及静态分配的数组,为堆分配的内存,也就是一定义,就已经确定了它的内存范围,而string, PChar, Pointer, array of TDataType则不是,是需要在运行时刻,通过函数取得。
c语言中结构体变量的传递方式

c语言中结构体变量的传递方式
在C语言中,结构体是一种自定义的数据类型,它可以包含多个不同类型的成员变量。
在程序中,我们可能需要将结构体变量作为参数传递给函数进行处理。
那么,在C语言中,结构体变量的传递方式有哪些呢?
1. 值传递:将结构体变量作为函数参数传递时,实际上是将结
构体的值复制一份传递给函数。
这样,在函数内部对结构体成员变量进行修改不会影响原来的结构体变量。
这种方式适用于结构体较小的情况。
2. 指针传递:将结构体变量的地址作为参数传递给函数,可以
在函数内部直接操作原结构体变量。
这种方式适用于结构体较大的情况,避免复制大量的数据,提高程序的效率。
3. 引用传递:在C++中可以使用引用传递,但在C语言中没有
直接的引用类型。
可以通过指针实现引用传递,即将结构体变量的地址取出来,传递给指向结构体变量指针的指针,这样就可以在函数内部直接操作原结构体变量。
总的来说,结构体变量的传递方式有值传递、指针传递和引用传递。
根据实际情况选择不同的传递方式可以提高程序的效率和可读性。
- 1 -。
socket传输文件的原理

socket传输文件的原理
文件传输是计算机网络中的一项基本功能,它允许在网络上的不同计算机之间共享和传输文件。
Socket是实现文件传输的一种常用方式,其原理如下:
1. 建立连接:在进行文件传输之前,需要在发送方和接收方之间建立连接。
这通常通过TCP/IP 协议实现,使用Socket进行连接的建立。
一旦连接建立成功,发送方和接收方就可以通过该连接进行数据传输。
2. 文件分割:由于文件通常较大,不适合一次性传输,因此需要将文件分割成较小的数据块。
这些数据块可以按照一定的顺序进行编号,以便于接收方重新组合成完整的文件。
3. 发送数据:发送方通过Socket将分割好的数据块逐个发送给接收方。
在发送数据时,需要按照一定的协议进行数据的封装,例如添加文件名、数据块大小等信息。
4. 接收数据:接收方通过Socket接收到数据后,需要按照发送方的协议对数据进行解析和处理。
接收方会将收到的数据块进行缓存,以便后续重新组合成完整的文件。
5. 确认机制:为了确保文件传输的完整性和正确性,发送方和接收方之间需要建立一种确认机制。
例如,发送方可以发送一个数据包的编号给接收方,接收方在收到数据包后回复一个确认信号给发送方,表示该数据包已经成功接收。
如果发送方在一定时间内没有收到确认信号,则会重新发送数据包,以确保数据的可靠传输。
6. 关闭连接:当文件传输完成后,发送方和接收方之间的连接会被关闭。
这可以通过Socket 的关闭函数实现,释放网络资源。
通过以上步骤,使用Socket可以实现文件的传输。
在实际应用中,不同的文件传输协议可能会有一些差异,但基本原理是相同的。
socket 通信过程及流程

页眉内容socket 通信过程及流程下图是基于 TCP 协议的客户端/服务器程序的一般流程:服务器调用 socket()、bind()、listen()完成初始化后,调用 accept()阻塞等待,处于监听端口的状态, 客户端调用 socket()初始化后,调用 connect()发出 SYN 段并阻塞等待服务器应答,服务器应答一个 SYN-ACK 段,客户端收到后从 connect()返回,同时应答一个 ACK 段,服务器收到后从 accept()返 回。
数据传输的过程: 建立连接后,TCP 协议提供全双工的通信服务,但是一般的客户端/服务器程序的流程是由客户端主 动发起请求, 服务器被动处理请求, 一问一答的方式。
因此, 服务器从 accept()返回后立刻调用 read(), 读 socket 就像读管道一样,如果没有数据到达就阻塞等待,这时客户端调用 write()发送请求给服务 器,服务器收到后从 read()返回,对客户端的请求进行处理,在此期间客户端调用 read()阻塞等待服页脚内容。
点 特 布 分 有 具 成 组 砂 、 粘 和 饱 由 要 主 土 的 所 内 围 范 度 深 层 力 持 至 表 自 地 场 本 , 露 揭 告 报 察 勘 程 工 据 根页眉内容务器的应答,服务器调用 write()将处理结果发回给客户端,再次调用 read()阻塞等待下一条请求,客 户端收到后从 read()返回,发送下一条请求,如此循环下去。
如果客户端没有更多的请求了,就调用 close()关闭连接,就像写端关闭的管道一样,服务器的 read() 返回 0,这样服务器就知道客户端关闭了连接,也调用 close()关闭连接。
注意,任何一方调用 close() 后,连接的两个传输方向都关闭,不能再发送数据了。
如果一方调用 shutdown()则连接处于半关闭状 态,仍可接收对方发来的数据。
C语言基于socket的文件传输(可循环发送多个文件)

C语⾔基于socket的⽂件传输(可循环发送多个⽂件)基本简介:本次⽂件传输的实现主要是通过客户端向服务器发送下载请求,然后在服务器中找到对应的⽂件并打开⽂件,再继续向客户端传送⽂件,⽽客户端就在不停的接收。
这是因为⽂件可能⽐较⼤,⼀个缓冲数组只能保存⼀部分⽂件内容,因此服务器得不断从⽂件中读取内容并发给客户端,⽽客户端得不停的循环接收。
但是在事先,得将相应要发送的⽂件(照⽚,⾳频,视频等)保存在服务器相应的⽬录下。
⽽这个是不符合实际要求的,通常来讲,是应该将客户端1的⽂件发送给客户端2,⽽服务器仅仅只是起到⼀个中转站的作⽤,即⽂件应该事先保存在客户端1下。
这⾥我们只是完成⽂件传输的相应功能就⾏了,就不在计较这些啦。
因为只要你理解了这⼀块,可以根据⾃⼰的实际需要,在进⾏修改。
具体编译:gcc server.c -o server -lpthread //这是因为在服务器中加⼊了线程函数,所以编译的时候需要加上 -lpthread 。
gcc client.c -o client记住⼀定要先运⾏服务器,在运⾏客户端。
在客户端运⾏的时候回提醒你输⼊服务器对应的pc ip,如实输⼊就⾏啦。
如果是在本机pc上进⾏测试的话,也可以输⼊0.0.0.0 。
server.c:#include <stdio.h>#include <netdb.h>#include <sys/socket.h>#include <arpa/inet.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <fcntl.h>#include <netinet/in.h>#include <pthread.h>#define portnum 12345#define FILE_SIZE 500#define BUFFER_SIZE 1024void *net_thread(void * fd);int main(){//初始化套接字int server_fd=socket(AF_INET,SOCK_STREAM,0);if(-1==server_fd){perror("socket");exit(1);}//绑定端⼝和ip;struct sockaddr_in server_addr; //struct sockaddr_in为结构体类型,server_addr为定义的结构体server_addr.sin_family=AF_INET; //Internet地址族=AF_INET(IPv4协议)server_addr.sin_port=htons(portnum); //将主机字节序转化为⽹络字节序 ,portnum是端⼝号(server_addr.sin_addr).s_addr=htonl(INADDR_ANY);//IP地址if(-1==bind(server_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))) //套接字与端⼝绑定{perror("bind");exit(6);}//开启监听if(-1==listen(server_fd,5)) //5是最⼤连接数,指服务器最多连接5个⽤户if(-1==listen(server_fd,5)) //5是最⼤连接数,指服务器最多连接5个⽤户{perror("listen");exit(7);}while(1){struct sockaddr_in client_addr;int size=sizeof(client_addr);int new_fd=accept(server_fd,(struct sockaddr *)&client_addr,&size); //server_fd服务器的socket描述字,&client_addr指向struct sockaddr *的指针,&size指向协议地址if(-1==new_fd){perror("accept");continue; //进⾏下⼀次循环}printf("accept client ip:%s:%d\n",inet_ntoa(client_addr.sin_addr),client_addr.sin_port);//inet_ntoa将⼀个⼗进制⽹络字节序转换为点分⼗进制IP格式的字符串。
C语言关于结构体做参数传递

C语言关于结构体做参数传递C语言中结构体类型可以作为函数的参数进行传递。
通过结构体做参数传递,可以将一个或多个相关的数据封装到一个结构体中,然后直接传递结构体作为参数,从而简化函数调用过程,提高程序可读性和维护性。
在C语言中,结构体是一种用户自定义的数据类型,它由多个不同类型的成员组成。
结构体的声明通常放在函数外部,以便于多个函数共享同一种数据结构。
下面我们来探讨几种关于结构体做参数传递的常见使用方式以及它们的特点。
首先是结构体值传递。
结构体作为函数参数传递时,会将结构体的每个成员的值拷贝一份传递给函数参数,函数内部对参数进行的修改不会影响外部的原结构体。
下面是一个示例:```c#include <stdio.h>struct Personchar name[20];int age;};void displayPerson(struct Person p)printf("Name: %s\n", );printf("Age: %d\n", p.age);int maistruct Person p1 = {"Tom", 20};displayPerson(p1);return 0;```在这个示例中,displayPerson函数接受一个Person类型的参数p,并打印其成员name和age。
当displayPerson函数调用时,会将p1的值拷贝到参数p,所以在函数内部修改p的值不会影响p1的值。
输出结果为:```Name: TomAge: 20```其次是结构体指针传递。
结构体指针可以在函数内部直接修改结构体的值,从而实现对原结构体的修改。
下面是一个示例:```c#include <stdio.h>struct Pointint x;int y;};void movePoint(struct Point *p, int dx, int dy)p->x += dx;p->y += dy;int maistruct Point p = {1, 2};movePoint(&p, 3, 4);printf("New coordinates: (%d, %d)\n", p.x, p.y);return 0;```在这个示例中,movePoint函数接受一个Point类型的指针p,并将x和y成员分别增加dx和dy的值。
利用socket进行数据通信与传输的步骤
利用socket进行数据通信与传输的步骤Socket是计算机之间进行数据传输和通信的标准接口。
利用Socket可以方便地进行网络编程,实现不同设备之间的数据交换和传输。
下面将介绍Socket进行数据通信和传输的步骤,以及一些注意事项。
1. 创建Socket连接首先,需要在客户端和服务器端分别创建Socket连接。
在客户端,可以使用socket.connect()方法;在服务器端,可以使用socket.bind()方法。
这些方法都需要指定IP地址和端口号,以确保连接成功。
2. 发送数据一旦连接成功,就可以开始发送数据。
在Python中,可以使用socket.send()方法发送数据。
这个方法需要传入一个字符串参数,表示要发送的数据。
如果要发送二进制数据,则需要使用socket.sendall()方法。
这个方法需要传入一个字节串参数。
3. 接收数据一旦数据发送成功,服务器端就可以接收到这些数据。
在Python 中,可以使用socket.recv()方法接收数据。
这个方法需要传入一个整数参数,表示要接收的数据大小。
如果数据不足这个大小,则该方法会阻塞,等待更多数据到达。
4. 处理数据一旦接收到数据,就需要对这些数据进行处理。
这通常包括解析数据、验证数据、存储数据等操作,以确保数据的正确性和完整性。
5. 关闭连接最后,需要在客户端和服务器端分别关闭Socket连接。
在Python 中,可以使用socket.close()方法关闭连接。
这个方法不需要传入任何参数,只需要调用即可。
在进行Socket编程时,还需要注意一些事项。
比如,需要指定协议类型(如TCP或UDP)、设置超时时间、处理异常等。
此外,还需要考虑数据安全性和加密性等问题,以确保数据在传输过程中不会被恶意攻击者窃取或篡改。
总之,Socket编程是实现计算机间数据通信和传输的重要方法,可以应用于各种场景,如互联网、物联网、机器人等领域。
在使用Socket时,需要严格遵循以上步骤和注意事项,以确保数据的正确传输和保密性。
jni 结构体传递
JNI 结构体传递在开发中,有时我们需要在 Java 和 C/C++ 之间传递复杂的数据结构。
JNI(Java Native Interface)提供了一种机制来实现 Java 和本地代码之间的交互。
JNI 结构体传递是其中一种常见的用法,它允许我们在 Java 和 C/C++ 之间传递结构体对象。
什么是结构体?结构体(Struct)是一种用户自定义的数据类型,在 C/C++ 中使用较为广泛。
它由多个不同类型的成员变量组成,这些成员变量可以是基本数据类型或其他自定义数据类型。
与类相似,结构体可以包含方法,但方法只能是普通函数而非成员函数。
JNI 结构体传递流程JNI 结构体传递涉及到 Java 层和本地层(C/C++)之间的交互。
下面是一个简单的示例流程:1.在 Java 端定义一个结构体类,并声明与本地层对应的 native 方法。
2.使用 javah 工具生成对应的头文件。
3.在本地层实现头文件中声明的 native 方法,并处理传入和返回的结构体对象。
4.在本地层编写 JNI 函数来处理 Java 对象与本地对象之间转换。
5.将编写好的 C/C++ 源文件编译为动态链接库(.so 或 .dll)。
6.在 Java 代码中加载并调用本地库。
下面我们将详细介绍每个步骤。
1. 定义结构体类和 native 方法在 Java 端,我们首先需要定义一个结构体类,并在其中声明与本地层对应的native 方法。
例如,我们定义一个名为Person的结构体类:public class Person {public String name;public int age;public native void printPersonInfo();}上述代码中,我们声明了一个 native 方法printPersonInfo()来打印结构体对象的信息。
2. 生成头文件为了在本地层实现与结构体对象相关的方法,我们需要生成对应的头文件。
C++中用Socket实现对结构体、长字符串和图片的传输
C++中用Socket实现对结构体、长字符串和图片的传输C++中用Socket实现对结构体、长字符串和图片的传输首先说明下,本文的Socket传输引用了CBlockingSocket封装类这个类比较特殊的是Send和Receive的最后一个参数是超时时间,其它与C库里的类似首先说结构体吧,这里传输的结构体含有八个整型,如下[cpp]view plaincopyprint?1.typedef struct exceptiontypecount{2.int img_num;3.int ptz_num;4.int preset_num;5.int video_num;6.int device_num;7.int total_num;8.int total_channel;9.int useless;10.}ExceptionCount,*pExceptionCount;关于Socket的创建和连接这里就不说了,参见点击打开链接这里只说下收发部分的实现服务端:[cpp]view plaincopyprint?1.[cpp]view plaincopyprint?1.memset(counttemp,0,256);//清空缓存2.memcpy(counttemp,&ExCount,sizeof(ExCount));//将结构体转为字符串3.int countlen = sockCon.Send(counttemp,256,1000);其中,char countemp[256], ExCount是实例化的结构体。
客户端:[cpp]view plaincopyprint?1. memset(countbuff,0,256);2.int len = sClient.Receive(countbuff,256,1000); // 接受故障数据3.memset( &count,0,sizeof(count));4.memcpy( &count, countbuff, sizeof(count) );这里的count即为输出的结构体,countbuff同样也是个char[256]。
java即时通讯原理
java即时通讯原理Java即时通讯(Instant Messaging)是一种通过网络实现即时信息传送的技术。
它利用网络通信协议和 Java 编程语言,通过客户端和服务器端之间的交互,实现用户之间的实时消息传递。
Java即时通讯的原理可以概括为以下几个步骤:1. 客户端与服务器的连接:客户端使用Java编程语言创建并启动一个与服务器建立连接的套接字(Socket)。
该套接字是一个网络通信端点,用于实现客户端与服务器之间的双向通信。
2. 客户端发送消息:客户端通过套接字将消息发送给服务器。
可以使用Java提供的Socket类中的输出流(OutputStream)将消息数据写入到套接字中。
3. 服务器接收消息:服务器端通过一个监听套接字(ServerSocket)监听客户端的连接请求。
当有新的客户端连接时,服务器创建一个新的线程来处理该客户端的请求。
服务器端可以使用Java中的Socket类中的输入流(InputStream)从套接字中读取客户端发送的消息数据。
4. 服务器转发消息:服务器端接收到客户端的消息后,可以将消息转发给其他客户端。
服务器通过维护一个客户端列表,保存所有已连接的客户端信息。
当服务器接收到消息后,遍历客户端列表,通过各客户端的套接字,将消息发送给每个客户端。
5. 客户端接收消息:客户端通过套接字的输入流从服务器接收到其他客户端发送的消息数据。
客户端可以通过Java提供的线程机制在一个独立的线程中实时接收并处理服务器发送的消息。
6. 客户端显示消息:客户端接收到消息后,可以将消息展示给用户。
这可以通过Java的GUI编程实现,将消息显示在用户界面的聊天框中。
通过以上步骤,Java即时通讯实现了用户之间的实时消息传递。
整个过程涉及到客户端与服务器的连接建立、消息的发送和接收、服务器的消息转发以及客户端的消息显示等环节。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有一个socket程序,一端是c++写的socket服务程序
另一端是Java写的客户端程序,两着之间需要通信。
C系列接收和发送的都是结构体,而Java直接接收和发送的是字节流或者
Byte数组。
解决值道:
C socket在发送结构体的时候其实也是字节流,因为结构体本身也是内存中的一块连续数据,现在问题就转变成如何把结构体手动转变成字节的问题了。
采用类似的报头:
Typedef struct packet{
Long packId;
Long packLength;
}packetHead;
此时套接口的读写方式为先读报头,在报头中取出数据负载的长度,然后再读相应字节的数据,包头后面跟上包体,其中包体的长度,就是上面结构体中的PacketLen,Clinet首先接受包头,因为包头是两边约定好的,所以可以直接Receive一个定长的消息,也就是这个包头的长度的消息,从包头中取得包体的长度后,就可以再次Receive一个包体长度的消息了。
那么Java中如何发送一个结构体呢?下面是解决方法:
使用C/S模式,通过Socket通信
工作中项目需要在java和C之间进行Socket通信,socket通信是以字节流或者字节包进行的,socket发送方将数据转换成字节流或者字节包,而接收方则将字节流和字节包再转回相应的数据类型,如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整,而对于java和c的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长度不一致。
本文就是针对这种情况,整理了Java数据类型和网络字节流或字节包(相当于java的byte数组)之间转化方法,
import .*;
Java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们知道在socket传输中,发送,接收的数据都是byte数组,但是int类型是4个byte组成的,如何把一个整形的int转换成byte数组,同时把一个长度为4的byte数组转换成int类型,下面有两种方式:
Public static byte[] int2byte(int res){
∙byte[] targets = new byte[4];
∙
∙targets[0] = (byte) (res & 0xff);// 最低位
∙targets[1] = (byte) ((res >> 8) & 0xff);// 次低位
∙targets[2] = (byte) ((res >> 16) & 0xff);// 次高位
∙targets[3] = (byte) (res >>> 24);// 最高位,无符号右移。
∙return targets;
}
Java与C++之间基本数据类型的差别
需要注意以下几个数据类型的区别(32位系统下):
C++ Java char---------1byte Byte----------1byte
Char----------2byte2
long---------4bytes long----------8bytes
注意:
Java中的Char是一个字符,而不是一个字节,与VC的WORD长度一致;
Java中的Byte是一个字节,与C++中的char含义一致,而VC中的BYTE 是无符号的char;
Java中的long长度为8,而VC中的long长度为4(C++中short,long的长度跟编译器的实现相关)。
关于Java和C++的socket通信时如何传送结构体
问题是这样的:
有一个socket 程序,一端是c++写的socket 服务程序
另一端是Java写客户端程序,两者之间需要通信。
这个案例中c++接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组。
解决方法是:c++socket 在发送结构体的时候其实发送的也是字节流。
因为结构体本身也是内存中的一块连续数据。
问题就变成了如何把结构体手动转成字节的问题了
例如Java客户端要像服务端发送一个这样的结构体
/*c++ code:
* struct FileInfo
{
int sessionId;
int filelenth;//文件长度,单位字节
char filename[100];
};
* */
下面两个方法就可以将是结构体转成字节数组。
/**
* 将int转为低字节在前,高字节在后的byte数组
*/
private byte[] toLH(int n)
{
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
b[2] = (byte) (n >> 16 & 0xff);
b[3] = (byte) (n >> 24 & 0xff);
return b;
}
private byte[] getFileInfo(String filename,int filesize, int sessionId) {
byte[] b = new byte[108];
byte[] temp;
//分别将struct的成员格式为byte数组。
temp = toLH(sessionId);
System.arraycopy(temp, 0, b, 0, temp.length);
temp = toLH(filesize);
System.arraycopy(temp, 0, b, 4, temp.length);
System.arraycopy(filename.getBytes(), 0, b, 8, filename.length()); return b;
}。