如何在不关闭套接字的情况下在 java 套接字程序中发送数据

How to send data in a java socket program without closing socket

我创建了一个服务器套接字程序来向 Apache 发送流数据 spark.But 在我关闭套接字或终止后由 spark 接收数据 program.i 需要在不关闭套接字和终止的情况下发送数据程序。

 import java.io.DataOutputStream;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.util.Scanner;

public class SocketServer {
public static void main(String[] args) {
    try {
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept();// establishes connection

        DataOutputStream dout = new DataOutputStream(s.getOutputStream());
        Scanner scanner = new Scanner(System.in);
        String s1 = "";
        while (!s1.equals("end")) {
            s1 = scanner.next();
            dout.writeUTF(s1);
            dout.flush();
        }
     ss.close();
    } catch (Exception e) {r
        System.out.println(e);
    }
  }
}

我可以使用 nc 服务器 nc -lk 9999.

以流的形式发送数据

编辑 -1 尝试使用 println

try {
        ServerSocket ss = new ServerSocket(6000);
        Socket s = ss.accept();// establishes connection

        OutputStream ostream = s.getOutputStream();
        PrintWriter pwrite = new PrintWriter(ostream, true);
        Scanner scanner = new Scanner(System.in);
        String s1 = "";
        while (!s1.equals("end")) {
            s1 = scanner.next();
            pwrite.println(s1);
            pwrite.flush();
        }
        ss.close();
    } catch (Exception e) {
        System.out.println(e);
    }

还是不行。

请帮忙..

首先,你应该只实例化 dout 一次(在 while 循环开始之前)。

其次,我相信它的工作方式是,当从套接字流中读取时,它会一直读取直到到达流的末尾(即套接字已关闭)。要尽早完成阅读,您需要发送 "end of stream" 而不是关闭它。

除非 Apache Spark (a) 用 Java 编写并且 (b) 调用 readUTF(),否则您使用了错误的发送方法。您可能应该使用 println() 方法。您还需要关闭接受的套接字,以及服务器套接字。