比如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方法发送,但字节顺序需要改为低在前。
这个问题稍后在讨论。

如有任何问题,请指正!

对于java端的接收有些问题,

我列出我们以前的接收函数:

public String Receive() throws IOException  

{  

    byte[] buffer = new byte[8];//byte[1024]  

       int count = 0;  

       ips=_Socket.getInputStream();  

       ios=new DataInputStream(ips);  

       if (listMsg.size() == 0)  

       {  

           count=ios.read(buffer, 0, buffer.length);//获取字符数组和其长度  

           String str=new String(buffer,0,count,"gb2312");//转换成字符串  

           String[] strs=str.split("//|");  

          for (int i = 0; i < strs.length; i++)  

          {  

              if (strs[i].toString() != "")  

              {  

                  listMsg.add(strs[i]);  

              }  

          }  

          str = listMsg.get(0).toString().trim();  

          listMsg.remove(0);  

          buffer = null;  

          return str;  

       }  

       else  

       {  

        String str = listMsg.get(0).toString().trim();  

           listMsg.remove(0);  

           buffer = null;  

           return str;  

       }  

}

接收流函数:

/* 
 * 接收流,注意流的大小,避免溢出 
 * linc 
 * 2010-9-13 
 */  
public byte[] ReceiveStream() throws Exception  
{  
    String str = Receive();  
       int num = Integer.parseInt(str);//获得流的长度  
       Send("0|",false);  
       ByteArrayOutputStream _bytestream=new ByteArrayOutputStream();  
       InputStream _InputStream=_Socket.getInputStream();  
       int Length=0;  
       byte[] buffer = new byte[1024];      
       while (Length < num)  
       {          
        int temp_length = buffer.length;//1024  
            if ((num - Length) < temp_length)  
            {  
                temp_length = num - Length;  
            }  
            _InputStream.read(buffer, 0, temp_length);  
            _bytestream.write(buffer, 0, temp_length);  
              
            Length += temp_length;  
            Send(String.valueOf(Length),false);  
       }  
    return _bytestream.toByteArray();  
      
}

java与c/c++进行socket通信的更多相关文章

  1. Java与C之间的socket通信

    最近正在开发一个基于指纹的音乐检索应用,算法部分已经完成,所以尝试做一个Android App.Android与服务器通信通常采用HTTP通信方式和Socket通信方式.由于对web服务器编程了解较少 ...

  2. Delphi和JAVA用UTF-8编码进行Socket通信例子

    最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...

  3. java多线程实现多客户端socket通信

    一.服务端 package com.czhappy.hello.socket; import java.io.IOException; import java.net.InetAddress; imp ...

  4. java scoket Blocking 阻塞IO socket通信二

    在上面一节中,服务端收到客户端的连接之后,都是new一个新的线程来处理客户端发送的请求,每次new 一个线程比较耗费系统资源,如果100万个客户端,我们就要创建100万个线程,相当的 耗费系统的资源, ...

  5. java scoket Blocking 阻塞IO socket通信一

    package bhz.bio; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; p ...

  6. java scoket Blocking 阻塞IO socket通信四

    记住NIO在jdk1.7版本之前是同步非阻塞的,以前的inputsream是同步阻塞的,上面学习完成了Buffer现在我们来学习channel channel书双向的,以前阻塞的io的inputstr ...

  7. java nio实现非阻塞Socket通信实例

    服务器 package com.java.xiong.Net17; import java.io.IOException; import java.net.InetSocketAddress; imp ...

  8. java nio--采用Selector实现Socket通信

    server: /** * 选择器服务端 * Created by ascend on 2017/6/9 9:30. */ public class SelectorServer { // publi ...

  9. java centos7 gcc编码 解决socket通信 汉字乱码

    1.把 Java eclipes 设置编码成utf-8 windows->preference->workspace 2.centos7 gcc 默认为utf-8

随机推荐

  1. OpenGL框架+QT版

    原地址:http://blog.chinaunix.net/uid-25799257-id-3498005.html 之前一直做地图的算法,没什么时间学习opengl,之前看nehe_OpenGL.c ...

  2. perl 继承小例子

    <pre name="code" class="html"><pre name="code" class="ht ...

  3. Python中的继承

    继承: 面向对象程序语言的一个重要特点是继承.继承提供了在已存在类的基础上创建新类的方法.继承的子类 拥有被继承的父类的所有方法,在此基础上,子类还可以添加自己的专有方法.继承是类的强有力的特点.一些 ...

  4. 进阶:案例六: Context Menu(静态 与 动态)

    实现: 1.add: 2.delete 3.add2 实现步骤: 1.新建属性display_text 2.创建layout 3.代码部分: add事件: METHOD onactionadd . D ...

  5. 每日一帖示例程序(使用TWebBrowser基于HTML做)

    最近在程序中增加了每日一帖的功能,搜索一下网站的程序,发现大部分是用Memo实现,而我用的是TWebBrowser基于HTML做,故帖出来共享一下. PAS源码: unit Unit1; interf ...

  6. 大数据时代的精准数据挖掘——使用R语言

    老师简介: Gino老师,即将步入不惑之年,早年获得名校数学与应用数学专业学士和统计学专业硕士,有海外学习和工作的经历,近二十年来一直进行着数据分析的理论和实践,数学.统计和计算机功底强悍. 曾在某一 ...

  7. boost asio 异步实现tcp通讯

    ---恢复内容开始--- asioboost   目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化   一.前言 boost asio可算是一个简 ...

  8. Oracle Tablespace Transportation

    前提:进行表空间传输需要用户有SYSDBA的系统权限,被移动的表空间是自包含的表空间,不应有依赖于表空间外部对象的对象存在.确定是否自包含可使用系统包DBMS_TTS中的TRANSPORT_SET_C ...

  9. 序列化TList of objects(摘自danieleteti的网站)

    Some weeks ago a customer asked to me if it is possibile serialize a TList of objects. “Hey, you sho ...

  10. android onKeydown

    package wyf.ytl; import android.app.Activity; import android.content.Context; import android.os.Bund ...