【发布时间】:2017-03-18 17:06:51
【问题描述】:
我有以下设置: Index.html(网页)
<div id="sse">
<a href="javascript:WebSocketTest()">Run WebSocket</a>
<a href="javascript:websocketsend()">Send message</a>
</div>
<script type="text/javascript">
var ws;
function WebSocketTest()
{
if ("WebSocket" in window)
{
console.log("WebSocket is supported by your Browser!");
// Let us open a web socket
ws = new WebSocket("ws://localhost:6790/");
ws.onopen = function()
{
// Web Socket is connected, send data using send()
ws.send("Hello_World!");
console.log("Message is sent...");
};
ws.onmessage = function (evt)
{
var received_msg = evt.data;
console.log("Message is received...");
};
ws.onclose = function(event)
{
var reason;
// websocket is closed.
console.log(event.code);
console.log("closed.")
}
ws.onerror = function (evt)
{
console.log(evt);
}
}
else
{
// The browser doesn't support WebSocket
console.log("WebSocket NOT supported by your Browser!");
}
}
</script>
Java 套接字服务器
private String decodeMessage(InputStream in) {
Main.debug(in + "");
try {
in.skip(2);
ArrayList<Byte> keys = new ArrayList<Byte>();
for(int i = 0; i < 4; i++){
int r = in.read();
Main.debug("added: " + r);
keys.add((byte) r);
}
ArrayList<Byte> encoded = new ArrayList<Byte>();
for(int i = 0; i < in.available(); i++){
int r = in.read();
Main.debug("added2: " + r);
encoded.add((byte) r);
}
ArrayList<Byte> decoded = new ArrayList<Byte>();
for(int i = 0; i < encoded.size(); i++){
decoded.add((byte) (encoded.get(i) ^ keys.get(i & 0x3)));
Main.debug("Decoded: " + (encoded.get(i) ^ keys.get(i & 0x3)));
}
Main.debug("Total: " + decoded);
String s = new String(toByteArray(decoded), "US-ASCII");
Main.debug("Text: " + s);
} catch(IOException e) {
}
return null;
}
public static byte[] toByteArray(List<Byte> in) {
final int n = in.size();
byte ret[] = new byte[n];
for (int i = 0; i < n; i++) {
ret[i] = in.get(i);
}
return ret;
}
问题是消息可以正常通过,但是我将其作为输出 (除了“添加”和“解码”调试消息,
[19:42:02 信息]:总计:[72、101、108、108、111、95] [19:42:02 INFO]:文本:Hello_
所以“世界!”即使我用空格替换 _ 也会丢失。 有什么我忽略的吗?
我希望有人可以在这里给我一个提示。 提前致谢!
【问题讨论】:
-
使用
available()不是从InputStream读取所有数据的可靠方法。 -
@Titus 还有什么办法?
-
您重新读取来自
InputStream的数据,直到您到达文件EOF的末尾或直到读取了整条消息。第二个选项(直到读取整条消息)取决于您使用的协议,如果您想自己实现websocket协议,您必须阅读文档以了解它是如何工作的。跨度> -
在我看来,您应该使用实现
websocket协议的库。你应该看看这个:stackoverflow.com/questions/4003102/… -
@Tinus 谢谢,你给了我解决方案,我实际上必须使用 DataInputStream 和 while(dis.available()) 。现在它完全可以工作了。谢谢!
标签: javascript java websocket inputstream