import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer;
public class ClientServerSocketSample {
private final static int port = 50000;
static class SimpleServerSession implements Runnable {
private Socket socket;
public SimpleServerSession(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedInputStream input = new BufferedInputStream(socket
.getInputStream());
BufferedOutputStream output = new BufferedOutputStream(socket
.getOutputStream());
while (true) {
// インプットストリームからバイトを取得
byte[] readByte = new byte[1024];
int streamSize = -1;
RecievedData data = new RecievedData();
while ((streamSize = input.read(readByte)) != -1) {
ByteBuffer re = ByteBuffer.wrap(new byte[streamSize]);
re.put(readByte, 0, streamSize);
data.putByte(re.array());
if (data.isCompleted()) {
break;
}
}
ByteBuffer bytebuf = ByteBuffer.wrap(new byte[data
.getSize()]);
bytebuf.putInt(data.getDataSize());
bytebuf.put(data.getData().array());
output.write(bytebuf.array());
output.flush();
}
} catch (Exception e) {
if (socket != null) {
try {
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
try {
ServerSocket server = new ServerSocket(port);
while (true) {
Socket soket = server.accept();
new Thread(new SimpleServerSession(soket)).start();
System.out.println("accept soket:" + soket);
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("end");
}
}).start();
Socket socket = new Socket();
try {
socket.connect(new InetSocketAddress(port));
BufferedOutputStream out = new BufferedOutputStream(socket
.getOutputStream());
BufferedInputStream input = new BufferedInputStream(socket
.getInputStream());
for (int i = 0; i < 10000; i++) {
// 送信
String sendString = "sample 日本語";
byte[] senddata = sendString.getBytes();
ByteBuffer bufData = ByteBuffer.allocate(4 + senddata.length);
bufData.putInt(senddata.length);
bufData.put(senddata);
out.write(bufData.array());
out.flush();
// 受信
// インプットストリームからバイトを取得
byte[] readByte = new byte[1024];
int streamSize = -1;
RecievedData data = new RecievedData();
while ((streamSize = input.read(readByte)) != -1) {
ByteBuffer re = ByteBuffer.wrap(new byte[streamSize]);
re.put(readByte, 0, streamSize);
data.putByte(re.array());
if (data.isCompleted()) {
break;
}
}
String recieve = new String(data.getData().array());
if (recieve.equals(sendString)) {
} else {
System.err.println("errror");
}
}
System.out.println("終了");
} catch (IOException e) {
e.printStackTrace();
}
}
}
class RecievedData {
private RecievedState state;
private RecievedState sizeData;
private RecievedState messageData;
private boolean completed;
public RecievedData() {
sizeData = new RecievedState(this, 4);
state = sizeData;
}
public void putByte(byte[] data) {
state.putByte(data);
}
void full(RecievedState recievedState, ByteBuffer fullData,
ByteBuffer restData) {
if (recievedState == sizeData) {
fullData.position(0);
messageData = new RecievedState(this, fullData.getInt());
state = messageData;
if (restData != null) {
putByte(restData.array());
}
} else if (recievedState == messageData) {
if (restData != null) {
throw new RuntimeException("データサイズが不一致です");
}
completed = true;
}
}
public ByteBuffer getData() {
if (messageData != null) {
return messageData.getData();
}
return null;
}
public boolean isCompleted() {
return completed;
}
public int getSize() {
if (messageData != null) {
return sizeData.getSize() + messageData.getSize();
}
return sizeData.getSize();
}
public int getDataSize() {
if (messageData != null) {
return messageData.getSize();
}
return sizeData.getSize();
}
private class RecievedState {
private int size;
public int getSize() {
return size;
}
private RecievedData recievedData;
private ByteBuffer buf;
private boolean full;
public RecievedState(RecievedData recievedData, int size) {
this.size = size;
buf = ByteBuffer.wrap(new byte[size]);
this.recievedData = recievedData;
}
public void putByte(byte[] data) {
if (full) {
throw new RuntimeException("これ以上書きこむことはできません");
}
int rest = size - buf.position();
if (rest == data.length) {
buf.put(data, 0, data.length);
recievedData.full(this, buf, null);
full = true;
} else if (rest > data.length) {
buf.put(data, 0, data.length);
} else {
buf.put(data, 0, rest);
ByteBuffer restBuf = ByteBuffer.wrap(new byte[data.length
- rest]);
restBuf.put(data, rest, data.length - rest);
recievedData.full(this, buf, restBuf);
full = true;
}
}
public ByteBuffer getData() {
return buf;
}
}
}
最終更新:2009年08月10日 16:50