`
todd_liu
  • 浏览: 66079 次
  • 性别: Icon_minigender_1
  • 来自: 江苏
社区版块
存档分类
最新评论

【转】在Java与C程序间进行socket通信的讨论

阅读更多


1. 背景
使用socket在Java程序与C程序间进行进程间通信。本文主要描述了在同C程序进行通信的Client端的Java实现功能。

1.1. 使用的语言
Client端:Java,JVM(JDK1.3)
Server端:C,UNIX(Sun Solaris)

1.2. 讨论范围
数据发送:只涉及到Java中int整型系列的讨论,包括byte,short,int。
数据接受:涉及到byte,short,int,long,float,double,char。

1.3.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

2. 实现
输出流:使用OutputStream流发送数据到C程序端。
输入流:使用DataInputStream流从C程序端接受数据

2.1. 数据发送
由于DataOutputStream流对于Java各个基本数据类型都相应地提供了“写”方法,如wrightShort和wrightInt等,因此当进行进程间通信(sockect通信)时,我们总是优先考虑使用DataOutputStream流。
下面我们对DataOutputStream流及其成员方法进行分析:

2.1.1. DataOutputStream流
DataOutputStream流实现了接口DataOutput。
本文只讨论writeByte(int v)、writeShort(int v)和writeInt(int v)部分(这是因为我们需要发送的数据只涉及到int,short和byte,其它的long,double等则不在这里介绍),而且它们都有一个共同的特征,即唯一的int类型的输入参数。
这些成员方法的功能描述也为我们以后手动进行字节顺序转换,提供了理论依据。
<clk style="font-size: 12px"></clk>2.1.2. <nobr style="font-size: 12px; color: #6600ff; border-bottom: #6600ff 1px dotted; background-color: transparent; text-decoration: underline">网络</nobr>字节顺序
规定:网络上传输的数据统一采用Big Endian格式(即“高字节在前”),我们称之为“网络字节顺序”(network byte order)。

Big Endian格式:
高字节 低字节
1 2 3 4
Byte[0] byte[1] byte[2] byte[3]输出缓冲区

因此,无论本机字节顺序采用的那种顺序,在发送到网络之前都要转化为网络字节顺序,才能进行传输。特别是在Java与C两种不同语言的应用程序间进行通信时,这一点优为重要。(若是两个Java程序间通信时可能只要保证接受与发送采用相同的字节顺序,则可以不进行转换格式,但这种做法并不好,不具有良好的移植性)

2.1.3. 数据发送:手动字节转换 / writeInt方法
以writeInt(int v)为例进行描述:
阅读DataOutput的writeInt(int v)方法的文档可知:
使用writeInt方法可以写一个4-byte的int值v到输出流,其字节顺序为:

(byte)(0xff & (v >> 24)) byte[0] 高字节
(byte)(0xff & (v >> 16)) byte[1]
(byte)(0xff & (v >> 8)) byte[2]
(byte)(0xff & v) byte[3] 低字节
这样的字节顺序为Big Endian格式,标准的“网络字节顺序”。
但是在实际工作中输出流采用DataOutputStream.readInt(int)方法时写数据出错,需要自己手动按照以上所说的对需要写的v值进行转换(通过移位完成),转换的代码如下所示,可参见程序SocketClient.java中的ByteConverter.intToByte()方法。
static public final byte[] intToByte(
int value, int offset, int length, byte[] buffer)
{ // High byte first on network
for (int i=0,j=length-1; i<length; i++,j--) {
if ( j+offset >= 0 && j+offset < 1024 ) {
buffer[j+offset] = (byte)( (value >> i*8) & 0xFF );
} else {
System.out.println (
"Array index out of the bounds:Index=" + (j+offset) );
}
}
return buffer;
}


2.2. 数据接收
同数据发送相同,由于DataInputStream流对于Java各个基本数据类型都相应地提供了“读”方法,如readShort和readInt等,因此当进行进程间通信(sockect通信)时,我们总是优先考虑使用DataInputStream流。
而与数据发送不同的是,DataInputStream下的成员方法经实际测试,“基本上可以”根据数据类型正确读出相应的数值。
但并非完美,特别是与不同语言的应用程序进行通信时(如C)。

根据表1(Java与C的数据类型的比较)可知:
(1)long型的字节数在Java和C中相差4个字节:
因此由readLong方法读来的数值应进行带符号的右移32(4-byte)位才能得到在C程序中相应的long型数值。
Type Java C
long 8-Byte 4-Byte

(2)由于Java中的char型为2个字节,C中的char型为1个字节,因此不能使用readChar方法来读取C程序中的char数值。
然而在Java中byte型为1个字节长,因此可以使用readByte方法得到C程序中的char型数值。
Type Java C
byte 1-Byte N/A
char 2-Byte 1-Byte
分享到:
评论

相关推荐

    基于java的cs结构演示程序

    在本场景中,我们讨论的是一个基于Java实现的客户-服务器(C/S)架构的演示程序。C/S架构是一种典型的分布式系统模型,由客户端应用程序和服务器端应用程序组成,它们通过网络进行通信,提供数据和服务的交互。 ...

    java1-echo.rar_java socket ec

    在本案例中,我们讨论的是一个基于Java Socket实现的简单客户端-服务器(C/S)架构的聊天程序,名为"java1-echo.rar_java socket ec"。这个程序的基本功能是,客户端发送的消息会被服务器接收并原样返回,即回显服务...

    利用流式Socket编程实现Windows与Linux的通信.pdf

    在文章的最后,作者还讨论了使用流式Socket编程实现Windows与Linux之间的网络通信的优点和前景,认为这种方式可以提高开发效率、降低成本、提高系统的可靠性和可维护性,并促进工业自动化技术的发展。 本文提供了一...

    Ftp.rar_ftp socket java _visual c

    标题"Ftp.rar_ftp socket java _visual c"揭示了这个压缩包文件与FTP(File Transfer Protocol)有关,涉及到两种编程语言:Java和Visual C++,以及Socket接口的使用。描述提到“Socket接口网络编程,fepde远距离...

    PLC+Socket_Server+欧姆龙Fins协议

    在"PLC+Socket_Server+欧姆龙Fins协议"的实践中,服务器端的Socket程序需要理解FINS协议的命令格式,将接收到的网络数据解析为FINS命令,然后通过FINS协议与PLC进行通信。 具体实施时,开发人员可能需要使用如...

    java单词查询程序支持远程查询

    Java单词查询程序是一款基于C/S(客户端/服务器)架构的应用,专为学习网络编程的初学者设计,允许用户在远程服务器上查询单词。这个程序利用了Java的强大功能,特别是其在网络编程领域的应用,如TCP和UDP协议的支持...

    mtk socket程序的代码

    在本讨论中,我们将深入探讨MTK Socket程序的核心概念、其工作原理以及如何通过CMWAP(China Mobile WAP)连接实现Socket通信。 首先,让我们了解什么是Socket。Socket是在网络上两个应用程序之间提供通信的接口,...

    简单的Java聊天程序

    在这个场景中,我们讨论的是一个简单的客户端/服务器(C/S)架构的聊天应用程序,其中客户端和服务器通过网络进行通信。以下是这个项目中涉及的关键技术点: 1. **Java Socket编程**:Java套接字是进行网络通信的...

    gtk_socket.rar_gtk_linux gtk socket_socket

    在“gtk_socket.rar_gtk_linux gtk socket_socket”这个压缩包中,我们看到的主题是使用GTK+进行socket通信,这涉及到两个主要部分:GTK+编程和网络编程。 首先,让我们深入理解GTK+。GTK+是用C语言编写,但也提供...

    JAVA网络通信系统的研究与开发

    在【标签】中提到的“串口通信”,虽然在给出的内容中没有具体讨论,但在网络通信系统中,串口通信可能是作为辅助或特定场景下的通信方式,例如设备间的本地通信或者在某些特定硬件集成时使用。 在【部分内容】中,...

    Java 聊天室 Java 课程设计 Java毕业设计 多线程 sokect C/S模式

    Java聊天室是一个典型的Java应用程序,它展示了如何利用多线程、Socket编程以及客户端/服务器(C/S)架构来实现一个实时通信系统。在这个项目中,我们不仅能够学习到基础的Java编程技巧,还能深入理解网络通信的核心...

    java的简单抓包程序

    在Java中进行网络抓包,我们通常会用到`java.net`和`java.nio`包中的类,如Socket和ServerSocket,以及非阻塞I/O(Non-blocking I/O)的相关概念。 网络编程的核心是TCP/IP协议栈,它定义了网络通信的数据传输方式...

    C/S模式下的java图书管理系统

    3. 网络通信:通过Java的Socket编程或者更高层次的API如RMI(远程方法调用)或JDBC(Java数据库连接)与服务器进行通信,发送请求并接收响应。 服务器端的主要职责包括: 1. 数据存储:服务器通常与数据库系统相...

    java network

    Java网络编程是Java技术中的一个重要分支,它允许开发者利用Java编程语言和相关的库来编写能够在网络中通信的程序。在过去的五年中,Java技术的成长非常迅速,其在编程语言领域的崛起和对网络编程的兴趣使得Java网络...

    Linux_基于socket的局域网聊天软件的设计与实现.pdf

    Socket编程是网络编程的基础,它允许计算机之间通过网络进行通信。在网络编程中,服务器通过套接字(socket)监听客户端的请求,并建立连接进行数据的收发。在本文件中,重点讨论了使用UDP(User Datagram Protocol...

    java课程设计 基于GUI的简易拼图游戏

    【Java GUI】是Java编程中的一个重要领域,全称为Java图形用户界面,用于创建与用户交互的可视化组件。在本课程设计“基于GUI的简易拼图游戏”中,学生被要求利用Java GUI技术来实现一个有趣的拼图游戏。下面将详细...

    基于JAVA的聊天软件设计与实现.pdf

    本文将从Java开发技术、C/S架构、Socket通信协议、即时通信系统的功能设计以及实现技术等方面展开知识点的阐述。 1. Java开发技术 Java是一种广泛应用于企业级应用开发的编程语言,它具有跨平台、面向对象、安全性...

    socket网络通信

    标题"socket网络通信"暗示我们将讨论如何使用socket在客户端和服务器之间建立连接,实现数据交换。在这个场景中,我们有三个主要的文件:`upload_to_server`,`chat_to_server`和`download_from_server`,分别对应...

    聊天_java_聊天器_C/S_Eclipse_GUI_

    在IT领域,开发一个聊天应用程序是常见的实践项目,而本文将深入探讨如何使用Java语言、Eclipse IDE以及C/S(客户端/服务器)架构来构建一个聊天GUI(图形用户界面)应用。我们将讨论以下几个关键知识点: 1. **...

Global site tag (gtag.js) - Google Analytics