Loading

一个简单的java控制台TCP通讯程序

一个简单的javaTCP通讯程序

Server(服务器端)类

package com.tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;

public class Server{
    public static ArrayList<Socket> sockets = new ArrayList<>();//在线客户端
    public static void main(String[] args) throws IOException {
        //开启服务器
        var serverSocket = new ServerSocket(8999);
        while (true){
            //接收客户端连接
            new MessageHandler(serverSocket.accept()).start();
        }
    }

    static class MessageHandler extends Thread{
        private Socket socket;
        public MessageHandler(Socket socket){
            super();
            this.socket = socket;
            sockets.add(socket);
        }

        @Override
        public void run() {
            System.out.println(socket.getInetAddress() + " 上线");
            try{
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                PrintStream printStream = new PrintStream(socket.getOutputStream());
                String content;
                while ((content = bufferedReader.readLine()) != null && !content.equalsIgnoreCase("EXIT")){
                    sendToOthers(content);
                }
                printStream.println("bye!");
                System.out.println(socket.getInetAddress() + "断开连接! ");
                socket.close();
            }catch (IOException e){
                System.out.println(socket.getInetAddress() +" 掉线了");
                e.printStackTrace();
            }
        }

        synchronized public void sendToOthers(String content){
            Iterator<Socket> iterator = sockets.iterator();
            while (iterator.hasNext()){
                Socket s = null;
                try {
                    s = iterator.next();
                    //消息转发到其余客户端
                    if (!s.equals(socket)) {
                        PrintStream printStream = new PrintStream(s.getOutputStream());
                        printStream.println(s.getInetAddress() + ": " + content);
                    }else {
                        System.out.println("地址: " + s.getInetAddress() + "说: " + content);
                    }
                } catch (IOException e) {
                    iterator.remove();
                }
            }
        }

        public Socket getSocket() {
            return socket;
        }

        public void setSocket(Socket socket) {
            this.socket = socket;
        }
    }

}

Client(客户端)类

package com.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    private Socket socket;
    private boolean flag = true;
    private SendThread sendThread;
    private ReceiveThread receiveThread;
    private Client() {
    }

    private Client(Socket socket) {
        this.socket = socket;
        sendThread = new SendThread();
        receiveThread = new ReceiveThread();
    }

    static class Clients {
        public static Client getClient(Socket socket) {
            return new Client(socket);
        }
    }

    class SendThread extends Thread {
        @Override
        public void run() {
            try (Scanner input = new Scanner(System.in)) {
                PrintStream printStream = new PrintStream(socket.getOutputStream());
                while (flag) {
                    //发送给服务器
                    String content = input.nextLine();
                    printStream.println(content);
                    if (content.equalsIgnoreCase("EXIT")) {
                        flag = false;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    class ReceiveThread extends Thread {
        @Override
        public void run() {
            try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()))){
                while (flag) {
                    String line = bufferedReader.readLine();//是阻塞方法, 所以为了避免一直阻塞下面加上服务器最后返回bye!时结束线程
                    System.out.println(line);
                    if (line.equals("bye!")){
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public ReceiveThread getReceiveThread() {
        return receiveThread;
    }

    public SendThread getSendThread() {
        return sendThread;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    public Socket getSocket() {
        return socket;
    }

    public void setSocket(Socket socket) {
        this.socket = socket;
    }
}

启动客户端实例:

package com.tcp;

import java.io.IOException;
import java.net.Socket;

public class DoIt {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("xxx.xxx.xxx.xxx", 8999);
        Client client = Client.Clients.getClient(socket);
        var sendThread = client.getSendThread();
        var receiveThread = client.getReceiveThread();
        sendThread.start();
        receiveThread.start();
        try {
            sendThread.join();
            receiveThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        socket.close();
    }
}

posted @ 2021-07-30 15:59  AxiaNibiru  阅读(106)  评论(0)    收藏  举报