MajiMeM

- 備忘録 -

EchoServant - DynamicSession ver -

参考

プログラム

備考

  • タイムアウトと送・受信バッファの設定を入れるのを忘れている
    • 利用するときは忘れずに
    • 2014/6/14修正
  • それほど大きいプログラムじゃないからサーバ・クライアントを一つに
  • サーバ・クライアントの選択は実行後's'か'c'の入力により可能(実行時引数でもよかったけど,Eclipseで毎回変更するの面倒.その辺をどうにかする方法探したほうがいいかも)
  • byte<->Stringの変換が面倒だったからString型のオブジェクトとして送受信
  • クライアントが'q'の入力で終了できるようになってるのは正常に終了させたかったから(eclipseの停止ボタン押すの面倒だったから)

コード

Main
public class Main {	
	static private MyLog l = new MyLog();
	static private BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
	public static void main(String[] args) throws IOException {
		l.l("input 's' or 'c'>>");
		String mode = br.readLine();
		if (mode.equals("s")) {
			server();
		} else if (mode.equals("c")) {
			client();
		}
	}

	static private void server() throws IOException {
		l.il("server start");
		l.l("local port>>");
		int port = Integer.parseInt(br.readLine());
		new Server(port).start();
	}
	
	static private void client() throws IOException {
		l.il("client start");
		l.l("remote ip>>");
		String ip = br.readLine();		
		l.l("remote port>>");
		int port = Integer.parseInt(br.readLine());
		new Client(ip, port).start();
	}

}
Server
class Server {
	public static final int BUFFER_SIZE = 128 * 1024; // 128k
	public static final int TIMEOUT = 30 * 1000; // 30sec
	private MyLog l = new MyLog();
	private ServerSocket serverSocket;
	
	public Server(int port) throws IOException {
		l.ll("local port:" + port);
		this.serverSocket = new ServerSocket(port);
		serverSocket.setReceiveBufferSize(BUFFER_SIZE);
	}

	public void start() {
		while (true) {
			try {
				Socket socket = serverSocket.accept();
				socket.setSendBufferSize(BUFFER_SIZE);
				socket.setSoTimeout(TIMEOUT);
				new Thread(new ConnectionHandler(socket)).start();
			} catch (IOException e) {
			} finally {				
			}
		}
	}
}
ConnectionHandler
class ConnectionHandler implements Runnable {
	private MyLog l = new MyLog();
	private Socket socket;
	
	public ConnectionHandler(Socket socket) {
		this.socket = socket;
	}
	
	public void run() {
		handleConversation(socket);
	}

	public void handleConversation(Socket socket) {
		try {
			ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
			ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
			while (true) {
				String recv = (String)ois.readObject();	
				l.ll("client: " + recv);
				if (recv.equals("q")) {
					recv = "ok";
				}
				oos.writeObject(recv);
				l.ll("server: " + recv);
				oos.flush();
			}
		} catch (Exception e) {
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
			}
		}
		
	}
}
Client
class Client {
	public static final int BUFFER_SIZE = 128 * 1024; // 128k
	public static final int TIMEOUT = 30 * 1000; // 30sec
	private MyLog l = new MyLog();
	private Socket socket;
	private BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

	public Client(String ip, int port) {
		try {
			this.socket = new Socket();
			socket.setReceiveBufferSize(BUFFER_SIZE);
			socket.connect(new InetSocketAddress(ip, port));
			socket.setSendBufferSize(BUFFER_SIZE);
			socket.setSoTimeout(TIMEOUT);
		} catch (Exception e) {			
		} finally {
		}
	}

	public void start() {
		handleConversation(socket);		
	}
	
	private void handleConversation(Socket socket) {
		try {
			ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(socket.getOutputStream(), BUFFER_SIZE));
			ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(socket.getInputStream(), BUFFER_SIZE));

			while (true) {
				l.l("client: ");
				String send = br.readLine();
				oos.writeObject(send);
				oos.flush();
				String recv = (String)ois.readObject();
				l.ll("server: " + recv);
				if (recv.equals("ok")) {
					break;
				}
			}
		} catch (Exception e) {			
		} finally {
			try {
				if (socket != null) {
					socket.close();
				}
			} catch (IOException e) {				
			}
		}
	}	
}
Mylog
public class MyLog {
	public MyLog() {
	}

	public void l(String s) {		
		System.out.print(s);
	}

	public void ll(String s) {		
		System.out.println(s);
	}

	public void i(String s) {
		System.err.print("INFO: " + s);
	}

	public void il(String s) {
		System.err.println("INFO: " + s);
	}
	
	public void w(String s) {		
		System.err.print("WERNING: " + s);
	}

	public void wl(String s) {		
		System.err.println("WERNING: " + s);
	}

	public void s(String s) {		
		System.err.print("SEVERE: " + s);
	}

	public void sl(String s) {		
		System.err.println("SEVERE: " + s);
	}

}
Related Posts Plugin for WordPress, Blogger...