1、Java与C的各种数据类型存储的字节数是不同的:
Java与C的数据类型的比较
Type Java C
short 2-Byte 2-Byte
int 4-Byte 4-Byte
long 8-Byte 4-Byte
float 4-Byte 4-Byte
double 8-Byte 8-Byte
boolean 1-bit N/A
byte 1-Byte N/A
char 2-Byte 1-Byte
所以在通讯前,需要进行类型转换,对于C定义的unsign char为一个字节存储,对应Java这边用byte存储;对于C定义的int, long, float对应Java用int存储,具体可以参考以上的表。
2、Socket通讯是按字节传输的(即8个bit位传输),而对于超过一个字节的类型如short 为两个字节,就存在两种传输入方式,一种是高字节在前传输;一种是高字节在后传输。即Little-Endian和Big-Endian。
Little-Endian和Big-Endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式.
假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为:
1)little endian:在内存中的存放顺序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
2)big endian:在内存中的存放顺序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd
需要特别说明的是,以上假设机器是每个内存单元以8位即一个字节为单位的.
简单的说,ittle endian把低字节存放在内存的低位;而big endian将低字节存放在内存的高位.
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian.
网络协议都是Big-Endian的,Java编译的都是Big-Endian的,C编译的程序是与机器相关的,具体是否要进行转换是需要沟通的。假设这里需要转换,以下提供short转的换成字节数组的方式:
public static byte[] ShorttoByteArray(short n) {
byte[] b = new byte[2];
b[1] = (byte) (n & 0xff);
b[0] = (byte) (n >> 8 & 0xff);
return b;
}
public static byte[] toLH(short n) {
byte[] b = new byte[2];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n >> 8 & 0xff);
return b;
}
其它的类型转换类似,无非是根据类型在判断用几个字节进行存储而已。
3、由于Socket通讯是按字节进行传输的,而在Java中只有byte是一个字节,故可以将其它类型都转换成byte数组来存储,如:short用两位的字节数组存储,需转换了换以上方法进行,而int用四位的字节数组来存储,对String类型,直接用String.getBytes()来得到它的字节数组。
4、Java的byte与C语言的unsign char虽然都是一个字节存储,但具体的表示内容是不同的,C的无符号char是取值的范围0--255,而Java中byte取值的范围是-128—127,故在实现C语言的字符串时(C是用char[]来表示字符串的),Java这边需要进行转换来模仿C语的unsign char,具体实现函数如下:
// 将有符号的char转换成无符号的char
public static char[] ToUnsignedChar(char[] signChar) {
for (int i = 0; i < signChar.length; i++) {
int x = ((byte) signChar[i]) >= 0 ? signChar[i] : ((byte) signChar[i]) + 256;
signChar[i] = (char) x;
}
return signChar;
}
这里的关键点是当signChar[i] < 0时,即加上256,将其转换到0--255中来。
通过以上四个方面的注意,基本上就可以实现Java与C进行Socket通讯了。
分享到:
相关推荐
java 语言模拟C语言的结构体,以方便java 与C语言使用socket通信。
java与C通过socket通讯,模拟了一个web 上交党费系统,包括socket报文约定 ,C是unix 下的 使用mysql数据库 ,页面使用servlet 技术
java与c++通过socket通信。其中java作为客户端,c++作为服务器。主要解决了C++中的结构体在java中如何实现和模拟。还有int,float,及字符串的处理。极具代表性。
自己用java的SWT设计的图形界面,实现C/S的socket通讯
用 J a v a 实 现 一 个 S o c k e t 通 信 模 型
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/... 此源码为基于HP_Socket框架的socket通讯源码。方便二次开发。省去研究框架的时间
基于Wifi C/S模式 Socket通讯
Java聊天室的设计与实现socket 设计软件源码+WORD毕业论文文档 Java聊天室系统主要用于实现在线聊天,基本功能包括:服务端和客户端。本系统结构如下: (1)服务端: 1、能够开启和关闭服务器 2、等待着客户端从...
C++ 作为Client端view plaincopy to clipboardprint? 代码如下:// Client.cpp : Defines the entry point for the console application. // #include “stdafx.h” #include #pragma comment(lib,”ws2_32.lib”...
基于Socket进行通用的网络通信程序设计.pdf 通信网络-基于UDP协议的Socket网络编程模式的实现.pdf 博文链接:https://n040661.iteye.com/blog/1547557
Java网络socket编程详解 7.2 面向套接字编程 我们已经通过了解Socket的接口,知其所以然,下面我们就将通过具体的案例,来熟悉Socket的...依据TCP协议,在C/S架构的通讯过程中,客户端和服务器的Socket动作如下:
基于局域网Java开发的即时通讯软件,采用c/s架构,是本人的毕业作品,分为客户端跟服务端两个部分。群聊 ,私聊 ,点对点传输文件,但是还有许多要修改的地方。而进行点对点的传输文件后,该用户客户端无法使用,这...
java,net,socket,通讯开发,jms /* * @(#)Message.java 1.60 02/04/09 * * Copyright 1997-2002 Sun Microsystems, Inc. All Rights Reserved. * * SUN PROPRIETARY/CONFIDENTIAL. * This software is the ...
基于JAVA的网络通讯系统设计与实现(WORD论文文档+系统) 摘 要 在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。...
大麻 Java 的 CAN 总线,使用 JNA 访问 Linux SocketCan API。 本软件为Alpha品质,请勿用于生产。...请注意,Linux C 头文件中定义的某些常量在您的平台上可能不同,因此生成的 Java 代码可能无法正常工作。 我已经在
1.采用C/S模式,分为两大模块:客户端模块和服务器端模块。 2.客户端模块的主要功能: 1)登陆功能:用户可以注册,登录。 2)显示用户:将在线用户显示在列表中。 3)接收信息:能接收其他用户发出的信息。 4...
在java网络编程Socket通信中,通常会遇到以下异常情况: 第1个异常是 java.net.BindException:Address already in use: JVM_Bind。 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的...
用于实现单一的即时通讯、文件共享的软件实在太少,而且,它们中大部分都是绝对的C/S模式,我们决定开发一个专用于实现两台计算机之间即时通讯的软件,以方便两台计算机之间信息的交流。本软件属于点对点连接的,...
二、即时通讯系统的开发语言 开发基于Socket通信的聊天软件 ,该软件采用了客户端/服务器(C/S)体系结构,由于Java是当下最流行的开发语言,它 一开始就内置了对网络编程的支持,它提供的强大的API,可以使程序员很...
Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...