java socket 如何发送一个结构体消息,java中结构体是个什么概念...

发布网友 发布时间:2022-04-24 07:35

我来回答

5个回答

热心网友 时间:2023-10-09 00:46

有一个socket 程序,一端是c++写的socket 服务程序
另一端是Java写客户端程序,两者之间需要通信。
c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组。

解决方法:c++/c socket 在发送结构体的时候其实发送的也是字节流。因为结构体本身也是内存中的一块连续数据。问题就变成了如何把结构体手动转成字节的问题了
采用类似的报头:
// packet head
typedef struct tagPacketHead{
long PacketID;
long PacketLen;

}PacketHead;此时套接口的读写方式为先读报头,在报头中取出数据负载的长度,然后再读相应字节的数据。

包头后面跟上包体,其中包体的长度,就是上面结构体中的PacketLen,Clinet首先接受包头,因为包头是两边约定好的,所以可以直接Receive一个定长的消息,也就是这个包头的长度的消息,从包头中取得包体的长度后,就可以再次Receive一个包体长度的消息了。那么Java中如何发送一个结构体呢?下面是解决方法:

使用C/S模式,Client为VC6开发,Server为Java,通过Socket通信。
package org.charry.org;
import java.net.*;
/**
*
* 字节转换,参考网络文章
*/
class Packet {
private byte[] buf = null;
/**
* 将int转为低字节在前,高字节在后的byte数组
*/
private static 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;
}
/**
* 将float转为低字节在前,高字节在后的byte数组
*/
private static byte[] toLH(float f) {
return toLH(Float.floatToRawIntBits(f));
}
/**
* 构造并转换
*/
public Packet(int packetID, int packetLen, String packetBody) {
byte[] temp = null;
buf = new byte[packetBody.getBytes().length + 8];
temp = toLH(packetID);
System.arraycopy(temp, 0, buf, 0, temp.length);
temp = toLH(packetLen);
System.arraycopy(temp, 0, buf, 4, temp.length);
System.arraycopy(packetBody.getBytes(), 0, buf, 8, packetBody.length());
}
/**
* 返回要发送的数组
*/
public byte[] getBuf() {
return buf;
}
/**
* 发送测试
*/
public static void main(String[] args) {
try {
String tmp = “test string!”;
Socket sock = new Socket(”127.0.0.1″, 8888);
sock.getOutputStream().write(
new Packet(123, tmp.length(), tmp).getBuf());
sock.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
如果需要用Java 接收结构体的话只需要将上面过程逆过来即可。

热心网友 时间:2023-10-09 00:46

socket只能发送2禁止文件
如果是结构体的话需要在两端做处理
类似code和decode
结构体打一个比方
就是class a{
public string b;
public int c;
public double d;

}
a就是一个结构体
我是这里理解的

热心网友 时间:2023-10-09 00:47

socket只能发送2禁止文件
如果是结构体的话需要在两端做处理
类似code和decode
结构体打一个比方
就是class a{
public string b;
public int c;
public double d;

热心网友 时间:2023-10-09 00:47

ObjectInputStream
ObjectOutputStream
你的意思是把一个类通过socket发送 给远端的socket吗,这些称作类的序列化,你去学一下,上面两个类的用法吧追问类似于C的结构体一样的,发送一个整体的数据。包含消息头消息体》。。

追答你说的结构体,难道不是类吗?类的序列化的意思是 可以把一个类写进输入输出流,同时在另一端可以读取这个输入输出流,解析这个输入输出流,你就能拥有这样一个类的实例。你说的消息头,消息体,你是想用HTTP协议吗,你现在都不知道自己的问题是什么,你去看懂下面的那个例子把

热心网友 时间:2023-10-09 00:48

就是类吧, 只要实现serializable接口, 可序列化, 就可以以二进制传输

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com