您的位置:首页 > 编程语言 > C语言/C++

java与c/c++进行socket通信的一些问题(1)

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

如有任何问题,请指正!

kingfish
2005.3.29





本文转自:http://blog.csdn.net/kingfish/archive/2005/03/29/333635.aspx





对于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();
		
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: