Socket网络通讯开发总结之:Java 与 C进行Socket通讯

转载 2013年12月02日 13:03:03

先交待一下业务应用背景:
服务端:移动交费系统:基于C语言的Unix系统
客户端:增值服务系统:基于Java的软件系统
通迅协议:采用TCP/IP协议,使用TCP以异步方式接入
数据传输:基于Socket流的方式,传输的是网络字节序

Java Socket通讯实现方式这里不做过多的描述,网上到处可以搜索到,比较简单,这里要说的是Java 与 C 进行Socket通讯需注意的地方:


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) {
   

java中socket通信中的注意事项

1、  java中的socket通信 A、 阻塞等待 在java的socket通信和io通信中,阻塞等待是一个很重要的概念。程序在执行到ServerSocket.accept() 、InputSt...
  • gyflyx
  • gyflyx
  • 2011年11月02日 11:05
  • 1529

【网络编程6】Java与C语言套接字Socket通信的例子

继上一篇博客《Java与Python套接字Socket通信的例子》,今晚又完成了Java与C语言套接字通信过程,经过一些调试,最后成功了。Github根链接是:https://github.com/1...
  • u014134180
  • u014134180
  • 2016年06月25日 02:31
  • 1917

Java与C之间的socket通信

最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App。Android与服务器通信通常采用HTTP通信方式和Socket通信方式。由于对web服务器编程了解较少...
  • yutianzuijin
  • yutianzuijin
  • 2014年04月30日 18:03
  • 31935

Network——Socket网络通信机制以及实现举例(TCP、UDP等)

两个传输协议之一:TCP TCP是Tranfer Control Protocol的 简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成...
  • SEU_Calvin
  • SEU_Calvin
  • 2016年07月22日 17:23
  • 12137

python实现socket通讯

Server: [python] view plain copy  print? import socket      address = ('1...
  • zhongbeida_xue
  • zhongbeida_xue
  • 2016年09月13日 10:59
  • 1258

C Socket与Java Socket之间的通信

问题描述:拟在服务器上利用c或c++来编写服务器端程序,在android手机上编写客户端程序,实现通过手机客户端来访问服务器上的资源。由于在c中socket的使用方式跟Java中有一些不同,c中的使用...
  • lp09160206
  • lp09160206
  • 2014年03月23日 21:39
  • 2377

Java(Android)与C++之间的Socket通信

Java与C++之间的Socket通信,对于小的数据量和控制命令,直接可以封装成json或xml格式,进行传输。但对于文件等大数据量传输,必须要将文件封装成帧,每一帧都设定固定大小的缓冲区,逐帧传输。...
  • u011490813
  • u011490813
  • 2013年11月27日 20:43
  • 5649

Socket网络通讯开发总结之:Java 与 C进行Socket通讯

先交待一下业务应用背景: 服务端:移动交费系统:基于C语言的Unix系统 客户端:增值服务系统:基于Java的软件系统 通迅协议:采用TCP/IP协议,使用TCP以异步方式接入 数据传输:基于...
  • lianchao668
  • lianchao668
  • 2013年09月16日 14:14
  • 572

Java与C++Socket通讯注意

c++与java进行socket通信时注意事项     因为java发送的都是网络字节序(big-endium),而c++是主机字节序(little-endium),所以当消息中有整型,浮点型(应尽...
  • woaitingting1985
  • woaitingting1985
  • 2016年09月20日 18:44
  • 675

java与 C++ 之间进行 SOCKET 通信

java与 C++ 之间进行 SOCKET 通讯要点简要解析 1、 big-endian 与 little-endian    Endian定义: 在计算机系统体系...
  • Entre_
  • Entre_
  • 2015年07月23日 13:47
  • 482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Socket网络通讯开发总结之:Java 与 C进行Socket通讯
举报原因:
原因补充:

(最多只允许输入30个字)