简体   繁体   English

UDP中发送消息的无限循环

[英]Infinite loop in sending message in UDP

I'm trying to make a chat-messenger in UDP (one server multiple client). 我正在尝试在UDP(一个服务器多个客户端)中创建聊天信使。 Here my client sends an initial message to Server with its name,friend name(with whom i want to connect),Server name,listening port and server ip and then i again send message to server that i want to pass to my friend by server. 在这里,我的客户端向服务器发送一条初始消息,其名称,朋友名称(我想与之连接),服务器名称,监听端口和服务器ip,然后我再次向服务器发送消息,我希望通过服务器传递给我的朋友。 Then Server sends the same messeage to my friend and my friend shows it in his window. 然后,服务器将相同的消息发送给我的朋友,我的朋友在他的窗口中显示该消息。

But when i send message to my friend through server, server receives the message repeatedly creating an infinite loop and my friend's window doesn't show anything. 但是,当我通过服务器向朋友发送消息时,服务器反复收到消息,从而形成无限循环,而朋友的窗口却什么也不显示。 What should i do? 我该怎么办?

Here is my Client class: 这是我的客户类:

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);
}

}

Thanks in advance. 提前致谢。

我认为您需要在循环中添加一个中断

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM