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);
}
}
ありがとう:
は、ここに私のクライアントクラスです。
アプリケーションスレッド以外のスレッドからuiを更新することは悪い考えです。 – fabian