多线程-TCP通信

版权声明:知识共享 https://blog.csdn.net/liyaowen505/article/details/78137917
/**
 * 服务器端
 * @author Hui
 */

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class TcpServer {
    private static ArrayList<Socket> socketList = new ArrayList<>();
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(10086);
            System.out.println("等待客户端连接");
            while (true) {
                Socket socket = serverSocket.accept(); // 监听socket
                socketList.add(socket);
                new Thread(new ServerSendThread(socket, socketList)).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 服务器发送接收线程
 * @author Hui
 */
class ServerSendThread implements Runnable {
    private Socket socket = null;
    private ArrayList<Socket> socketList = null;
    private OutputStreamWriter sendBackInfo;
    private PrintWriter sendInfo;

public ServerSendThread(Socket socket, ArrayList<Socket> socketList) {
    this.socket = socket;
    this.socketList = socketList;
}
public void run() {
    try {
        System.out.println(socket.getInetAddress().getHostAddress() + "进入聊天室");
        sendMsg("你已进入辉总的聊天室", socket);
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedWriter writer = new BufferedWriter(new FileWriter("d:/bbb/chatLog.txt", true)); // true表示追加
        // 读取数据内容
        writer.write(socket.getInetAddress().getHostAddress() + "\r\n");
        String line;
        while ((line = reader.readLine()) != null) {
            // 向所有客户端转发消息
            for (Socket socket : socketList) {
                sendMsg(line, socket);
            }
            // 服务器写入日志文件
            writer.append(line + "\r\n");
            writer.flush();
            // 打印客户端消息
    System.out.println(socket.getInetAddress().getHostAddress());
            System.out.println(line);
        }
        // 关闭资源
        writer.close(); // *
        sendBackInfo.close(); // *
    } catch (IOException e) {
        // 客户端断开线程时
        System.out.println(socket.getInetAddress().getHostAddress() + "断开了连接");
        socketList.remove(socket);
    }
}
// 服务器发送消息函数
public void sendMsg(String Msg, Socket socket) throws IOException {
    sendInfo = new PrintWriter(socket.getOutputStream(), true);
    sendInfo.println(Msg);
}
}

/**
 * 客户端
 * @author Hui
 */
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
    public static void main(String[] args) {
        try {
            // 为客户端创建发送和接收线程
            Socket ClientSocket = new Socket("192.168.15.254", 10086);
            new Thread(new ClientSendThread(ClientSocket)).start();
            new Thread(new ClientReceiveThread(ClientSocket)).start();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// 客户端发送线程
class ClientSendThread implements Runnable {
    private Socket ClientSocket = null;
    public ClientSendThread(Socket socket) {
        this.ClientSocket = socket;
    }
    public void run() {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter out = new PrintWriter(ClientSocket.getOutputStream(), true);
            // 发送
            String len;
            while ((len = reader.readLine()) != null) {
                out.println(len);
            }
            // 关闭资源
            reader.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

// 客户端接收线程
class ClientReceiveThread implements Runnable {
    private Socket ClientSocket = null;
    public ClientReceiveThread(Socket socket) {
        this.ClientSocket = socket;
    }
    public void run() {
        // 接收反馈信息
        try {
            BufferedReader readBackInfo = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
            String backInfo;
            while ((backInfo = readBackInfo.readLine()) != null) { // 打印消息
                System.out.println(ClientSocket.getInetAddress().getHostAddress());
                System.out.println(backInfo);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/liyaowen505/article/details/78137917