我创建了一个服务器套接字程序,用于将流数据发送到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);
}
仍然无法正常工作。
请帮助..
答案 0 :(得分:0)
除非Apache Spark(a)用Java编写,(b)调用readUTF()
,否则你使用错误的方法发送。您可能应该使用println()
方法。您还需要关闭接受的套接字以及服务器套接字。
答案 1 :(得分:-2)
首先,你应该只实例化一次dout(在while循环开始之前)。
其次我相信它的工作方式是,当从套接字流中读取时,它会读取直到达到流的末尾(即套接字关闭)。要提前完成阅读,您需要发送“流结束”而不关闭它。