Java套接字只发送一次数据
我正在编写一个java应用程序。我试图用相同的程序和端口在本地主机上发送数据和接收数据。我的代码正在工作,但只收到第一个数据。例如,我尝试先发送“1”,它被打印到控制台。然后我尝试发送“2”,但它没有打印出来 Main.java:Java套接字只发送一次数据,java,sockets,Java,Sockets,我正在编写一个java应用程序。我试图用相同的程序和端口在本地主机上发送数据和接收数据。我的代码正在工作,但只收到第一个数据。例如,我尝试先发送“1”,它被打印到控制台。然后我尝试发送“2”,但它没有打印出来 Main.java: package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene
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);
}
}
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();
}
}
}
Controller.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);
}
}
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();
}
}
}
我试过什么?
*我说只收到了第一个数据,因为我尝试了两个不同的应用程序来发送数据,结果都是一样的
*我在收到数据后尝试关闭套接字并再次启动它。如果我手动执行此操作(使用我在Controller.java中编写的javafxgui.triggereddinlemedur函数),它就会工作。但是当我尝试关闭并重新启动代码(在打印数据之后)时,它不起作用
我的意思是(Controller.java中的portudine函数):
这是可行的,但我很好奇我是否必须像这样重新启动服务器?(Controller.java portudile func.)
顺便说一下,没有错误。控制台是干净的。只打印第一个数据 您只接受一个连接。您需要在循环中调用
accept()
。根据您的应用程序协议,您可能还需要在循环中调用readLine()
,直到它返回null。如果要同时为客户机提供服务,则需要为每个接受的连接启动一个新线程,而不是在接受线程中内联处理其I/O。如果要同时为客户机提供服务,则应为每个客户机启动一个新线程。我已经说过了。注释工具不是教你如何开始一个线程。有很多例子。例如,请参阅Java教程的自定义网络部分。首先。看看相关的SE问题:@RasimAndıran每次接受新客户机时都会启动一个新线程。我已经说过三次了。哪一部分你不明白?顺便说一下,1000个线程算不了什么,有些服务器有100k个线程。您应该忽略查看NIO的建议,直到您知道有线程问题为止。