2016-07-02 283 views
1

我已經編寫了UDP服務器客戶端程序。我面臨的問題是,當我運行服務器程序時,它不會等待客戶端連接。整個代碼在運行到結束之後執行。而當我在執行服務器端之間運行客戶端時,客戶端正在從其執行點接收數據。這裏是我的服務器代碼 -Udp服務器客戶端java

public static void main(String args[]) throws Exception 
    { 
    DatagramSocket serverSocket = new DatagramSocket(4321); 
     byte[] sendData; 
     String sentence = null; 
     FileInputStream file = new FileInputStream(new File("E:\\Deepak.txt")); 
     InetAddress IPAddress=InetAddress.getByName("localhost"); 
     BufferedReader in = new BufferedReader(new InputStreamReader(file)); 
    do{ 
       while((sentence = in.readLine()) != null) 
       { 
       Thread.sleep(3000); 
       System.out.println(sentence); 
       sendData = sentence.getBytes(); 
       DatagramPacket sendPacket =new DatagramPacket(sendData, sendData.length,IPAddress,9876); 
       serverSocket.send(sendPacket); 
      } 
      }while(true); 
    } 

這裏是我的客戶端代碼 -

public static void main(String args[]) throws SocketException, UnknownHostException, IOException 
{ 
    DatagramSocket clientSocket = new DatagramSocket(); 
    byte[] receiveData = new byte[1024]; 
    String sentence ; 
    while(true) 
      {     
      DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
      receivePacket.getLength(); 
      System.out.println(receivePacket.getLength()); 
      clientSocket.receive(receivePacket); 
      sentence = new String(receivePacket.getData());     
      } 
    } 

回答

1

UDP是無連接的,所以在它的連接沒有這樣的事情。 您只能發送一個數據包(在中點火併忘記方式,send將在java中將數據發送到Datagram中指定的端口)或者在端口上接收數據包(在receive的java中將會阻塞,直到收到一個數據包)。

所以你需要在UDP之上實現自己的連接,如果你想有一個服務器只在客戶端「連接」它時才發送數據。

所以總結:

  • send不會等待任何東西,它只是拋出數據報上線
  • receive將等待一個數據報到達

具有以上信息需要編寫自己的協議來保持連接。

+0

可否請告訴我如何在UDP上實現自己的連接,如果我想要一個只在客戶端「連接」它時才發送數據的服務器。我是socket編程的新手。 –

+0

難道不可以改變服務器來做'receive'嗎?這是最簡單的方法。 –

+0

否。我的具體應用程序需要作爲發件人和客戶端作爲接收者實現。 –