0

サーバーが 2 つのクライアントからのメッセージを受け入れられるようにしたいと考えています。しかし、何かがうまくいかなかった。助けが必要です!同じクライアントを 2 回実行しようとしましたが、1 つのメッセージといくつかのエラーしか受け取りませんでした。

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

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

        Listner listner = new Listner();
        Thread thread = new Thread(listner);
        thread.start();

        System.out.println("thread already started");
      
        DatagramSocket s = new DatagramSocket(8787);

        byte[] receiveData = new byte[1024];
       
        System.out.println ("Waiting for datagram packet");

        DatagramPacket p = new DatagramPacket(receiveData, receiveData.length); 
                
        System.out.println("about to receive packet N1");
        s.receive(p);
        
        String sentence = new String(p.getData()); 
        InetAddress IPAddress = p.getAddress(); 
        int port = p.getPort(); 
  
        System.out.println ("From: " + IPAddress + ":" + port);
        System.out.println ("Message: " + sentence);

       
        
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            e.printStackTrace();
        }
       
        receiveData = new byte[1024];
    
        System.out.println ("Waiting for datagram packet");
        p =  new DatagramPacket(receiveData, receiveData.length); 
                
        System.out.println("about to receive packet N2");
      
        s.receive(p);
        sentence = new String(p.getData()); 
        IPAddress = p.getAddress(); 
        port = p.getPort(); 
}

}


class Listner implements Runnable
    { 
           
        public void run() {
        String text = null;
        while(true){
            text = null;    
        int server_port = 8787;
       
         byte[] receiveData = new byte[1024];
        DatagramPacket p = new DatagramPacket(receiveData, receiveData.length); 
        DatagramSocket s = null;
        try{
           s = new DatagramSocket(server_port);
        }catch (SocketException e) {
            e.printStackTrace();
            System.out.println("Socket excep, port used");
        }
        try {
        s.receive(p);
       }catch (IOException e) {
            e.printStackTrace();
                System.out.println("IO EXcept");
            }
        text = new String(receiveData, 0, p.getLength());
        System.out.println("message = "+text);
        s.close();

    }
}

}

走る:

スレッドはすでに開始されています

パケット N1 を受信しようとしているデータグラム パケットを待機中

java.net.BindException: Address already in use: Cannot bind
  at java.net.PlainDatagramSocketImpl.bind0(Native Method)
  at java.net.PlainDatagramSocketImpl.bind(PlainDatagramSocketImpl.java:91)
  at java.net.DatagramSocket.bind(Socket excep, port used
DatagramSocket.java:372)
  at java.net.DatagramSocket.<init>(DatagramSocket.java:211)
  at java.net.DatagramSocket.<init>(DatagramSocket.java:262)
  at java.net.DatagramSocket.<init>(DatagramSocket.java:235)
  at serv1.Listner.run(Listner.java:29)
  at java.lang.Thread.run(Thread.java:662)
Exception in thread "Thread-0" java.lang.NullPointerException
  at serv1.Listner.run(Listner.java:35)
  at java.lang.Thread.run(Thread.java:662)
From: /192.168.1.102:58977
Message: hi, i am the first one
Waiting for datagram packet
about to receive packet N2
BUILD SUCCESSFUL (total time: 59 seconds)**strong text**
4

2 に答える 2

0

同じポートを 2 回バインドしようとしています。それはそれがどのように機能するかではありません。ポートをリッスンする 1 つのスレッドと、要求を処理するためのスレッドのプールが必要です。新しい情報がポートを介して受信されるたびに、リクエスト データ (受信した新しい情報) をスレッドに渡して処理します。

于 2013-04-11T00:30:34.917 に答える
0

DatagramSocket同じポート (8787) で2 を作成しています。1 つはメイン メソッドで作成され、もう 1 つはListner内部クラスのrun()メソッドで作成されます。

ここで何をしようとしているのかわかりませんが、Listnerクラスの DatagramSocket を別のポートで実行するか、main()メソッドによって作成されたものをListnerクラスに渡す必要があります。

于 2013-04-11T00:30:54.590 に答える