频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
java与c/c++进行socket通信
2013-06-27 11:21:03           
收藏   我要投稿

比如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)
下一篇:JAVA Socket(多个客户同时连接,信息共享) client (java/ruby)
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站