比如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. TCP/IP笔记 一.综述

    1. TCP/IP分层 TCP/IP 是四层的体系结构:应用层.运输层.网际层和网络接口层,如下图: OSI协议是国际标准的网络协议,但是由于OSI的实用性等问题造成OSI没有流行起来.目前国际上广泛 ...

  2. Swift - 设置网格UICollectionView的单元格间距

    要设置单元格cell的间距(水平间距,垂直间距)可进行如下设置: 方法1:在storyboard中设置 选择Collection View后在面板里设置Min Spacing相关属性(这里也可以设置单 ...

  3. Android插件化开发---执行未安装apk中的Service

    欢迎各位增加我的Android开发群[257053751​] 假设你还不知道什么叫插件化开发.那么你应该先读一读之前写的这篇博客:Android插件化开发,初入殿堂 上一篇博客主要从总体角度分析了一下 ...

  4. HDU 4839 The Game of Coins _(:зゝ∠)_

    The Game of Coins mark: #include"cstdio" #include"iostream" #include"queue& ...

  5. Spring MVC RedirectAttributes的用法解决办法

    Spring MVC RedirectAttributes的用法很久没发过技术贴了,今天对于一个问题纠结了2小时,遂放弃研究用另一种方法解决,奈何心中一直存在纠结,发帖求解 我先解释下什么是Redir ...

  6. ie 64bit调用activex控件

    1,首先,这是可能的.不要被网上一堆ie64调不了activex控件的文章误导了.flash就是一个现成的例子,flash支持ie64. 2,ie64只能调用64bit的activex控件.网上那些说 ...

  7. [置顶] MyEclipse显示中文界面,在线安装教程

    准备工作 1,装好MyEclipse软件 2,可以上网 3,在线安装地址:http://download.eclipse.org/technology/babel/update-site/R0.11. ...

  8. Android使用ksoap2-android调用WebService学习

    之前主要做客户端UI交互,很少处理数据和接触服务端,但现在的移动设备根本不可能离得开网络连接,数据的交换.最近学习的是在android端如何去调用远程WebService,都说WebService是一 ...

  9. 与众不同 windows phone (17) - Graphic and Animation(画图和动画)

    原文:与众不同 windows phone (17) - Graphic and Animation(画图和动画) [索引页][源码下载] 与众不同 windows phone (17) - Grap ...

  10. 特么的. 最终把 amobbs 的站长阿莫(莫进明)给回骂了一顿.

    起因:  假设你居住的地方,要上马PX等高污染的项目,你会怎么做. 鼓动别人上街暴力示威与军警对抗. 自己待在家里支持怂恿. 这样的人真心猥琐! 鉴于他常常私自改动帖子, 在此截图留存. 真特么没劲. ...