Java Socket 编程详解(干货)

订阅 TheTutorials/Java 学习更多 Java 相关的知识

Socket 编程

本章节我们使用 Socket 实现一个简单的智能对话系统,包括客户端 (Client), 服务器端 (Server)

在这里插入图片描述

服务器端 (Server)

  • 构造函数

    我们必须必须在服务器端创建一个 ServerSocket,便于客户端的链接

    ServerSocket serverSocket = new ServerSocket(8888);
    
  • 开始监听

    创建完成 ServerSocket 后服务器端并未开始监听, 我们需要使用 accept() 方法开始监听本地端口,该方法会一直阻塞,直到有客户端连接。并返回一个客服端实例。

    Socket socket = serverSocket.accept();
    
  • 获取输入输出流

    DataInputStream receiver = new DataInputStream(socket.getInputStream());
    DataOutputStream sender = new DataOutputStream(socket.getOutputStream());
    
  • 通过 readwrite 方法分别读入客服端发送的数据和向客服端写入数据

    receiveMsg = receiver.readUTF();
    sender.writeUTF(msg);
    

客服端 (Client)

客服端要和服务器端建立连接,客服端必须要知道到服务器主机的地址(ip), 如果客服端和服务器在同一台电脑上面,那么服务器地址就是本机地址: localhost 或者 127.0.0.1.以及需要直到服务器端所监听的端口号。端口号的范围 0-65535,0到1023范围内的端口号是众所周知的端口或系统端口,所以我们尽量使用1024及以上的端口号。

  • 构造函数

    Socket(String host, int port)
    
  • 获取输入和输出流

    无论是客服端还是服务器端,我们都可以获取彼此的输入输出流,便于和服务端和客服端之间的交流。

    DataOutputStream sender = new DataOutputStream(socket.getOutputStream());
    DataInputStream receiver = new DataInputStream(socket.getInputStream());
    

完整代码

Client
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws IOException {
        Client client = new Client("127.0.0.1", 8888);

        Scanner scanner = new Scanner(System.in);
        while (true) {
            String msg = scanner.nextLine();
            String receiveMsg = client.sendMessage(msg);
            System.out.println(receiveMsg);
            if (receiveMsg.equals("Bye Bye!")) {
                break;
            }
        }
    }

    private Socket socket;
    private DataOutputStream sender;

    public Client(String host, int port) {
        try {
            this.socket = new Socket(host, port);
            sender = new DataOutputStream(socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String sendMessage(String msg) throws IOException {
        sender.writeUTF(msg);
        DataInputStream receiver = new DataInputStream(socket.getInputStream());
        return receiver.readUTF();
    }
}
Server
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) {
        new Server();
    }

    private static final String[][] words = {
            {"Hi!", "Hi!"},
            {"How are you ?", "I'm fine. Thanks"},
            {"I love you!", "I love you too ^_^."}
    };

    private Server() {

        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("Server started");
            Socket socket = serverSocket.accept();
            System.out.println("a client connected this server now.");

            DataInputStream receiver = new DataInputStream(socket.getInputStream());
            DataOutputStream sender = new DataOutputStream(socket.getOutputStream());

            String receiveMsg;
            do {
                receiveMsg = receiver.readUTF();
                System.out.println("Client says: " + receiveMsg);
                boolean exists = false;
                for (String[] word : words) {
                    if (word[0].equals(receiveMsg)) {
                        sender.writeUTF(word[1]);
                        exists = true;
                    } else if (receiveMsg.toLowerCase().contains("bye")) {
                        sender.writeUTF("Bye Bye!");
                        exists = true;
                    }
                }
                if (!exists && !receiveMsg.equals("Over")) {
                    sender.writeUTF("I don't know what you say!");
                }
            } while (!receiveMsg.equals("Over"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注意: 必须先运行 Server 再运行 Client


版权声明:本文为ishellhub原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。