用java實現聊天程序

代碼的服務端和客戶端都是本機,以下是服務端程序代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.*;

public class SocketReceiver {  //服務端
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        ServerSocket serverSocket = null;
        try {
            serverSocket  = new ServerSocket(52189);
            while (true) {
                Socket socket = serverSocket.accept();
                ExecutorService executor= Executors.newSingleThreadExecutor();
                Future<String> future=executor.submit(new ReceiveHandler(socket));
                String result=future.get();
                if (result.equals("客戶端: quit"))
                {
                    socket.close();
                    break;
                }
                else {
                    socket.close();
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (serverSocket != null)
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
}
class ReceiveHandler implements Callable<String> {
    private Socket socket=null;
    public ReceiveHandler(Socket socket) {
        this.socket = socket;
    }
    public String call() {
        String str=null;
        try {
            InputStream in = socket.getInputStream();
            int count = 0;
            while (count == 0) {
                count = in.available();
            }
            byte[] b = new byte[count];
            in.read(b);
            str = new String(b);
            System.out.println(str);
            if (str.equals("客戶端: quit"))
            {
                System.out.println("客戶端已離線!");
            }
            else {
                OutputStream outer = socket.getOutputStream();
                Scanner input = new Scanner(System.in);
                String message = input.nextLine();
                message = "服務端: " + message;
                byte[] b_out = message.getBytes();
                outer.write(b_out);
                outer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
}

以下是客戶端代碼:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

public class SocketSender {    //客戶端
    public static void main(String[] args) {
        Socket socket = null;
        try {
            InetAddress ip=InetAddress.getByName("localhost");
            while (true) {
                socket = new Socket(ip, 52189);
                OutputStream outer = socket.getOutputStream();
                Scanner in = new Scanner(System.in);
                String message = in.nextLine();
                String messages = new String("客戶端: " + message);
                byte[] b = messages.getBytes();
                outer.write(b);
                outer.flush();
                if (message.equals("quit"))
                {
                    socket.close();
                    System.out.println("服務端已離線!");
                    break;
                }
                else {
                InputStream inner = socket.getInputStream();
                int count = 0;
                while (count == 0) {
                    count = inner.available();
                }
                byte[] recv = new byte[count];
                inner.read(recv);
                String str_recv = new String(recv);
                System.out.println(str_recv);
                socket.close();
                }
            }
        }catch (IOException e) {
            e.printStackTrace();
        }
    }
}

運行結果如圖所示:
客戶端終端:
在這裏插入圖片描述
服務端終端:
在這裏插入圖片描述

發佈了87 篇原創文章 · 獲贊 39 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章