Java基于Socket的簡單聊天室案例

服務端TalkServer如下:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class TalkServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8081);
        System.out.println("本地地址:" + serverSocket.getLocalSocketAddress());
        System.out.println("服務器已啟動!");
        for (; ; ) {
            Socket socket = serverSocket.accept();
            System.out.println(String.format("【客戶端連接已創(chuàng)建】,客戶端地址:%s", socket.getRemoteSocketAddress()));
            Thread t = new Handler(socket);
            t.start();
        }
    }
}

class Handler extends Thread {
    Socket socket;

    public Handler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = this.socket.getInputStream();
            OutputStream os = this.socket.getOutputStream();
            handle(is, os);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("【客戶端已斷開連接】");
    }

    private void handle(InputStream inputStream, OutputStream outputStream) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));

        bw.write("連接成功\n");
        bw.flush();
        for (; ; ) {
            String message = br.readLine() + "\n";
            System.out.println(String.format("【收到消息(客戶端地址:%s,線程名:%s)】:%s", socket.getRemoteSocketAddress(), Thread.currentThread().getName(),message));
            if (message.equalsIgnoreCase("end")) {
                bw.write(String.format("%s斷開連接請求,再見!\n", this.socket.getRemoteSocketAddress()));
                bw.flush();
                System.out.println(String.format("【客戶端已斷開(客戶端地址:%s,線程名:%s)】", socket.getRemoteSocketAddress(), Thread.currentThread().getName()));
                break;
            }

            bw.write("你發(fā)送的消息已收到,你發(fā)送的消息是:" + message);
            bw.flush();
        }

    }

}

客戶端Client

import com.apple.laf.ScreenMenuBar;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

public class TalkClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8081);
        System.out.println("本地地址:" + socket.getLocalAddress());
        System.out.println("服務器地址:" + socket.getRemoteSocketAddress());
        try (InputStream inputStream = socket.getInputStream()) {
            try (OutputStream outputStream = socket.getOutputStream()) {
                handle(inputStream, outputStream);
            }
        }
        socket.close();
        System.out.println("連接斷開");
    }

    private static void handle(InputStream inputStream, OutputStream outputStream) throws IOException {
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8));
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
        System.out.println("來自服務器的消息:" + reader.readLine());
        Scanner scanner = new Scanner(System.in);
        for (; ; ) {
            System.out.print("請輸入你要發(fā)送給服務端的消息:");
            String message = scanner.nextLine();
            writer.write(message+"\n");
            writer.flush();
            String response = reader.readLine();
            System.out.println("來自服務端的消息回復:" + response);
            if (message.equalsIgnoreCase("end")) {
                break;
            }
        }
    }
}

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容