`
loven_11
  • 浏览: 58093 次
  • 性别: 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  
谢谢分享,对我很有帮助!

相关推荐

    gRPC的通信方式-客户端流式、服务端流式、双向流式在Java的调用示例代码.rar

    gRPC的通信方式-客户端流式、服务端流式、双向流式在Java的调用示例代码;gRPC的通信方式-客户端流式、服务端流式、双向流式在Java的调用示例代码.;gRPC的通信方式-客户端流式、服务端流式、双向流式在Java的调用示例...

    Linux C++ socket网络编程----------即时通信系统.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

    使用OpenCV与C++ Socket实现的人脸识别系统服务器.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

    实验三Socket通信实验报告.doc

    实验三Socket通信实验报告 (1)实验目的和要求 1. 掌握VB、VC++、VS或JAVA等集成开发环境编写网络程序的方法; 2. 掌握客户/服务器(C/S)应用的工作方式; 3. 学习网络中进程之间通信的原理和实现方法; 4. 理解单...

    进程间通信之消息队列 ( message queue )——完整代码

    七种进程间通信方式: 一.无名管道( pipe ) 二.有名管道( fifo ) 三.共享内存 ( shared memory ) 四.信号 ( sinal ) 五.消息队列 ( message queue ) 六.信号量 ( semophore ) 七.套接字 ( socket ) 以上七种...

    基于Java的即时通讯系统设计与实现【文献综述】.doc

    Socket通信机制提供了两种通讯方式:有联接和无联接方式,分别面向不同的应用需 求。使用有联接方式时,通信链路提供了可靠的,全双工的字节流服务。在该方式下, 通信双方必须创建一个联接过程并建立一条通讯链路...

    C++网络开发框架0.5.7

    统一管理C++的SOCKET通讯、线程沲管理、调用管理等; 可以注册为NT服务, 具实时监控重启功能; b. 通讯 基于XML文本通信协议,客户端可以方便应用于各种环境平台和硬件平台,如Windows、Linux,PDA等开发应用环境中...

    JAVA上百实例源码以及开源项目源代码

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

    这是一个用C#写的MES系统 ,用到了supersocket通信框架,以及WPF技术.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

    项目使用Socket.IO-Client-Swift 绑定后台node服务器实现实时聊天功能.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

    JAVA上百实例源码以及开源项目

    Java Socket 聊天通信演示代码 2个目标文件,一个服务器,一个客户端。 Java Telnet客户端实例源码 一个目标文件,演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例...

    OIM是采用 Java平台开发的一套即时通讯聊天系统.zip

    OIM是采用 Java平台开发的一套即时通讯聊天系统,献给对即时通讯有兴趣的朋友。服务端实现了TCP Socket和WebSocket。方便接入网页版、安卓、IOS、PC桌面版客户端。OIM已经实现桌面版客户端,可以跨平台Windows、mac...

    C++网络服务开发套件0.5.5

    统一管理C++的SOCKET通讯、线程沲管理、调用管理等; 可以注册为NT服务, 具实时监控重启功能; &lt;br&gt;b. 通讯 基于XML文本通信协议,客户端可以方便应用于各种环境平台和硬件平台,如Windows、Linux,PDA等...

    易语言-Hp-Socket For E 5.4.2 高性能TCP/UDP通信组件 源码+模块+例程

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

    java实现的聊天工具,可扩展性强。.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

    iOS系统Socket.zip

    软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    轻量级推送服务和实时在线监控平台,同时用于开发即时通信系统.zip

    软件开发设计:PHP、QT、应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、...

    C++网络服务开发套件0.5.6

    统一管理C++的SOCKET通讯、线程沲管理、调用管理等; 可以注册为NT服务, 具实时监控重启功能; &lt;br&gt;b. 通讯 基于XML文本通信协议,客户端可以方便应用于各种环境平台和硬件平台,如Windows、Linux,PDA等...

    vue + node + socket 的项目.zip

    软件开发设计:应用软件开发、系统软件开发、移动应用开发、网站开发C++、Java、python、web、C#等语言的项目开发与学习资料 硬件与设备:单片机、EDA、proteus、RTOS、包括计算机硬件、服务器、网络设备、存储设备...

Global site tag (gtag.js) - Google Analytics