EchoServant - DynamicSession ver -
参考
- Javaネットワークプログラミングの真髄
- Socketのクローズによるクライアント・サーバの動作について
- オブジェクトの送受信について
プログラム
備考
コード
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); } }