我正在尝试创建一个侦听websocket的Web应用程序,当消息到达时,它会收到它并在" normal"上再次发送它。 socket 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();
}
}
}
我对代码的期望是服务器应用程序应该接收消息并将其打印在屏幕上。 会发生什么是第二个应用程序什么都没有收到(甚至不为空)
如果我用这个简单的代码替换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库的理解。
答案 0 :(得分:1)
如上面的评论中所述,默认情况下缓存PrintWriter
,默认缓冲区大小通常相当大(8192字节)。除此之外,PrintWriter
的自动刷新(换行)为off by default。
由于您永远不会flush()
编写器并因此强制输出,PrintWriter
可能仍然将您的数据隐藏在其缓冲区中。连续输出似乎也有效,这也证明了这一点。
因此:
writer.println("vvvvvvvvvvvvvv");
writer.flush();
// ^^^^^^^ add this