我正在编写一个Java应用程序。我正在尝试使用相同的程序和相同的端口在localhost上发送数据和接收数据。我的代码正在运行但只收到第一个数据。例如,我尝试先发送“1”,然后打印到控制台。然后我尝试发送“2”但不打印。
Main.java:
package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(root, 360, 150));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
Controller.java:
package sample;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Controller {
@FXML
TextField gonderilecekVeri = new TextField();
TextField gonder_ip = new TextField();
int port = 12345;
ServerSocket dinle;
public void portuDinle() {
System.out.println("Portu Dinliyor...");
new Thread(() -> {
Socket baglanti;
String veri = null;
try {
dinle = new ServerSocket(port);
baglanti = dinle.accept();
BufferedReader gelen = new BufferedReader(new InputStreamReader(baglanti.getInputStream()));
veri = gelen.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if (veri != null) {
System.out.println(veri);
}
}).start();
}
public void dinlemeDurdur() {
System.out.println("Dinleme Durdu");
try {
dinle.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void veriGonder() {
String veri = gonderilecekVeri.getText();
String ipAdresi = gonder_ip.getText();
int gondermePortu = 12345;
try {
Socket gonder = new Socket(ipAdresi, gondermePortu);
DataOutputStream outToServer = new DataOutputStream(gonder.getOutputStream());
outToServer.writeBytes(veri + '\n');
outToServer.flush();
outToServer.close();
gonder.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
我尝试了什么?
*我说仅接收第一个数据,因为我尝试使用2个不同的app发送数据,结果两者都相同。
*我在接收数据后尝试关闭套接字并再次启动它。如果我手动执行此操作(使用我编码的javafx gui。在Controller.java中触发dinlemeDurdur func。)它可以正常工作。但是当我尝试关闭并重新启动代码(打印数据后)它不起作用。
我的意思是上面(Controller.java中的portuDinle函数):
if (veri != null) {
System.out.println(veri);
try {
dinle.close();
dinle = new ServerSocket(port);
baglanti = dinle.accept();
BufferedReader gelen = new BufferedReader(new InputStreamReader(baglanti.getInputStream()));
veri = gelen.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
这有效,但我很好奇我必须像这样重启服务器? (Controller.java portuDinle func。)
if (veri != null) {
System.out.println(veri);
dinlemeDurdur();
portuDinle();
}
顺便说一句,没有错误。控制台很干净。只打印第一个数据。
答案 0 :(得分:1)
您只接受一个连接。您需要在循环中调用accept()
。根据您的应用程序协议,您可能还需要在循环中调用readLine()
,直到它返回null。如果要同时为客户端提供服务,则需要为每个接受的连接启动一个新线程,而不是在接受线程中内联处理其I / O.