`
JAVA天地
  • 浏览: 674115 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

java与c/c++进行socket通信的一些问题

阅读更多
文章来源:http://blog.csdn.net/kingfish/archive/2005/03/29/333635.aspx

近几天看到csdn上问c/c++和java通信的问题比较多,特别是c特有的数据结构(如struct)。

特地根据网友的一个问题举个例子,希望对初学者有所帮助。

原问题见:http://community.csdn.net/Expert/topic/3886/3886989.xml?temp=.3527033

这类问题通常是为了利用原有Server或者Server不能做修改(通常是c/c++)造成。

比如Server端只接收一个结构Employee,定义如下:

struct UserInfo {
char UserName[20];
int UserId;
};
struct Employee {
UserInfo user;
float salary;
};
当然也可以定义为

struct Employee {
char name[20];
int id;
float salary;
};

java client 测试源码(为说明问题,假设struct字节对齐,sizeof(Employee)=28)

import java.net.*;

/**
* 与C语言通信(java做Client,c/c++做Server,传送一个结构)
* @author kingfish
* @version 1.0
*/
class Employee {
private byte[] buf = new byte[28]; //为说明问题,定死大小,事件中可以灵活处理

/**
* 将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 Employee(String name, int id, float salary) {
byte[] temp = name.getBytes();
System.arraycopy(temp, 0, buf, 0, temp.length);

temp = toLH(id);
System.arraycopy(temp, 0, buf, 20, temp.length);

temp = toLH(salary);
System.arraycopy(temp, 0, buf, 24, temp.length);
}

/**
* 返回要发送的数组
*/
public byte[] getBuf() {
return buf;
}

/**
* 发送测试
*/
public static void main(String[] args) {
try {
Socket sock = new Socket("127.0.0.1", 8888);
sock.getOutputStream().write(new Employee("kingfish", 123456789, 8888.99f).
getBuf());
sock.close();
}
catch (Exception e) {
e.printStackTrace();
}

} //end

---------------------------------------------------------------------------

当然,也可以利用writeInt,writeFloat方法发送,但字节顺序需要改为低在前。
这个问题稍后在讨论。


如有任何问题,请指正!

kingfish
2005.3.29

-------------------------------------------------------------------------------------------------------

补充说明:

在服务端可更改的情况下就没有这样的麻烦了,现在我也正在写这么一个JAVA客户端、C为服务端的程序,就不需要将字节反序,直接将组好的报文,以字节的方式发送到服务端,然后再取发回来的字节并还原来字符串,到指定位置取相关的信息即可。

我这里涉及到要发送多种不同的报文到服务端,不可能为每个报文发送写一个发送程序,于是就写了一个通用的,用于发送和接收报文,至于报文的组成和接收分析,就采用单独的分析程序,这样可以分开,也便于调试。如图:

分享到:
评论

相关推荐

    java与c++通过socket通信

    Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...

    C/C++服务器与Java客户端进行socket通信

    本教程将深入探讨如何在C/C++服务器环境下利用Visual Studio 2010与Java客户端环境下的Eclipse进行Socket通信。 一、C/C++服务器端(VS2010) 在Visual Studio 2010中,我们可以使用Winsock库来实现Socket编程。...

    android中java和C的socket通信demo

    在Android开发中,有时我们需要进行Java层与C/C++(JNI)层的通信,以便利用C/C++的高性能优势处理一些底层任务。本教程将详细解释如何在Android中实现Java和C的Socket通信,特别是在涉及文件描述符传递的场景下。 ...

    Java c++ socket通信

    Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景。Socket是计算机网络中的一个通信协议,它允许不同操作系统上的应用程序之间建立连接并交换数据。在这个场景中,Java作为客户端,C++作为服务端,两者...

    java使用socket和c++通信

    在Java中,非阻塞式Socket通信基于NIO(Non-blocking Input/Output)机制,它与传统的BIO(Blocking I/O)不同,BIO在等待数据时会阻塞线程,而NIO则允许线程在没有数据可读或可写时继续执行其他任务,从而提高系统...

    Java和c++的Socket通信如何发送结构体

    标题中的"Java和C++的Socket通信如何发送结构体"主要涉及到两个关键问题:字节序和数据序列化。字节序是指在内存中存储多字节数据的顺序,分为大端字节序(Big-Endian)和小端字节序(Little-Endian)。大多数网络...

    一个经典的socket通信程序

    6. **编码与解码**:在Socket通信中,数据需要进行编码(如ASCII、UTF-8)和解码,以确保两端能够正确理解对方发送的信息。Mina提供了解码器和编码器接口,方便用户自定义数据格式。 7. **事件驱动编程**:Mina基于...

    C++写的服务器与Java写的客户端通过Socket通信C++代码

    在IT行业中,网络通信是至关重要的一个领域,特别是...总之,C++和Java的Socket通信是多语言开发中的一种常见实践,它利用TCP/IP协议进行可靠的数据交换。通过理解上述知识点,开发者可以构建起自己的跨平台网络应用。

    C++写的服务器与Java写的客户端通过Socket通信java代码

    总结起来,C++和Java通过Socket通信涉及的主要知识点包括:Socket接口的使用、TCP/IP协议的理解、数据的编码和解码、异常处理以及网络编程中的并发处理。在实际开发中,为了确保程序的健壮性和安全性,还需要考虑...

    C++服务器与java进行socket通信案例

    总之,C++服务器与Java客户端的Socket通信涉及到了网络编程的基本原理和技巧,包括Socket的创建、绑定、监听、连接、数据传输以及关闭等步骤。这种跨平台通信能力在各种互联网应用中都有广泛的应用,如分布式系统、...

    java c++ 通信之间的乱码解决方法

    Java和C++之间进行Socket通信时,可能会遇到乱码问题,主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C++在Windows XP环境下可能使用GBK编码。解决这个问题的关键在于确保数据在传输过程中保持正确的...

    C++与java的socket

    C++与java的socket通信实例代码,cocos2dx socket通信与java服务器

    Android Binder C/C++层实现示例

    本示例"Android Binder C/C++层实现示例"着重展示了如何在C/C++层面进行Binder通信的实现,这对于深入理解Android系统的底层工作原理至关重要。 一、Binder架构 Binder架构包括Client、Server、Service Manager和...

    java和C++通信结构体发送

    标题中的“Java和C++通信结构体发送”指的是在Java和C++这两种不同的编程语言之间,通过网络进行通信时如何有效地传递结构体数据的问题。在跨语言通信中,由于二进制序列化和内存布局的差异,直接传输结构体会面临...

    C++与android通过socket通信

    C++编写的服务器端跟android上编写的手机客户端进行socket通信,传动多种数据。用VC6.0直接打开C++ Server,用eclipse直接打开android socketTest。注意修改一下安卓代码中的IP地址。程序中java和C++的通信的内容...

    SIP协议解析与实现(c/c++)

    **SIP协议解析与实现(c/c++)** SIP(Session Initiation Protocol)协议是一种用于创建、修改和终止多媒体通信会话的信令协议,广泛应用于VoIP、视频会议和即时消息等领域。根据RFC3261,SIP设计为简单、可扩展且...

    java和C/C++第八届蓝桥杯大赛个人赛省赛(软件类)真题

    该赛事涵盖Java和C/C++等编程语言,对参赛者的编程基础、算法理解和问题解决能力有较高要求。以下是对第八届蓝桥杯大赛个人赛省赛(软件类)真题的相关知识点的详细解读。 1. **Java知识点**: - **基础语法**:...

    Android/Java基于Socket接收结构体数据

    总的来说,使用Javolution库,Android/Java开发者能够方便地处理C/C++风格的结构体数据,通过Socket通信进行跨平台交互。结合Socket编程,Javolution使得Java与其它系统之间的数据交换变得更加高效和便捷。在实际...

    mirrors-hp-socket-master.zip_java udp_python udp_socket_socket 高

    HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程...

    java-socketcan

    Java SocketCAN是一个用于在Linux环境下通过Java编程语言与CAN(Controller Area Network)总线通信的库。这个库允许开发者在Java应用程序中实现低级别的CAN数据帧收发,从而无需深入理解底层操作系统或C/C++编程。...

Global site tag (gtag.js) - Google Analytics