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

时间:2015-03-11 07:13:44

标签: java sockets streaming apache-spark serversocket

我创建了一个服务器套接字程序,用于将流数据发送到Apache spark.But数据在我关闭套接字或终止program.i需要发送数据而不关闭套接字和终止程序后由spark接收。

 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);
    }

仍然无法正常工作。

请帮助..

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-2)

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

其次我相信它的工作方式是,当从套接字流中读取时,它会读取直到达到流的末尾(即套接字关闭)。要提前完成阅读,您需要发送“流结束”而不关闭它。