下面是一段基于 BIO 模型实现的简单 Socket 编程

    服务端

    1. package cn.inetty.java;
    2. import java.io.IOException;
    3. import java.io.ObjectInputStream;
    4. import java.io.ObjectOutputStream;
    5. import java.net.InetSocketAddress;
    6. import java.net.ServerSocket;
    7. import java.net.Socket;
    8. import java.util.concurrent.ExecutorService;
    9. import java.util.concurrent.Executors;
    10. public class iServer {
    11. private static ExecutorService executorService =
    12. Executors.newFixedThreadPool(
    13. Runtime.getRuntime().availableProcessors() * 2
    14. );
    15. public static void main(String[] args) {
    16. ServerSocket serverSocket = null;
    17. try {
    18. serverSocket = new ServerSocket();
    19. serverSocket.bind(new InetSocketAddress(8888));
    20. System.out.println("serverSocket:"+serverSocket);
    21. // while (true) {
    22. // new Thread(new ServerTask(serverSocket.accept())).start();
    23. // }
    24. // 使用线程池来创建线程
    25. while (true) {
    26. executorService.execute(new ServerTask(serverSocket.accept()));
    27. }
    28. } catch (IOException e) {
    29. e.printStackTrace();
    30. }
    31. }
    32. private static class ServerTask implements Runnable {
    33. private Socket socket = null;
    34. public ServerTask(Socket socket) {
    35. this.socket = socket;
    36. }
    37. @Override
    38. public void run() {
    39. // 需要注意 ObjectOutputStream和ObjectInputStream 在服务端创建顺序和客户端创建顺序问题
    40. try (
    41. ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
    42. ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
    43. ){
    44. String name = inputStream.readUTF();
    45. System.out.println("Accept Client Message = "+name);
    46. outputStream.writeUTF("Hello "+name);
    47. outputStream.flush();
    48. } catch (IOException e) {
    49. try {
    50. socket.close();
    51. } catch (IOException ioException) {
    52. ioException.printStackTrace();
    53. }
    54. e.printStackTrace();
    55. }
    56. }
    57. }
    58. }

    客户端

    1. package cn.inetty.java;
    2. import java.io.IOException;
    3. import java.io.ObjectInputStream;
    4. import java.io.ObjectOutputStream;
    5. import java.net.InetSocketAddress;
    6. import java.net.Socket;
    7. public class iClient {
    8. public static void main(String[] args) throws IOException {
    9. Socket socket = null;
    10. ObjectInputStream inputStream = null;
    11. ObjectOutputStream outputStream = null;
    12. try {
    13. socket = new Socket();
    14. socket.connect(new InetSocketAddress("localhost", 8888));
    15. outputStream = new ObjectOutputStream(socket.getOutputStream());
    16. inputStream = new ObjectInputStream(socket.getInputStream());
    17. System.out.println(socket);
    18. String name = "ming";
    19. outputStream.writeUTF(name);
    20. outputStream.flush();
    21. System.out.println("Client Send Message = " + name);
    22. System.out.println("From Server Message = " + inputStream.readUTF());
    23. } catch (IOException e) {
    24. try {
    25. inputStream.close();
    26. outputStream.close();
    27. socket.close();
    28. } catch (IOException ioException) {
    29. ioException.printStackTrace();
    30. }
    31. e.printStackTrace();
    32. }
    33. }
    34. }