Client
public class Client { public static void main(String[] args) throws IOException { //客户端启动必备 Socket socket = null; //实例化与服务端通信的输入输出流 ObjectOutputStream output = null; ObjectInputStream input = null; //服务器的通信地址 InetSocketAddress addr = new InetSocketAddress("127.0.0.1",10001); try{ socket = new Socket(); socket.connect(addr);//连接服务器 output = new ObjectOutputStream(socket.getOutputStream()); input = new ObjectInputStream(socket.getInputStream()); /*向服务器输出请求*/ output.writeUTF("Mark"); output.flush(); //接收服务器的输出 System.out.println(input.readUTF()); }finally{ if (socket!=null) socket.close(); if (output!=null) output.close(); if (input!=null) input.close(); } }}
Server
public class Server { public static void main(String[] args) throws IOException { //服务端启动必备 ServerSocket serverSocket = new ServerSocket(); //表示服务端在哪个端口上监听 serverSocket.bind(new InetSocketAddress(10001)); System.out.println("Start Server ...."); try{ while(true){ new Thread(new ServerTask(serverSocket.accept())).start(); } }finally { serverSocket.close(); } } //每个和客户端的通信都会打包成一个任务,交个一个线程来执行 private static class ServerTask implements Runnable{ private Socket socket = null; public ServerTask(Socket socket){ this.socket = socket; } @Override public void run() { //实例化与客户端通信的输入输出流 try(ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream())){ //接收客户端的输出,也就是服务器的输入 String userName = inputStream.readUTF(); System.out.println("Accept client message:"+userName); //服务器的输出,也就是客户端的输入 outputStream.writeUTF("Hello,"+userName); outputStream.flush(); }catch(Exception e){ e.printStackTrace(); }finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }}
使用线程池的server
public class ServerPool { private static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); public static void main(String[] args) throws IOException { //服务端启动必备 ServerSocket serverSocket = new ServerSocket(); //表示服务端在哪个端口上监听 serverSocket.bind(new InetSocketAddress(10001)); System.out.println("Start Server ...."); try{ while(true){ executorService.execute(new ServerTask(serverSocket.accept())); } }finally { serverSocket.close(); } } //每个和客户端的通信都会打包成一个任务,交个一个线程来执行 private static class ServerTask implements Runnable{ private Socket socket = null; public ServerTask(Socket socket){ this.socket = socket; } @Override public void run() { //实例化与客户端通信的输入输出流 try(ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream()); ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream())){ //接收客户端的输出,也就是服务器的输入 String userName = inputStream.readUTF(); System.out.println("Accept client message:"+userName); //服务器的输出,也就是客户端的输入 outputStream.writeUTF("Hello,"+userName); outputStream.flush(); }catch(Exception e){ e.printStackTrace(); }finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }}