代码绝大部来自http://www.z6688.com/info/37437-1.htm, 但是在自己调试过程中做了一些补充.
Java与C++复合使用还有其他方式(譬如:JNI的), 今天特地尝试了一种Socket的方式:
本代码展示了,java向C++发送一个Employee的Struct结构; 反向的转化碰到了一些问题:
譬如想将C++发送回来的byte[]转化String,但是不能直接用new String(byte[]), java会忽略掉数组中0(这个零在C++中刚好又是字符串结束的标志)
Java端代码(window7, jdk1.6):
package tcp.test;
import java.net.*;
/**
* 与c语言通信(java做client,c/c++做server,传送一个结构)
*
* @author kingfish
* @version 1.0
*/
public 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;
}
/**
* 将byte数组转化成String
*/
private static String toStr(byte[] valArr,int maxLen) {
int index = 0;
while(index < valArr.length && index < maxLen) {
if(valArr[index] == 0) {
break;
}
index++;
}
byte[] temp = new byte[index];
System.arraycopy(valArr, 0, temp, 0, index);
return new String(temp);
}
/**
* 将低字节在前转为int,高字节在后的byte数组
*/
private static int vtolh(byte[] bArr) {
int n = 0;
for(int i=0;i<bArr.length&&i<4;i++){
int left = i*8;
n+= (bArr[i] << left);
}
return n;
}
public String name = "";
public int id = 0;
public float salary = 0;
/**
* 将float转为低字节在前,高字节在后的byte数组
*/
private static byte[] tolh(float f) {
return tolh(Float.floatToRawIntBits(f));
}
private static Employee getEmployee(byte[] bArr) {
String name = "";
int id = 0;
float salary = 0;
byte[] temp = new byte[20];
name = toStr(bArr,20);
System.arraycopy(bArr, 20, temp, 0, 4);
id = vtolh(temp);
return new Employee(name, id, salary);
}
/**
* 构造并转换
*/
public Employee(String name, int id, float salary) {
this.name = name;
this.id = id;
this.salary = 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 {
int index = 0;
byte[] receive = new byte[28];
while(true){
Socket sock = new Socket("127.0.0.1", 5050);
System.out.println("send content: name=kingfish "+"value="+(1+index));
sock.getOutputStream().write(new Employee("kingfish"+index, 1+index++, 10.99f + index).getbuf());
sock.getInputStream().read(receive);
Employee ee = getEmployee(receive);
System.out.println(" response: name="+ee.name+" "+"value="+ee.id);
sock.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
} // end
C++端代码(环境: window7, visual studio 2008):
// SocketTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include <WINSOCK2.H>
#pragma comment(lib, "Ws2_32.lib")
struct UserInfo {
char UserName[20];
int UserId;
};
struct Employee {
UserInfo user;
float salary;
};
int main(int argc, char* argv[]) {
WSADATA wsaData;
char buf[1024];
int nBytes=1024, recvbytes;
SOCKET Listening;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen=sizeof(ClientAddr);
int Port = 5050;
int c;
WSAStartup(MAKEWORD(2,2),&wsaData);
Listening = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);
ServerAddr.sin_port = htons(Port);
bind( Listening, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr) );
listen( Listening, 5 );
printf( "Wating accpet....\n" );
while(true) {
NewConnection = accept(Listening,(SOCKADDR *)&ClientAddr, &ClientAddrLen);
printf( "Wating recv.....\n" );
if( ( recvbytes=recv(NewConnection,buf,nBytes,0) ) == SOCKET_ERROR )
{
printf( "\nErrorcode=%d, Recv from client\n", WSAGetLastError() );
return 0;
}
Employee *data = new Employee;
data = (Employee *)&buf;
printf( "Userid: %d Username: %s Salary: %f", data->user.UserId, data->user.UserName, data->salary );
data->user.UserId = 007;
strcpy(data->user.UserName, "Test");
data->salary = 800;
send( NewConnection, buf, recvbytes, 0 );
}
return 0;
}
朋友的网站 http://woods2010.cn.alibaba.com/ 专业电子器件代购
分享到:
相关推荐
Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景,尤其在系统集成、设备通讯或者混合编程中。Socket提供了一种基于TCP/IP协议的进程间通信(IPC)方式,可以实现在不同操作系统上的进程之间的数据传输...
Java和C++之间的Socket通信是跨语言网络编程的一个常见应用场景。Socket是计算机网络中的一个通信协议,它允许不同操作系统上的应用程序之间建立连接并交换数据。在这个场景中,Java作为客户端,C++作为服务端,两者...
Java和C++作为两种广泛使用的编程语言,它们之间的Socket通信是跨平台交互的一种常见实践。本文将深入探讨如何在Java和C++之间通过Socket进行结构体的发送与接收。 首先,我们需要理解Socket通信的基本原理。Socket...
Java和C++之间进行Socket通信时,可能会遇到乱码问题,主要是由于编码格式不一致导致的。Java默认使用UTF-8编码,而C++在Windows XP环境下可能使用GBK编码。解决这个问题的关键在于确保数据在传输过程中保持正确的...
在IT行业中,网络通信是至关重要的一个领域,特别是...总之,C++和Java的Socket通信是多语言开发中的一种常见实践,它利用TCP/IP协议进行可靠的数据交换。通过理解上述知识点,开发者可以构建起自己的跨平台网络应用。
总结起来,C++和Java通过Socket通信涉及的主要知识点包括:Socket接口的使用、TCP/IP协议的理解、数据的编码和解码、异常处理以及网络编程中的并发处理。在实际开发中,为了确保程序的健壮性和安全性,还需要考虑...
标题中的“Java和C++通信结构体发送”指的是在Java和C++这两种不同的编程语言之间,通过网络进行通信时如何有效地传递结构体数据的问题。在跨语言通信中,由于二进制序列化和内存布局的差异,直接传输结构体会面临...
本教程将深入探讨如何在C/C++服务器环境下利用Visual Studio 2010与Java客户端环境下的Eclipse进行Socket通信。 一、C/C++服务器端(VS2010) 在Visual Studio 2010中,我们可以使用Winsock库来实现Socket编程。...
总之,C++服务器与Java客户端的Socket通信涉及到了网络编程的基本原理和技巧,包括Socket的创建、绑定、监听、连接、数据传输以及关闭等步骤。这种跨平台通信能力在各种互联网应用中都有广泛的应用,如分布式系统、...
8. **性能优化**:考虑到C++和Java的性能差异,需要根据实际情况选择合适的通信方式。例如,对于性能要求较高的场景,可能会倾向于使用gRPC或直接的socket通信,而对易用性有较高需求的项目,RESTful API可能是更好...
2. **C++ Socket编程**:C++中,我们可以使用标准库中的`<sys/socket.h>`和`<netinet/in.h>`来实现Socket通信。客户端创建Socket,然后通过connect函数连接到Java服务端的IP地址和端口号。 3. **文件上传流程**:...
首先,我们要了解Java和C++通信的基本原理。通常,这种通信可以通过多种方式实现,例如通过网络套接字(Sockets)、远程过程调用(RPC)、共享内存、管道或消息队列等。在这个案例中,由于提到了"Java为客户端,C++...
本项目就是这样一个示例,它演示了如何使用Java实现Android与PC之间的Socket通信,实现串口通讯功能。Socket通信是网络编程中常见的一种方式,允许两台设备通过TCP/IP协议进行双向数据传输。 在Android端,你需要...
本资源"**c++--java,socket.zip**"提供了一种实现C++与Java之间通过Socket进行通信的方法。Socket编程是一种标准的网络通信协议,允许不同计算机上的应用程序之间建立连接并交换数据。 首先,我们要理解Socket的...
总结来说,Android应用与framework的Socket通信涉及Java的Socket API、原生代码的网络编程、JNI接口以及可能的安全性和性能优化策略。理解这些概念和技术,可以帮助开发者构建可靠的跨层通信机制,实现高效的数据...
Socket机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。 JAVA语言的优点 JAVA语言的优点主要表现在: 1. 简单性:JAVA语言抛弃了C++语言中的一些不是绝对必要的功能,使得程序设计更加简便...
然而,特定情况下,我们可能需要使用更低级的网络通信方式,如 Socket,来实现进程间的通信(IPC)或者与远程服务器进行数据交换。本示例将详细介绍如何在Android应用中与framework层通过Socket进行通信。 首先,让...
这种通讯方式通常依赖于特定的接口和协议来实现,如JNI(Java Native Interface)和Socket通信等。下面将详细介绍这两种主要的通讯方式。 **JNI(Java Native Interface)** JNI是Java平台提供的一种原生接口,...
中间人程序可以使用`socketpair()`或`socket()`函数创建套接字对,然后分别与C和Java进程通信。 请注意,管道的容量有限,通常为64KB,因此不适合大量数据传输。此外,管道是无名的,即它们没有文件系统路径,只能...
Socket是进程间通信的一种方式,它提供了一种在不同主机之间进行网络通信的机制。在TCP/IP协议栈中,Socket接口定义了应用程序如何通过IP协议与网络上的其他系统进行通信。 在Java中,我们可以使用`java.net.Socket...