0

現在、NIO SocketChannelを通じてシリアル化されたオブジェクトを読み書きしようとしています。このSocketChannelは非ブロックモードです。私はこれが私の現在の読み取り方法である。これは私の現在の書き込み方法ノンブロッキングモードでSocketChannel経由で直列化オブジェクトを読み書きする方法は?

private void writeData(SelectionKey key) throws IOException { 
    Packet outPacket = null; 
    synchronized (pendingPacketQue) { 
     for (Packet packet : pendingPacketQue) { 
      if (packet.getChannel().keyFor(selector).equals(key)) { 
       outPacket = packet; 
       break; 
      } 
     } 
    } 
    if (outPacket == null) { 
     Logger.writeException("Couldn't find out bound packet in list.", LogType.SERVER); 
     return; 
    } 
    SocketChannel connection = (SocketChannel) outPacket.getChannel(); 
    ObjectOutputStream outStream = new ObjectOutputStream(connection.socket().getOutputStream()); 
    outStream.writeObject(outPacket); 
    outStream.flush(); 
    outStream.close(); 
    connection.keyFor(selector).interestOps(SelectionKey.OP_READ); 
} 

ある...など、ストリームヘッダをcorruping、ストリームを破壊することなく、それを行うための正しい方法を見つけること

に見えることはできません

private void readData(SelectionKey key) throws IOException, ClassNotFoundException { 
    SocketChannel connection = (SocketChannel) key.channel(); 
    buffer.clear(); 
    int byteCount; 
    try { 
     byteCount = connection.read(buffer); 
    } catch (IOException e) { 
     Logger.writeException("Connenction terminated.", LogType.SERVER); 
     connection.close(); 
     key.cancel(); 
     return; 
    } 
    if (byteCount == -1) { 
     Logger.writeException("Connection error. Terminating connection.", LogType.SERVER); 
     key.channel().close(); 
     key.cancel(); 
     return; 
    } 
    Engine.getInstance().getPacketProcessor().processData(connection, buffer.array(), byteCount); 
} 

public void processData(SocketChannel connection, byte[] data, int count) 
     throws IOException, ClassNotFoundException { 
    ByteArrayInputStream byteStream = new ByteArrayInputStream(data); 
    ObjectInputStream inStream = new ObjectInputStream(byteStream); 
    addToQue(inStream.readObject()); 
    inStream.close(); 
} 

ご質問がある場合はお気軽にお問い合わせください。ありがとうございました!

答えて

2

1回の読み込みでオブジェクト全体を必ずしも読み取る必要はありません。

あなたはこのようにあなたの書き込みを行うことはできません。非ブロックモードでは、SocketChannelのソケットのストリームは使用できません。送信者にIllegalBlockingModeExceptionがあるはずです。

それでは、おそらく最初に何かを書いたことがないと、ストリームヘッダーなどが破損している可能性があります。

いずれにしても、私は強くを使用しないことをお勧めします。難しすぎる。あなたはオブジェクトの前にオブジェクトのサイズを送信する必要がありますので、あなたがそれをすべて読んだことを知っているので、複数の読み取りを発行し、結果を保存するまで、等を実行します。java.net.Socketと通常のオブジェクト入力出力ストリームを直接出力する。

+0

SocketChannelで行うことはできませんか?そうすれば、それはノンブロッキングである可能性があります。 – Bautista

+0

私はそれができないと言わなかった。私はそれが難しいと言った。シリアルプロトコルは、ストリーミングプロトコルに最適です。 – EJP

関連する問題