Javascript自体には、rawソケットを介して通信する機能がないため、Javaアプレットを使用することにしました。ユーザーがブラウザでJavaアプレットを無効にした場合は、Javascriptと統合するフラッシュソケットブリッジを使用します。同じ問題に直面するために、jsxmlsocketとhaxejssocketの両方を試してみました
現在、サーバーアプリケーションはJavaで記述されており、通信はJavaアプレット上で正常に機能します。しかし、フラッシュでは問題があるようです。
flashが受信する最初のテキストは、すべてのドメインとポートへのアクセスを許可する<policy-file-request/>への応答です。ソケットが通信を開始するため、これは正常に機能します
データを受信したときに実行されるJavascriptコードは次のとおりです。
socket.onData = function(data) {
alert(data);
parse(data);
}
さて、ここに問題があります。<policy-file-request />への応答が送信された後、さらに5行のテキストが送信されます。もちろん、テキストが送信された5つのアラートボックスが表示されることが期待されます。そうではないようです。代わりに、<policy-file-request/>への応答が含まれた5つのアラートボックスが表示されます。何かが送信されているようです。OnData関数が正しい時間に起動しているように見えますが、何らかの理由で、データは送信されたテキストの最初の行のようです。
データの送信を処理するJavaスレッド:
LinkedBlockingQueue<String> outQueue=new LinkedBlockingQueue<String>(1000);
public Thread checkSendLoop=new Thread(){ //this is done to cramp everything in one file. Also more neater
public void run(){
try{
OutputStream out=socket.getOutputStream();
while (true){
String mes=outQueue.take();
mes=mes.replace("\n", "").replace("\r", ""); //for safety
mes=mes+"\0"; //append
out.write(mes.getBytes());
out.flush();
}
}
catch (Exception e){
System.out.println("FATAL : Data to a client will not be sent anymore."); //probably a socket close threw the exception
outQueue.clear();
outQueue=null;
}
}
};
データを送信するために、送信関数が呼び出されます。
public void send(String s){
Queue<String> testQueue = outQueue;
s=s+" "+getUnixTime();
if (testQueue!=null){
System.out.println("SENDING "+nick+" - "+s);
testQueue.add(s); //just add to the queue , the check loop will make sure that its sent
}
}
ご覧のとおり、送信されるすべてのデータはnullバイトまたは\0で終わります。多分これは責任がありますか?
注:ここで強調したいのは、私はWebSocketに精通しており、WebSocketが「はるかに適切」である方法に精通しているため、そのことを示唆しないでください。
前述のように、TelnetやJavaアプレットなどの他のクライアントでは正常に機能します。
更新:いいえ、これはこの質問の複製ではありません。私の問題は、<policy-file-request/>
すべてのonData
呼び出しで応答のみを返すスクリプトに関係しています。プロセスでスローされる「エラー」はありません。