2016-10-14 26 views
0

我正在用java編寫一個簡單的Peer to Peer程序。我有以下代碼。java使用UDP套接字的Peer to Peer

import java.net.*; 
import java.io.*; 
public class Broadcasts { 

private final Runnable receiver; 
private final Runnable sender; 
private boolean run = true; 


    public Broadcasts(UDPSocketHandler parent) throws UnknownHostException{ 
    InetAddress aHost = InetAddress.getLocalHost(); 

    sender = new Runnable() { 
     public void run() { 
      byte data[] = "Hello".getBytes(); 
      DatagramSocket socket = null; 
      try { 
       socket = new DatagramSocket(); 
      } catch (SocketException ex) { 
       ex.printStackTrace(); 
       parent.quit(); 
      } 

      DatagramPacket packet = new DatagramPacket(
        data, 
        data.length, 
        aHost, 
        9090); 
      while (run) { 
       try { 

        System.out.println("what is sent"+new String(packet.getData())); 
        socket.send(packet); 
        Thread.sleep(1000); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
        parent.quit(); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
        parent.quit(); 
       } 
      } 
     } 
    }; 


    receiver = new Runnable() { 
     public void run() { 
      byte data[] = new byte[0]; 
      DatagramSocket socket = null; 
      try { 
       socket = new DatagramSocket(9090); 
      } catch (SocketException ex) { 
       ex.printStackTrace(); 
       //parent.quit(); 
      } 
      DatagramPacket packet = new DatagramPacket(data, data.length); 
      //System.out.println("this is what has been received"+packet.getData()); 
      String temp; 
      // while (run) { 
       try { 
        socket.receive(packet); 
        System.out.println("this is what has been received"+packet.getData()); 

        //System.out.println("Message received ..."+ temp); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
        parent.quit(); 
       } 

      //} 
     } 
    }; 


    new Thread(sender).start(); 
    new Thread(receiver).start(); 

} 

    public void quit() { 
    run = false; 
    } 
} 

然後我有以下的類來處理我的溝通

public class UDPSocketHandler { 

    private final Broadcasts broadcasts; 
// continue running application? 
    private boolean run = true; 

    public UDPSocketHandler() throws UnknownHostException 
    { 
    // start socket server to accept incoming connections 
    new Thread().start(); 


    // late initialize of UDP broadcast and receive, to ensure needed 
    // objects are instantiated 
    broadcasts = new Broadcasts(this); 
} 

// global quit method shuts down everything and exits 
public void quit() { 
    run = false; 
    broadcasts.quit(); 
    System.exit(0); 
} 

// application entry 
    public static void main(String[] args) throws UnknownHostException{ 
    new UDPSocketHandler(); 

    } 
} 

的問題是,接收器沒有收到任何東西。根據我的理解,我們可以運行發件人並使用此question中顯示的同一程序接收。這實際上是我想要做的,但使用UDP而不是TCP。我的代碼有什麼問題?

回答

0

經過一些努力和幾個小時後,我終於設法讓我的程序工作。我有以下內容:

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.*; 

public class SocketTest { 
    private boolean run = true; 


    public static void main(String[] args) throws IOException { 

    startServer(); 
    startSender(); 
    } 

    public static void startSender() throws UnknownHostException{ 
    InetAddress aHost = InetAddress.getLocalHost(); 
    (new Thread() { 
     @Override 
     public void run() { 
      byte data[] = "Hello".getBytes(); 
      DatagramSocket socket = null; 
      try { 
       socket = new DatagramSocket(); 
       socket.setBroadcast(true); 
      } catch (SocketException ex) { 
       ex.printStackTrace(); 
       //parent.quit(); 
      } 

      DatagramPacket packet = new DatagramPacket(
        data, 
        data.length, 
        aHost, 
        9090); 
      int i=0; 
      while (i<10) { 
       try { 

        System.out.println("what us mmmm.."+new String(packet.getData())); 
        socket.send(packet); 
        Thread.sleep(50); 
        i++; 
        System.out.println(i); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
        // parent.quit(); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
        // parent.quit(); 
       } 
      } 
     }}).start(); 
    } 


    public static void startServer() { 
    (new Thread() { 
     @Override 
     public void run() { 

       //byte data[] = new byte[0]; 
       DatagramSocket socket = null; 
       try { 
        socket = new DatagramSocket(9090); 
        //socket.setBroadcast(true);; 

       } catch (SocketException ex) { 
        ex.printStackTrace(); 
        //parent.quit(); 
       } 
       DatagramPacket packet = new DatagramPacket(new byte[1024], 1024); 
       //System.out.println("this is what has been received111"+packet.getData()); 
       String temp; 
       while (true) { 
       try { 
        socket.receive(packet); 
        temp=new String(packet.getData()); 
        System.out.println("this is what has been received"+temp); 


        //System.out.println("Message received ..."+ temp); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
        //parent.quit(); 
       } 

       } 
      } 

    }).start(); 
} 
} 

通過此代碼,每個節點都可以充當客戶端和服務器。我們所要做的就是傳遞我們發送請求的服務器的正確端口號。在此示例代碼中,端口號與發送數據包給自己的客戶端相同。我希望這可以幫助其他人

相關問題