Java套接字只发送一次

时间:2016-03-05 23:21:57

标签: java sockets

我正在编写一个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();
        }

顺便说一句,没有错误。控制台很干净。只打印第一个数据。

1 个答案:

答案 0 :(得分:1)

您只接受一个连接。您需要在循环中调用accept()。根据您的应用程序协议,您可能还需要在循环中调用readLine(),直到它返回null。如果要同时为客户端提供服务,则需要为每个接受的连接启动一个新线程,而不是在接受线程中内联处理其I / O.