Java Socketによる圧縮オブジェクトの伝送方法の例
本明細書の例は、Java Socketが送信圧縮オブジェクトを実現する方法を説明する。皆さんに参考にしてあげます。具体的には以下の通りです。
先の記事「Java Socketで実現される伝送対象機能例」ではJava Socketでオブジェクトを転送することについて言及しましたが、ネットワーク環境が良くない、またはオブジェクトが大きい場合はデータオブジェクトを圧縮して転送する必要があり、これらのオブジェクトストリームを圧縮する必要があります。この場合はGZIPPInputStreamとGZIPPOutputStreamでsocketのInputStreamを処理することができます。
java.io.Serializableインターフェースを実現した簡単なJavaオブジェクトがまだ必要です。
java関連の内容についてもっと興味がある読者は、当駅のテーマを調べてもいいです。「Java Socketプログラミング技術のまとめ」、「Javaファイルとディレクトリの操作テクニックのまとめ」、「Javaデータ構造とアルゴリズム教程」、「Java操作DOMノード技術のまとめ」、「Javaキャッシュ操作テクニックのまとめ」
本論文で述べたように、皆さんのjavaプログラムの設計に役に立ちます。
先の記事「Java Socketで実現される伝送対象機能例」ではJava Socketでオブジェクトを転送することについて言及しましたが、ネットワーク環境が良くない、またはオブジェクトが大きい場合はデータオブジェクトを圧縮して転送する必要があり、これらのオブジェクトストリームを圧縮する必要があります。この場合はGZIPPInputStreamとGZIPPOutputStreamでsocketのInputStreamを処理することができます。
java.io.Serializableインターフェースを実現した簡単なJavaオブジェクトがまだ必要です。
package com.googlecode.garbagecan.test.socket.sample4;
public class User implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private String name;
private String password;
public User() {
}
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
Server側で使用して、socketのInputStreamはまずGZIPPInputStreamに包装されて、Object InputStreamに包装されました。そして、socketのOutputStreamはまずGZIPPOut Streamに包装されました。
package com.googlecode.garbagecan.test.socket.sample4;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class MyServer {
private final static Logger logger = Logger.getLogger(MyServer.class.getName());
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(10000);
while (true) {
Socket socket = server.accept();
socket.setSoTimeout(10 * 1000);
invoke(socket);
}
}
private static void invoke(final Socket socket) throws IOException {
new Thread(new Runnable() {
public void run() {
GZIPInputStream gzipis = null;
ObjectInputStream ois = null;
GZIPOutputStream gzipos = null;
ObjectOutputStream oos = null;
try {
gzipis = new GZIPInputStream(socket.getInputStream());
ois = new ObjectInputStream(gzipis);
gzipos = new GZIPOutputStream(socket.getOutputStream());
oos = new ObjectOutputStream(gzipos);
Object obj = ois.readObject();
User user = (User)obj;
System.out.println("user: " + user.getName() + "/" + user.getPassword());
user.setName(user.getName() + "_new");
user.setPassword(user.getPassword() + "_new");
oos.writeObject(user);
oos.flush();
gzipos.finish();
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
} catch(ClassNotFoundException ex) {
logger.log(Level.SEVERE, null, ex);
} finally {
try {
ois.close();
} catch(Exception ex) {}
try {
oos.close();
} catch(Exception ex) {}
try {
socket.close();
} catch(Exception ex) {}
}
}
}).start();
}
}
ClientもServer端と似ています。socketのXXStreamをGZIPPOXStreamに包装してからObject XStreamに包装します。
package com.googlecode.garbagecan.test.socket.sample4;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class MyClient {
private final static Logger logger = Logger.getLogger(MyClient.class.getName());
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
Socket socket = null;
GZIPOutputStream gzipos = null;
ObjectOutputStream oos = null;
GZIPInputStream gzipis = null;
ObjectInputStream ois = null;
try {
socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress("localhost", 10000);
socket.connect(socketAddress, 10 * 1000);
socket.setSoTimeout(10 * 1000);
gzipos = new GZIPOutputStream(socket.getOutputStream());
oos = new ObjectOutputStream(gzipos);
User user = new User("user_" + i, "password_" + i);
oos.writeObject(user);
oos.flush();
gzipos.finish();
gzipis = new GZIPInputStream(socket.getInputStream());
ois = new ObjectInputStream(gzipis);
Object obj = ois.readObject();
if (obj != null) {
user = (User)obj;
System.out.println("user: " + user.getName() + "/" + user.getPassword());
}
} catch(IOException ex) {
logger.log(Level.SEVERE, null, ex);
} finally {
try {
ois.close();
} catch(Exception ex) {}
try {
oos.close();
} catch(Exception ex) {}
try {
socket.close();
} catch(Exception ex) {}
}
}
}
}
最後に上のコードをテストして、まずServerクラスを実行して、Cientクラスを実行して、それぞれServer端とCient端コンソールで受信したUserオブジェクトのインスタンスを見ることができます。java関連の内容についてもっと興味がある読者は、当駅のテーマを調べてもいいです。「Java Socketプログラミング技術のまとめ」、「Javaファイルとディレクトリの操作テクニックのまとめ」、「Javaデータ構造とアルゴリズム教程」、「Java操作DOMノード技術のまとめ」、「Javaキャッシュ操作テクニックのまとめ」
本論文で述べたように、皆さんのjavaプログラムの設計に役に立ちます。