java 虚拟机采用大端字节序,High-byte frist。
例:
public void test2()
{
short s = 0x0102;
String str = Integer.toBinaryString(s);
System.out.println(s);
System.out.println(str); // 0000 0001 , 0000 0010 大端字节序
}
java 使用DataOutputStream 包装类可实现发送不同数据类型数据
由于DataOutputStream大部分写方法的内部实现其实是多次调用write,所以c端必须循环读取。
public final void writeInt(int v) throws IOException {
out.write((v >>> 24) & 0xFF);
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
incCount(4);
}
例:(使用java做client,c做server,只贴出关键代码)
server
while(1){
struct sockaddr_in sockaddr_client;
socklen_t socklen_client;
int clientSock = accept(sockFlag, (struct sockaddr *)&sockaddr_client, &socklen_client);
if(clientSock<0){
perror("accept");
break;
}
int id = 0;
char msg[200];
void *buff = malloc(1024);
memset(msg, '\0', 200);
memset(buff, '\0', 1024);
ssize_t recvLen = 0, readLen = 0;
do{
recvLen = recv(clientSock, buff+readLen, 1024-readLen-2, 0);
readLen+=recvLen;
}while(recvLen>0);
if(readLen>0){
printf("recv read len = %d \n", readLen);
memcpy(&id, buff, sizeof(int));
memcpy(msg, buff+sizeof(int), 2);
printf("%d %s \n", net_to_int(id), msg );
}else{
printf("recv read len = %d \n", readLen);
}
close(clientSock);
}
try {
client = new Socket(InetAddress.getByName(ipaddr), port) ;
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
Integer sum = new Integer(190);
dos.writeInt(sum); //仔细看writeInt内部的实现是调用了4次write方法,所以服务端必须循环接收
dos.write("hello".getBytes());
dos.flush();
dos.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(client!=null){
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}