2016-11-26 21 views
0

私はUDP(1台のサーバの複数のクライアント)でチャットメッセンジャーを作ろうとしています。ここで私のクライアントは、名前、友人名(誰と接続したいか)、サーバー名、リスニングポート、サーバーIPを持つサーバーに初期メッセージを送信し、サーバーに私の友達に渡すメッセージをサーバーに再度送信します。その後、サーバーは同じメッセージを友人に送信し、友人は自分のウィンドウにそれを表示します。UDPでメッセージを送信する際の無限ループ

しかし、私は友人にサーバー経由でメッセージを送信すると、サーバーはメッセージを繰り返し受信して無限ループを作成し、友人のウィンドウには何も表示されません。私は何をすべきか?事前に

public class NewClient extends Application{ 

Thread send; 
Thread accept; 
DatagramPacket pack; 
DatagramSocket sock; 
private List<String> str; 
String name, sname; 
int listeningPort; 
InetAddress server_ip; 
String sender; 
ScrollPane sp = new ScrollPane(); 
TextFlow textFlow = new TextFlow(); 
private String message; 
private String recip=null; 
Button button = new Button("Send"); 
volatile boolean st = false; 
Stage theStage; 
Scene scene,scene2; 
public Scene Chat_Box(){ 

    TextFlow textFlow = new TextFlow(); 
    textFlow.setPadding(new Insets(10)); 
    textFlow.setLineSpacing(10); 
    TextField textField = new TextField(); 
    textField.setPrefSize(50,30); 
    Button button = new Button("Send"); 
    button.setPrefSize(80,30); 
    VBox container = new VBox(); 
    VBox box = new VBox(); 
    box.getChildren().addAll(sp,textFlow); 
    container.setPadding(new Insets(10)); 
    container.getChildren().addAll(box, new HBox(textField, button)); 
    VBox.setVgrow(sp, Priority.ALWAYS); 
    VBox.setVgrow(textFlow, Priority.ALWAYS);  textField.prefWidthProperty().bind(container.widthProperty().subtract(button.prefWidthProperty())); 

    textField.setOnKeyPressed(e -> { 
     if(e.getCode() == KeyCode.ENTER) { 
      button.fire(); 
     } 
    }); 
    button.setOnAction(e -> { 
     st = true; 
     Text text; 
     if(textFlow.getChildren().size()==0){ 
      text = new Text(textField.getText()); 
      message = textField.getText(); 
     } else { 
      text = new Text("\n" + textField.getText()); 
     } 
     if(textField.getText().contains(":)")) { 
      ImageView imageView = new ImageView("http://files.softicons.com/download/web-icons/network-and-security-icons-by-artistsvalley/png/32x32/Regular/Friend%20Smiley.png"); 
      // Remove :) from text 
      text.setText(text.getText().replace(":)"," ")); 
      textFlow.getChildren().addAll(text, imageView); 
     } 
     else { 
      textFlow.getChildren().add(text); 
     } 
     textField.clear(); 
     textField.requestFocus(); 
    }); 
    VBox vb = new VBox(); 
    vb.getChildren().addAll(textFlow); 
    sp.setVmax(440); 
    sp.setPrefSize(400, 300); 
    sp.setContent(vb); 
    sp.vvalueProperty().bind((ObservableValue<? extends Number>) vb.heightProperty()); 
    Scene scene2 = new Scene(container, 400, 300); 
    return scene2; 
} 
public void start(Stage stage) throws IOException { 
    this.str = getParameters().getRaw(); 
    name = str.get(0); 
    recip = str.get(1); 
    listeningPort = Integer.parseInt(str.get(2)); 
    server_ip = InetAddress.getByName(str.get(3)); 
    sname = str.get(4); 
    VBox vb = new VBox(); 
    StringBuffer str2 = new StringBuffer(); 
    str2.append("Via: "); 
    str2.append(sname + "\n"); 
    str2.append("To: " + sname + "\n"); 
    sock = new DatagramSocket(); 
    byte[] data = new byte[1024]; 
    data = String.valueOf(str2).getBytes(); 
    pack = new DatagramPacket(data, data.length, server_ip, 50); 
    sock.send(pack); 
    theStage = stage; 
    Scene scene = Chat_Box(); 
    stage.setScene(scene); 
    stage.show(); 
    send = new Thread() { 

     public void run() { 
      DatagramSocket sock = null; 
      try { 
       sock = new DatagramSocket(); 
      } catch (SocketException ex) { 
       Logger.getLogger(NewClient.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      while (true) { 
       InetAddress host = server_ip; 
       try { 
        if(st) { 
         String in = message; 
         byte[] data = new byte[1024]; 
         data = in.getBytes(); 
         DatagramPacket sendPack = new DatagramPacket(data, data.length); 
         sendPack.setPort(50); 
         sendPack.setAddress(host); 
         sock.send(sendPack); 
        } 
       } catch (Exception e) { 
        System.out.println(e); 
       } 
      } 
     } 

    }; 
    send.start(); 
    accept = new Thread() { 

     public void run() { 
      try { 
       sock = new DatagramSocket(listeningPort); 
      } catch (SocketException e) { 
       e.printStackTrace(); 
      } 
      while (true) { 
       byte[] data = new byte[1024]; 
       pack = new DatagramPacket(data, data.length); 
       try { 
        sock.receive(pack); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       String incoming = null; 
       try { 
        incoming = new String(data, "UTF-8"); 
        System.out.println(incoming); 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 
       String s1 = incoming.replaceAll("\n", " "); 
       Text text = new Text(s1); 
       textFlow.getChildren().add(text); 
      } 
     } 
    }; 
    accept.start(); 
} 
public static void main(String[] args) throws IOException { 
    launch(args); 
} 

} 

ありがとう:

は、ここに私のクライアントクラスです。

+1

アプリケーションスレッド以外のスレッドからuiを更新することは悪い考えです。 – fabian

答えて

0

あなたのループにブレークを追加する必要があると思います。

関連する問題