如何在不关闭套接字的情况下在 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()
方法。您还需要关闭接受的套接字,以及服务器套接字。
我创建了一个服务器套接字程序来向 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()
方法。您还需要关闭接受的套接字,以及服务器套接字。