socket实现群聊---为每个客户端创建一个线程

客户端接收服务器发出的消息,向服务器提交消息

package socketmore;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 接受服务器信息
 */
class ReadMes extends Thread {
    private Socket socket;

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

    public void run() {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));
            String message = null;
            while (true) {
                message = reader.readLine();
                // 当读服务器信息线程接收到bye,该线程退出
                if (message.equals("bye")) {
                    break;
                }
                System.out.println(message);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

/**
 *
 * 发送信息
 */
class SendMes extends Thread {
    private Socket socket;

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

    public void run() {
        BufferedReader input = null;
        PrintWriter writer = null;
        try {
            input = new BufferedReader(new InputStreamReader(System.in));
            writer = new PrintWriter(socket.getOutputStream());
            String message = null;
            while (true) {
                message = input.readLine();
                // 当输入bye客户端退出
                if (message.equals("bye")) {
                    break;
                }
                // 向服务器端发送信息
                writer.println(message);
                writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (input != null) {
                try {
                    input.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (writer != null) {
                writer.close();
            }
        }
    }
}

public class ChatClient {
    private String ipAdress;

    public ChatClient(String ipAString) {
        this.ipAdress = ipAdress;
    }

    public void startWork() throws UnknownHostException, IOException {
        Socket socket = new Socket(ipAdress, 2345);
        new ReadMes(socket).start();
        new SendMes(socket).start();
    }

    /**
     * Description
     *
     * @param args
     * @throws UnknownHostException
     * @throws IOException
     */
    public static void main(String[] args) throws UnknownHostException,
            IOException {
        ChatClient chatClient = new ChatClient(args[0]);
        chatClient.startWork();
    }

}

服务器端接收消息,并且向每个客户端进行发送

package socketmore;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

/**
 *
 */
class Chat extends Thread {
    private Socket socket;
    private List<Socket> socketList;
    private int count;

    public Chat(int count, Socket socket, List<Socket> socketList) {
        this.count = count;
        this.socket = socket;
        this.socketList = socketList;
    }



    public void run() {
        BufferedReader reader = null;
        PrintWriter writer = null;
        try {
            reader = new BufferedReader(new InputStreamReader(
                    socket.getInputStream()));

            String message = null;
            while (true) {
                message = reader.readLine();
                // 接收到客户端的bye信息,客户端即将退出,并将bye写入到该客户端
                if (message.equals("bye")) {
                    writer = new PrintWriter(socket.getOutputStream());
                    writer.println("bye");
                    writer.flush();
                    continue;
                }

                // 向所有的客户端发送接收到信息,实现群聊
                for (int i = 0; i < socketList.size(); i++) {
                    writer = new PrintWriter(socketList.get(i)
                            .getOutputStream());
                    writer.println(count + " say: " + message);
                    writer.flush();
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

public class ChatServer {

    public void startWork() throws IOException {
        ServerSocket serverSocket = new ServerSocket(2345);
        List<Socket> socketList = new ArrayList<Socket>();//保存链接的客户端
        Socket socket = null;
        int count = 0;
        while (true) {
            socket = serverSocket.accept();
            count++;
            System.out.println(count + " clinet connected to the server!");
            // 将每一个连接到该服务器的客户端,加到List中
            socketList.add(socket);
            // 每一个连接到服务器的客户端,服务器开启一个新的线程来处理
            new Chat(count, socket, socketList).start();
        }
    }

    public static void main(String[] args) throws IOException {
        ChatServer chatServer = new ChatServer();
        chatServer.startWork();
    }

}


你可能感兴趣的:(线程,socket,服务器,客户端)