中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開(kāi)通VIP
java與c/c 進(jìn)行socket通信的一些問(wèn)題(1)

近幾天看到csdn上問(wèn)c/c++和java通信的問(wèn)題比較多,特別是c特有的數(shù)據(jù)結(jié)構(gòu)(如struct)。

特地根據(jù)網(wǎng)友的一個(gè)問(wèn)題舉個(gè)例子,希望對(duì)初學(xué)者有所幫助。

原問(wèn)題見(jiàn):http://community.csdn.net/Expert/topic/3886/3886989.xml?temp=.3527033

這類問(wèn)題通常是為了利用原有Server或者Server不能做修改(通常是c/c++)造成。

比如Server端只接收一個(gè)結(jié)構(gòu)Employee,定義如下:

struct UserInfo {
  char UserName[20];
  int UserId;
};
struct Employee {
  UserInfo user;
  float salary;
};
當(dāng)然也可以定義為

struct Employee {
  char name[20];
  int    id;
  float salary;
};

java client 測(cè)試源碼(為說(shuō)明問(wèn)題,假設(shè)struct字節(jié)對(duì)齊,sizeof(Employee)=28)

import java.net.*;

/**
 * 與C語(yǔ)言通信(java做Client,c/c++做Server,傳送一個(gè)結(jié)構(gòu))
 * @author kingfish
 * @version 1.0
 */
class Employee {
  private byte[] buf = new byte[28];  //為說(shuō)明問(wèn)題,定死大小,事件中可以靈活處理

  /**
   * 將int轉(zhuǎn)為低字節(jié)在前,高字節(jié)在后的byte數(shù)組
   */
  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轉(zhuǎn)為低字節(jié)在前,高字節(jié)在后的byte數(shù)組
   */
  private static byte[] toLH(float f) {
    return toLH(Float.floatToRawIntBits(f));
  }

  /**
   * 構(gòu)造并轉(zhuǎn)換
   */
  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);
  }

  /**
   * 返回要發(fā)送的數(shù)組
   */
  public byte[] getBuf() {
    return buf;
  }

  /**
   * 發(fā)送測(cè)試
   */
  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

---------------------------------------------------------------------------

當(dāng)然,也可以利用writeInt,writeFloat方法發(fā)送,但字節(jié)順序需要改為低在前。
這個(gè)問(wèn)題稍后在討論。


如有任何問(wèn)題,請(qǐng)指正!

kingfish
2005.3.29



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=333635


[收藏到我的網(wǎng)摘]   kingfish發(fā)表于 2005年03月29日 21:39:00

相關(guān)文章:



#  
 hayingyezi 發(fā)表于2005-04-15 16:37:00  IP: 219.82.172.*
不錯(cuò)!適用!

#  
 james 發(fā)表于2005-06-10 15:07:00  IP: 61.186.252.*
是8字節(jié),但有沒(méi)有辦法傳送呢?是不是可以同樣倒轉(zhuǎn)順序,將big endian轉(zhuǎn)換成little endian傳過(guò)去,我試了,可結(jié)果不對(duì),請(qǐng)指教,謝謝

#  
 james 發(fā)表于2005-06-09 22:09:00  IP: 61.186.252.*
在看了你的文章后我試了一下,正確的執(zhí)行了,但在傳送Double的時(shí)候有問(wèn)題,結(jié)果不對(duì),能告訴為什么嗎?謝謝

#  
 kingfish 發(fā)表于2005-06-10 12:20:00  IP: 61.186.252.*
double范圍不一樣(8字節(jié)),當(dāng)然不對(duì)了。

#  
 zhousheng29 發(fā)表于2005-07-15 15:26:00  IP: 61.186.252.*
我實(shí)驗(yàn)了您的方法,并增加了一種數(shù)據(jù)類型short,發(fā)現(xiàn)編譯時(shí)有些問(wèn)題,報(bào)錯(cuò)。
sock.getOutputStream().write(new Employee("kingfish", 123456789, 8888.99f).getBuf());
比如發(fā)送增加一個(gè)域,
sock.getOutputStream().write(new Employee(0xFFFF,"kingfish", 123456789, 8888.99f).getBuf());
錯(cuò)誤顯示:
cannot resolve symbol constructor JavaToC(int,java.lang.String,int,float)

如果加強(qiáng)制轉(zhuǎn)換
sock.getOutputStream().write(new Employee((short)0xFFFF,"kingfish", 123456789, 8888.99f).getBuf());
編譯通過(guò)

0xFFFF本身就是short類型,為什么還要強(qiáng)制轉(zhuǎn)換。

#  
 kingfish 發(fā)表于2005-07-19 19:16:00  IP: 61.186.252.*
to zhousheng29
//0xFFFF本身就是short類型,為什么還要強(qiáng)制轉(zhuǎn)換。

不對(duì)。java認(rèn)為0xFFFF缺省為int,所以編譯會(huì)報(bào)錯(cuò)


to james

郵件中收到了吧?

#  
 zhousheng29 發(fā)表于2005-07-28 17:15:00  IP: 61.186.252.*
byte型也有這樣的問(wèn)題,0xFF也認(rèn)為是int?

#  
 engine 發(fā)表于2005-08-02 15:29:00  IP: 61.186.252.*
我想問(wèn)一下,我得client采用的是c++,而server采用的是java,想要在他們之間傳遞string和char類型的字符串,請(qǐng)問(wèn)該如何實(shí)現(xiàn)?謝謝!

#  
 engine 發(fā)表于2005-08-02 15:30:00  IP: 61.186.252.*
剛才忘記說(shuō)我得郵箱了! 請(qǐng)各位高手幫忙!謝謝謝謝。。。。 我得email是:zhaog@ss.pku.edu.cn

#  
 kingfish 發(fā)表于2005-08-11 16:42:00  IP: 61.186.252.*
to engine:

c++里用char
java里用byte
就可以了

#  
 wing 發(fā)表于2006-08-22 16:56:00  IP: 218.244.40.*
我正在做一個(gè)java socket與c通信的程序,是這樣我需要傳兩位byte類型到c端表示長(zhǎng)度(兩位分別傳n/256,n%256),但是c與java的byte類型取值是范圍不同的c是0-256 java是-127-+127,一個(gè)有符號(hào)一個(gè)無(wú)符號(hào),java端我一旦大于127或者小于0傳過(guò)去就不對(duì)了,請(qǐng)問(wèn)我該怎么轉(zhuǎn)換,才可以傳過(guò)去c端正確認(rèn)出來(lái)?謝謝你!
我的郵箱是wing8204@163.com

#  
 lvwfe 發(fā)表于2006-08-23 11:35:00  IP: 218.240.145.*
我也有同樣的問(wèn)題,是C和JAVA通過(guò)SOCKET通信,主要是想傳int 和char類型,做了些實(shí)驗(yàn),結(jié)果不對(duì).希望能夠得到一個(gè)比較詳細(xì)的講解資料.謝謝!!!! 我的郵箱是lvwfe@163.com

#  
 sam 發(fā)表于2006-08-24 10:09:00  IP: 121.35.54.*
我正在做一個(gè)java socket與c通信的程序,是這樣我需要傳兩位byte類型到c端表示長(zhǎng)度(兩位分別傳n/256,n%256),但是c與java的byte類型取值是范圍不同的c是0-256 java是-127-+127,一個(gè)有符號(hào)一個(gè)無(wú)符號(hào),java端我一旦大于127或者小于0傳過(guò)去就不對(duì)了,請(qǐng)問(wèn)我該怎么轉(zhuǎn)換,才可以傳過(guò)去c端正確認(rèn)出來(lái)?謝謝你!
我也有同樣的問(wèn)題:
我的郵箱是sum_kk@163.com

#  
 kingfish 發(fā)表于2006-09-06 15:27:00  IP: 58.246.198.*
java發(fā)送byte數(shù)組:
head[0] = (byte) (len / 256);
head[1] = (byte) (len % 256);

java接收到byte數(shù)組:
n = head[0];
if(n<0) n+=256;



#  
 kingfish 發(fā)表于2006-09-06 15:28:00  IP: 58.246.198.*
java發(fā)送byte數(shù)組:
head[0] = (byte) (len / 256);
head[1] = (byte) (len % 256);

java接收到byte數(shù)組:
n = head[0];
if(n<0) n+=256;
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
java整數(shù)和byte數(shù)組之間的轉(zhuǎn)換
java基于TCP的socket數(shù)據(jù)包拆分方法
使用DatagramSocket發(fā)送、接收數(shù)據(jù)(Socket之UDP套接字)
Java Socket編程(五)簡(jiǎn)單的WEB服務(wù)器
初始化(清0)數(shù)組的函數(shù) - CSDN - FAQ
C#泛型詳解
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服