2010-08-17 56 views
2

我有一種感覺我的問題是有點怪怪的,但在這裏不用...用winsock在Java(或類似)「發送」功能

我有一個C++程序(從其他組織)與一個交互攝像頭通過以太網使用插座連接到硬件。表面上,將消息發送到插座中的初始功能是這樣的:

char* cmd = "#TRGON\x0d"; 
m_pClient->Socket_Write((BYTE*)cmd, strlen(cmd)); 

尋找通過代碼挖掘後,我發現在最低水平實際發送數據的功能:

// Try to send what's in the buffer 
int nFlags = 0; 
int nSent = ::send(m_hSocket, (char*)m_pSendBuffer, m_nSendBufLen, nFlags); 
...checking for errors, etc. 

現在,我正在處理的程序需要向攝像機發送類似的命令,除了它是用Java編寫的。我一整天都在玩Java套接字,除了連接到適當的地址(觸發LED指示燈的命令)之外,還沒有能夠讓攝像機做任何事情。

我在網上看了一眼,看到這個「發送」命令來自C++程序封裝的Winsock庫。有沒有類似的方式在Java中做到這一點?或者我只是沒有在Java中使用DataOutputStreams,套接字等的正確組合?有沒有一些「進口winsock」我錯過了(Google谷歌似乎說沒有這樣的事情)?

非常感謝您的幫助。

編輯:

我真的不知道是否有任何代碼會有幫助!在這一點上,我只是在做基本的事情:連接並嘗試寫入它。我似乎想盡組合,轉換等,這只是一些測試代碼(顯然不健壯或正確的,如catch塊):

InetAddress addr = null; 
Socket sock = null; 
ObjectInputStream in = null; 
ObjectOutputStream out = null; 

String msg = "#TRGON\\x0d"; 

try { 
    addr = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168, 
     (byte) 81, (byte) 58 }); 

    sock = new Socket(addr, PORT); 

    out = new ObjectOutputStream(sock.getOutputStream()); 

    out.writeBytes(msg); 

    in = new ObjectInputStream(sock.getInputStream()); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

它掛在最後一行出現時,在新= ...就好像它沒有從相機中拾取任何類型的輸入流。我知道我可以繼續玩耍,但任何外界的建議表示讚賞。

+1

請發佈您的Java代碼來分析。 – 2010-08-17 19:46:57

+1

1.從字符串文字中刪除'\\'。 2.只需編寫'new Socket(「192.168.81.58」,PORT)'而不是自己構建IP地址。 3.不要使用ObjectOutputStream。 – 2010-08-17 20:08:52

回答

1

原來的字符串被髮送需要不同的格式。取而代之的

"#TRGON\x0d" 

我需要使用

"#TRGON\r" 

並不需要十六進制說明符的事。謝謝你的回覆!

3

在一般情況下,它應該是一樣簡單:

Socket s = new Socket("hostname", port); 
OutputStream os = s.getOutputStream(); 
os.write("#TRGON\r".getBytes()); 
os.flush(); 

那麼究竟什麼是你的問題?當然,如果連接看起來是基於字符的,你不應該使用DataOutputStream,而是寫簡單的ASCII字符串。

+0

那麼,給我C++相機代碼的人還沒有文檔,所以這肯定會阻礙任何進展。基本上,當命令以C++代碼發送時,攝像機將亮起並返回ACK。在這裏,它似乎是發送,但沒有發生。 – 2010-08-17 20:18:31

2

看起來你C++接受純字節[編輯與\r取代\x0d]。所以你應該這樣做與Java:

InetAddress addr = InetAddress.getByName("192.168.81.58"); 
Socket s = new Socket(addr, PORT); 
OutputStream out = s.getOutputStream(); 
out.write("#TRGON\\x0d".getBytes()); 
s.close(); 

這是原始的,因爲它得到我想。