学习笔记(Socket)

实现客户端给服务端发送消息

服务端代码

package org.example;

import org.apache.commons.io.IOUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;


public class SocketServer {

    public static void main(String[] args) {
        ServerSocket server = null;
        try {
            server = new ServerSocket(1024);  // 监听 1024 端口
            System.out.println("服务启动, 等待客户端连接");
            Socket socket = server.accept();      // 会阻塞等待, 直到有客户端连接
            String ip = socket.getInetAddress().getHostAddress();
            System.out.println("有客户端连接IP: " + ip + ", 端口: " + socket.getPort());
            // 开启一个线程, 读取客户端发送的消息
            new Thread(() -> {
                while (true) {
                    try {
                    	// 读取客户端发送的消息
                        InputStream inputStream = socket.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                        String readData = bufferedReader.readLine(); // 会阻塞等待
                        System.out.println("收到客户端消息: " + readData);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

客户端代码

package org.example;

import org.apache.commons.io.IOUtils;

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

public class SocketClient {

    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1", 1024); // 创建客户端
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            // 启动一个线程, 用于向服务器发送消息
            new Thread(() -> {
                while (true) {
                    try {
                        System.out.print("请输入内容: ");
                        Scanner scanner = new Scanner(System.in);
                        String input = scanner.nextLine();
                        printWriter.println(input);
                        printWriter.flush();
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }

                }
            }).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

实现服务端给客户端返回消息

服务端代码

package org.example;

import org.apache.commons.io.IOUtils;

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


public class SocketServer {

    public static void main(String[] args) {
        ServerSocket server = null;
        try {
            server = new ServerSocket(1024);  // 监听 1024 端口
            System.out.println("服务启动, 等待客户端连接");
            Socket socket = server.accept();      // 会阻塞等待, 直到有客户端连接
            String ip = socket.getInetAddress().getHostAddress();
            System.out.println("有客户端连接IP: " + ip + ", 端口: " + socket.getPort());
            // 开启一个线程, 读取客户端发送的消息
            new Thread(() -> {
                while (true) {
                    try {
                        // 读取客户端发送的消息
                        InputStream inputStream = socket.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                        String readData = bufferedReader.readLine(); // 会阻塞等待
                        System.out.println("收到客户端消息: " + readData);
                        // 向客户端返回消息
                        OutputStream outputStream = socket.getOutputStream();
                        PrintWriter printWriter = new PrintWriter(outputStream);
                        printWriter.println("服务端已收到消息: " + readData);
                        printWriter.flush();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

客户端代码

package org.example;

import org.apache.commons.io.IOUtils;

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

public class SocketClient {

    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1", 1024); // 创建客户端
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            // 启动一个线程, 用于向服务器发送消息
            new Thread(() -> {
                while (true) {
                    try {
                        System.out.print("请输入内容: ");
                        Scanner scanner = new Scanner(System.in);
                        String input = scanner.nextLine();
                        printWriter.println(input);
                        printWriter.flush();
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }

                }
            }).start();

            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            // 启动一个线程, 用于接收服务器消息
            new Thread(() -> {
                while (true) {
                    try {
                        String readData = bufferedReader.readLine();
                        System.out.println("收到服务端消息: " + readData);
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }
                }
            }).start();

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

}

服务端作为中转实现多个客户端之间通信

服务端代码

package org.example;

import org.apache.commons.io.IOUtils;

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


public class SocketServer {

    public static void main(String[] args) {
        ServerSocket server = null;
        Map<String, Socket> CLENT_MAP = new HashMap<>();
        try {
            server = new ServerSocket(1024);  // 监听 1024 端口
            System.out.println("服务启动, 等待客户端连接");
            while (true) {
                Socket socket = server.accept();   // 会阻塞等待, 等待客户端连接
                String ip = socket.getInetAddress().getHostAddress();
                System.out.println("有客户端连接IP: " + ip + ", 端口: " + socket.getPort());
                String clientKey = ip + ":" + socket.getPort();
                CLENT_MAP.put(clientKey, socket);
                // 开启一个线程, 读取客户端发送的消息
                new Thread(() -> {
                    while (true) {
                        try {
                            // 读取客户端发送的消息
                            InputStream inputStream = socket.getInputStream();
                            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
                            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                            String readData = bufferedReader.readLine(); // 会阻塞等待
                            // 服务端把读取到的消息转发给指定端口的客户端, 这是群聊功能, 会把读取到的消息转发给所有注册到这个服务端上的客户端
                            CLENT_MAP.forEach((k, v) -> {
                                try {
                                    String[] parts = k.split(":");
                                    String port = parts[1]; // 端口号是数组的第二个元素
                                    if (!port.equals(String.valueOf(socket.getPort()))) {
                                        OutputStream outputStream = v.getOutputStream();
                                        PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(outputStream, "UTF8"));
                                        printWriter.println(readData);
                                        printWriter.flush();
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            });

                        } catch (IOException e) {
                            e.printStackTrace();
                            break; // 断开连接就结束这个线程即可
                        }
                    }
                }).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

客户端代码

多启动几个客户端就可以了,直接在一个类上启动多个客户端

package org.example;

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

public class SocketClient {

    public static void main(String[] args) {
        Socket socket = null;
        try {
            socket = new Socket("127.0.0.1", 1024); // 创建客户端
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter printWriter = new PrintWriter(outputStream);
            // 启动一个线程, 用于向服务器发送消息
            new Thread(() -> {
                while (true) {
                    try {
                        Scanner scanner = new Scanner(System.in);
                        String input = scanner.nextLine();
                        printWriter.println(input);
                        printWriter.flush();
                    } catch (Exception e) {
                        e.printStackTrace();
                        break;
                    }

                }
            }).start();

            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

            // 启动一个线程, 用于接收服务器消息
            new Thread(() -> {
                while (true) {
                    try {
                        String readData = bufferedReader.readLine();
                        System.out.println(readData);
                    } catch (Exception e) {
                        e.printStackTrace();
                        break; // 断开连接就结束这个线程即可
                    }
                }
            }).start();

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值