chat1-Client&Server连接

时间:2024-06-03 07:44:24
package chat1;
import java.io.*;        import java.util.Map;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {/**聊天室服务端*/
    public static void main(String[] args) {
        Server server = new Server();
        server.start();
    }
    //java.net.ServerSocket类似于聊天室服务端的"总机",该"总机"上有若干的"插座"
    //        每个插座可以连接一个客户端的插头,实现让多个客户端连接到同一个"总机"上
    //        ServerSocket有两个功能:
    //        1:实例化时向系统申请服务端口(客户端先通过这个端口与总机建立连接)
    //        2:一旦一个客户端与总机建立连接,总机就会分配一个"插座"与该客户端沟通
    private ServerSocket serverSocket;
    public Server(){
        try {
            System.out.println("正在启动服务端...");
            //实例化ServerSocket并指定服务端口,客户端就是通过这个端口连接服务端的。
            //(该端口不能与当前计算机上其他应用程序申请的端口重复,否则会抛出异常:
            // java.net.BindException: Address already in use:
            serverSocket = new ServerSocket(8088);
            System.out.println("服务端启动完毕");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            while(true) {
                System.out.println("等待客户端连接...");
                //ServerSocket上一个重要的方法: Socket accept()
                // 该方法用于接受客户端的连接,此方法是一个阻塞方法,调用后方法会"卡住"
                // 开始等待客户端的连接,一旦一个客户端连接,那么此方法会立即返回一个
            // Socket实例然后继续往下运行(通过这个Socket就可以与刚建立连接的客户端交互了)
                Socket socket = serverSocket.accept();
                System.out.println("一个客户端连接了!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}