`
loven_11
  • 浏览: 59001 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Java与C++通信尝试 Socket通信方式

    博客分类:
  • Java
阅读更多

代码绝大部来自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/ 专业电子器件代购

分享到:
评论
1 楼 s_STEFANIE_s 2012-06-07  
谢谢分享,对我很有帮助!

相关推荐

    java与c++通过socket通信

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

    Java c++ socket通信

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

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

    Java和C++作为两种广泛使用的编程语言,它们之间的Socket通信是跨平台交互的一种常见实践。本文将深入探讨如何在Java和C++之间通过Socket进行结构体的发送与接收。 首先,我们需要理解Socket通信的基本原理。Socket...

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

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

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

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

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

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

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

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

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

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

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

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

    c++,java跨语言通信

    8. **性能优化**:考虑到C++和Java的性能差异,需要根据实际情况选择合适的通信方式。例如,对于性能要求较高的场景,可能会倾向于使用gRPC或直接的socket通信,而对易用性有较高需求的项目,RESTful API可能是更好...

    java与c++传文件程序

    2. **C++ Socket编程**:C++中,我们可以使用标准库中的`&lt;sys/socket.h&gt;`和`&lt;netinet/in.h&gt;`来实现Socket通信。客户端创建Socket,然后通过connect函数连接到Java服务端的IP地址和端口号。 3. **文件上传流程**:...

    一个简单的java和c++通讯的小程序

    首先,我们要了解Java和C++通信的基本原理。通常,这种通信可以通过多种方式实现,例如通过网络套接字(Sockets)、远程过程调用(RPC)、共享内存、管道或消息队列等。在这个案例中,由于提到了"Java为客户端,C++...

    Android应用源码安卓与PC的Socket通信项目java版_串口通讯.zip

    本项目就是这样一个示例,它演示了如何使用Java实现Android与PC之间的Socket通信,实现串口通讯功能。Socket通信是网络编程中常见的一种方式,允许两台设备通过TCP/IP协议进行双向数据传输。 在Android端,你需要...

    c++--java,socket.zip

    本资源"**c++--java,socket.zip**"提供了一种实现C++与Java之间通过Socket进行通信的方法。Socket编程是一种标准的网络通信协议,允许不同计算机上的应用程序之间建立连接并交换数据。 首先,我们要理解Socket的...

    Android应用与framework的socket通信实例

    总结来说,Android应用与framework的Socket通信涉及Java的Socket API、原生代码的网络编程、JNI接口以及可能的安全性和性能优化策略。理解这些概念和技术,可以帮助开发者构建可靠的跨层通信机制,实现高效的数据...

    使用JAVA编写网络通信程序

    Socket机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需求。 JAVA语言的优点 JAVA语言的优点主要表现在: 1. 简单性:JAVA语言抛弃了C++语言中的一些不是绝对必要的功能,使得程序设计更加简便...

    Android应用与framework的socket通信示例

    然而,特定情况下,我们可能需要使用更低级的网络通信方式,如 Socket,来实现进程间的通信(IPC)或者与远程服务器进行数据交换。本示例将详细介绍如何在Android应用中与framework层通过Socket进行通信。 首先,让...

    java与C通讯

    这种通讯方式通常依赖于特定的接口和协议来实现,如JNI(Java Native Interface)和Socket通信等。下面将详细介绍这两种主要的通讯方式。 **JNI(Java Native Interface)** JNI是Java平台提供的一种原生接口,...

    linux下C和java通过管道通信

    中间人程序可以使用`socketpair()`或`socket()`函数创建套接字对,然后分别与C和Java进程通信。 请注意,管道的容量有限,通常为64KB,因此不适合大量数据传输。此外,管道是无名的,即它们没有文件系统路径,只能...

    利用socket连续发送与连续接收数据

    Socket是进程间通信的一种方式,它提供了一种在不同主机之间进行网络通信的机制。在TCP/IP协议栈中,Socket接口定义了应用程序如何通过IP协议与网络上的其他系统进行通信。 在Java中,我们可以使用`java.net.Socket...

Global site tag (gtag.js) - Google Analytics