現在、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();
}
ご質問がある場合はお気軽にお問い合わせください。ありがとうございました!
SocketChannelで行うことはできませんか?そうすれば、それはノンブロッキングである可能性があります。 – Bautista
私はそれができないと言わなかった。私はそれが難しいと言った。シリアルプロトコルは、ストリーミングプロトコルに最適です。 – EJP