为什么我不能在我的 Java Web 套接字应用程序中写入我的 PrintWriter?
Why can't i write to my PrintWriter in my Java Web Socket Application?
我正在尝试制作一个侦听 websocket 的 Web 应用程序,当消息到达时它会接收它并在 "normal" 套接字 java.net.Socket 上再次发送它,这样另一个服务器应用程序就会侦听和收到。
这是我的 Web 应用程序的代码
@ServerEndpoint("/messageendpoint")
public class WebListener {
private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());
public static Session thisPeer;
public static Socket socket;
public static PrintWriter writer;
public static OutputStream output1;
@OnOpen
public void onOpen (Session peer) {
peers.add(peer);
try {
socket = new Socket("localhost", 9003);
output1 = socket.getOutputStream();
writer = new PrintWriter(output1);
} catch (IOException e) {
e.printStackTrace();
}
sendMessage("hello",peer);
System.out.println("an opening");
}
@OnMessage
public String onMessage(String message, Session session) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>"+message);
try {
writer.println("vvvvvvvvvvvvvv");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@OnClose
public void onClose (Session peer) {
peers.remove(peer);
}
}
这是另一个服务器的代码,它监听端口 9003 上的套接字
public class Buffer {
public static void main(String []args){
DataInputStream dis;
PrintStream ps;
BufferedReader in;
try {
ServerSocket serverSocket = new ServerSocket(9003);
Socket socket = serverSocket.accept();
//dis = new DataInputStream(socket.getInputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true) {
String str = dis.readLine();
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我对代码的期望是服务器应用程序应该接收消息并将其打印在屏幕上。
发生的情况是第二个应用程序什么也没收到(甚至没有收到 null)
如果我用这个简单的代码替换 Web 套接字应用程序,相同的代码运行完美并且收到消息。
public class TestSender {
public static void main(String []args){
Socket socket = null;
try {
socket = new Socket("localhost", 9003);
OutputStream output1 = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output1);
while (true) {
writer.println("hello");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这让我认为问题出在我对 javax.websocket 库的理解上。
如上面的评论所述,PrintWriter
默认情况下进行缓冲,默认缓冲区大小通常相当大(8192 字节)。除此之外,PrintWriter
的自动刷新(在换行符上)是 off by default.
由于您从未 flush()
编写器并因此强制写入输出,PrintWriter
可能您的数据仍隐藏在其缓冲区中。连续输出似乎有效的事实也证明了这一点。
因此:
writer.println("vvvvvvvvvvvvvv");
writer.flush();
// ^^^^^^^ add this
我正在尝试制作一个侦听 websocket 的 Web 应用程序,当消息到达时它会接收它并在 "normal" 套接字 java.net.Socket 上再次发送它,这样另一个服务器应用程序就会侦听和收到。
这是我的 Web 应用程序的代码
@ServerEndpoint("/messageendpoint")
public class WebListener {
private static Set<Session> peers = Collections.synchronizedSet(new HashSet<Session>());
public static Session thisPeer;
public static Socket socket;
public static PrintWriter writer;
public static OutputStream output1;
@OnOpen
public void onOpen (Session peer) {
peers.add(peer);
try {
socket = new Socket("localhost", 9003);
output1 = socket.getOutputStream();
writer = new PrintWriter(output1);
} catch (IOException e) {
e.printStackTrace();
}
sendMessage("hello",peer);
System.out.println("an opening");
}
@OnMessage
public String onMessage(String message, Session session) {
System.out.println(">>>>>>>>>>>>>>>>>>>>>>"+message);
try {
writer.println("vvvvvvvvvvvvvv");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@OnClose
public void onClose (Session peer) {
peers.remove(peer);
}
}
这是另一个服务器的代码,它监听端口 9003 上的套接字
public class Buffer {
public static void main(String []args){
DataInputStream dis;
PrintStream ps;
BufferedReader in;
try {
ServerSocket serverSocket = new ServerSocket(9003);
Socket socket = serverSocket.accept();
//dis = new DataInputStream(socket.getInputStream());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while(true) {
String str = dis.readLine();
System.out.println(str);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
我对代码的期望是服务器应用程序应该接收消息并将其打印在屏幕上。 发生的情况是第二个应用程序什么也没收到(甚至没有收到 null)
如果我用这个简单的代码替换 Web 套接字应用程序,相同的代码运行完美并且收到消息。
public class TestSender {
public static void main(String []args){
Socket socket = null;
try {
socket = new Socket("localhost", 9003);
OutputStream output1 = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output1);
while (true) {
writer.println("hello");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
这让我认为问题出在我对 javax.websocket 库的理解上。
如上面的评论所述,PrintWriter
默认情况下进行缓冲,默认缓冲区大小通常相当大(8192 字节)。除此之外,PrintWriter
的自动刷新(在换行符上)是 off by default.
由于您从未 flush()
编写器并因此强制写入输出,PrintWriter
可能您的数据仍隐藏在其缓冲区中。连续输出似乎有效的事实也证明了这一点。
因此:
writer.println("vvvvvvvvvvvvvv");
writer.flush();
// ^^^^^^^ add this