比如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. hdu 4081 Qin Shi Huang's National Road System (次小生成树的变形)

    题目:Qin Shi Huang's National Road System Qin Shi Huang's National Road System Time Limit: 2000/1000 M ...

  2. Cordys BOP 4平台开发入门实战演练——Webservices开发(0基础)

    0.文章导读 本文档针对Cordys BOP-4 WS-AppServer基础功能进行验证和高速开发指导.(高级实践文档请參考兴许文档). 0.1.WS-AppServer概述 WS-AppServe ...

  3. 创建了一个基于最短路径规划geoserver的wms服务

    两点之间的文章书面请求随机最短路径sql功能,这篇文章是关于如何将上述到系统中的子功能. 1.geoserver登录 首先单击geoserver安装路径下的start Geoserver 待geose ...

  4. Swift - UIView的常用属性和常用方法总结

    1,UIView常用的一些属性如下: frame:相对父视图的坐标和大小(x,y,w,h) bounds:相对自身的坐标和大小,所以bounds的x和y永远为0(0,0,w,h) center:相对父 ...

  5. JQuery - 点击图片显示大图

    效果: 目录结构: 代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="De ...

  6. Servlet的学习之Session(3)

    在上一篇<Servlet的学习之Session(2)>我们知道了Session能实现一个会话过程中保存数据或者多个会话中实现同一个Session的关键因素就是Cookie,只是Cookie ...

  7. openfire学习4------->android客户端聊天开发之聊天功能开发

    前面我们已经把服务器搭建完成,并且在客户端实现了登录了. 和我们使用的QQ一样,想一想,登录成功之后呢?肯定是要有一个好友列表,通过这个列表,我们可以选择我们需要聊天的好友. 这里我们先研究下 xmp ...

  8. 谈谈Ext JS的组件——布局的用法续二

    绝对布局(Ext.layout.container.Absolute) 绝对布局让我回忆到了使用Foxpro开发的时候,哪时候的界面布局就是这样.通过设置控件的左上角坐标(x.y)和宽度来进行的,由于 ...

  9. Linux系统基础命令

    这是看itercast的学习笔记 Linux系统基础命令 日期时间 命令date用以查看.设置当前系统时间:格式化显示时间: +%Y--%m--%d 命令hwclock(clock)用以显示硬件时钟时 ...

  10. PAI里field module的on input和on request区别

    在编辑屏幕的PAI的时候,对字段的检查一般用field xxx module xxx或者用chain.有两种操作可供选择,一种是on input,另一种是on request. 区别是: on inp ...