2011-04-14 86 views
0

我剛開始學習發送UDP數據包,並且遇到問題。我寫了一個Java客戶端和服務器,它們可以很容易地相互通信,並且我已經完成了一個Python客戶端/服務器組合,但我不知道如何從Java發送一個UDP數據包並用Python接收它。下面是我對Java客戶端:發送Java包到Python服務器?

import java.io.*; 
import java.net.*; 

public class testclient { 
    public static void main(String[] args) throws IOException { 
     DatagramSocket socket = new DatagramSocket(); 

     byte[] buf = new byte[256]; 
     InetAddress address = InetAddress.getLocalHost(); 
     DatagramPacket packet = new DatagramPacket(buf, buf.length, address, Integer.parseInt(args[0])); 

     System.out.println("Sending..."); 
     socket.send(packet); 

     System.out.println("Receiving..."); 
     packet = new DatagramPacket(buf, buf.length); 
     socket.receive(packet); 

     String received = new String(packet.getData(), 0, packet.getLength()); 
     System.out.println(received); 
     System.out.println("Done!"); 

     socket.close(); 
    } 
} 

而Python的服務器:

from sys import * 
from socket import * 

host = gethostname() 
port = int(argv[1]) 
address = (host, port) 

print "Binding..." 
sock = socket(AF_INET, SOCK_DGRAM) 
sock.bind(address) 

print "Receiving..." 
data, client = sock.recvfrom(256) 

print "Sending to", client 
sock.sendto("Hi", client) 

print "Closing..." 
sock.close() 

print "Done!" 

所有我想在這裏做的是發送從Java客戶端的請求,以Python的服務器,然後讓Python服務器將「Hi」發送回Java客戶端,並讓客戶端打印該字符串。對我而言,客戶端發送數據包,服務器在sock.recvfrom(256)處等待,永遠不會收到數據包(或者它就是它的樣子)。

任何想法?我猜測Java和Python如何處理數據包有一些區別,但我不確定。

編輯:只是爲了澄清,端口號是通過命令行參數來傳遞在這兩個應用程序。

+0

什麼'的gethostname()'回報(試試交互式解釋)。你可能會綁定在外部接口上,而不是'localhost == 127.1',因爲你打算在上面的代碼片段中做這件事。 – Santa 2011-04-14 16:45:33

+0

它返回我的機器的名稱。 – 2011-04-14 16:47:23

回答

1

因此,要啓動,我在Ubuntu 10.10。

我走進了/ etc/hosts文件,它看起來像127.0.0.1被分配到稱作localhost.localdomain,而127.0.1.1被分配到我的機器的名字。所以,Python使用本地主機地址,而Java使用我的機器名稱地址。我將localhost更改爲我的機器名稱,現在一切正常。

謝謝大家試圖幫助!

0

在Java中,我看到你創建的包,但我沒有看到你實際上是把任何數據到發送之前使用setData包。

+0

剛試過設置數據,沒有修復它。但是,我想我不必在客戶端數據包中設置數據,因爲它實際上比發送信息要求更多。 – 2011-04-14 16:42:06

1

的問題一定是你的代碼中,它們應該能夠傳達:this 是用Java編寫的客戶機服務器對的一個很好的例子。

+0

謝謝,但我已經按照該教程。我按照這樣寫了一個客戶端服務器對,它工作正常。但是,一旦我開始使用Python服務器,它不再工作。 – 2011-04-14 16:41:29

+0

也許嘗試指定它正在監聽的端口會有幫助,你確定你的客戶端和服務器正在監聽同一個端口嗎? – 2011-04-14 17:13:42

+0

另外,讓客戶端和服務器的代碼都運行在自己單獨的線程守護進程中(這樣當程序完成時它們就會死掉)可能會很有用。此外,它看起來不像你的服務器正在循環運行(即。(;;)),這可能是一個問題。運行時,服務器是否打印了任何內容? – 2011-04-14 17:20:10

相關問題