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

我正在编写一个java应用程序。我试图用相同的程序和端口在本地主机上发送数据和接收数据。我的代码正在工作,但只收到第一个数据。例如,我尝试先发送“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);
    }
}
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的建议,直到您知道有线程问题为止。