サーバ側
java同士なら問題ないけど、その他とつなぐときはIEEE754の表現に合わせるなど必要?
この例ではserverSocket.accept()で待ち受け開始、クライアント着信後に12byte分読み込める状態になったらbyte[]に読み込み。 その後、ByteBufferにwrap()して、getInt(),getDouble()で各データを取り出す。一応エンディアンはbigendianにしておいた。サーバではデータを受信したら表示するだけ。
追記) doubleやfloatなどの浮動小数点型を送信する場合にはもう少し考慮が必要かも。java同士なら問題ないけど、その他とつなぐときはIEEE754の表現に合わせるなど必要?
package test.socket; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.ByteOrder; public class server { private static int port = 11111; private static int datasize = (Integer.SIZE + Double.SIZE) / 8; public static void main(String[] args) throws IOException, InterruptedException { ServerSocket serverSocket = null; InputStream in = null; try { serverSocket = new ServerSocket(port); Socket socket = serverSocket.accept(); System.out.println("connected"); in = socket.getInputStream(); while (!socket.isClosed()) { int size = in.available(); if (size >= datasize) { byte[] data = new byte[datasize]; in.read(data, 0, datasize); ByteBuffer buf = ByteBuffer.wrap(data); buf.order(ByteOrder.BIG_ENDIAN); System.out.println(buf.getInt(0) + ": " + buf.getDouble(Integer.SIZE / 8)); } Thread.sleep(100); } } finally { if (in != null) in.close(); if (serverSocket != null) serverSocket.close(); } } }
クライアント側
new Socket(hostName, port)でソケット作成。 その後、ByteBuffer.allocate(datasize)で12byteのデータ格納エリアを作り、intとdoubleの値を入れてwrite()する。これを100回繰り返し。
package test.socket; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.nio.ByteBuffer; public class client { private static String hostname = "localhost"; private static int port = 11111; private static int datasize = (Integer.SIZE + Double.SIZE)/8; public static void main(String[] args) throws IOException, InterruptedException { OutputStream out = null; try { out = (new Socket(hostname, port)).getOutputStream(); for (int i = 0; i < 100; i++) { ByteBuffer buf = ByteBuffer.allocate(datasize); buf.putInt(i).putDouble(Math.random()); out.write(buf.array()); Thread.sleep(100); } } finally { if (out != null) out.close(); } } }
結果
connected 0: 0.4699143388898742 1: 0.2983774724033843 2: 0.12623749040407317 3: 0.19952009860520947 4: 0.10241603823568246 5: 0.6230472332876812 :
0 件のコメント:
コメントを投稿