Java TCP协议实现一对一聊天与UDP协议实现群聊案例

news/2024/5/18 16:09:05 标签: java, tcp/ip, udp

JavaTCP协议实现一对一聊天与UDP协议实现群聊案例

1.TCP协议实现一对一聊天

1.1服务端运行结果

在这里插入图片描述

1.2客服端运行结果

在这里插入图片描述

1.3代码汇总

服务端
package twentyone;

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

public class Server {
    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(12345); // 使用端口12345

            System.out.println("等待客户端连接...");

            Socket clientSocket = serverSocket.accept(); // 等待客户端连接

            System.out.println("客户端已连接");

            // 获取输入输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            // 读取客户端消息并回复
            String clientMessage;
            while ((clientMessage = in.readLine()) != null) {
                System.out.println("张超(客户端): " + clientMessage);

                // 从控制台读取服务器消息并发送给客户端
                BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
                System.out.print("  蒂蒂(服务器): ");
                String serverMessage = consoleReader.readLine();
                out.println(serverMessage);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端
package twentyone;

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

public class Client {
    public static void main(String[] args) {
        try {
            Socket socket = new Socket("localhost", 12345); // 连接服务器

            // 获取输入输出流
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

            // 从控制台读取客户端消息并发送给服务器
            BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));

            String clientMessage;
            while (true) {
                System.out.print("张超(客户端): ");
                clientMessage = consoleReader.readLine();
                out.println(clientMessage);

                // 读取服务器消息并打印
                String serverMessage = in.readLine();
                System.out.println("蒂蒂(服务器)" + serverMessage);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.UDP协议实现群聊

2.1服务端运行结果

在这里插入图片描述

在这里插入图片描述

2.2客户端运行结果

在这里插入图片描述

2.3代码汇总

第一服务端
package twentyone;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {
    public static void main(String[] args) {
        try {
            DatagramSocket serverSocket = new DatagramSocket(12345);

            System.out.println("第一个服务器已启动,等待客户端加入...");

            while (true) {
                byte[] receiveData = new byte[1024];

                // 接收客户端消息
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);

                String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("第一个服务器收到来自 " + receivePacket.getAddress() + ":" + receivePacket.getPort() + " 的消息: " + clientMessage);

                // 广播消息给其他客户端
                broadcastMessage(serverSocket, clientMessage, receivePacket.getAddress(), receivePacket.getPort());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void broadcastMessage(DatagramSocket serverSocket, String message, InetAddress excludeAddress, int excludePort) {
        try {
            byte[] sendData = message.getBytes();

            // 获取广播地址
            InetAddress broadcastAddress = InetAddress.getByName("255.255.255.255");
            int broadcastPort = 12345;

            // 广播消息给所有客户端,除了发起广播的客户端
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcastAddress, broadcastPort);
            serverSocket.send(sendPacket);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第二服务端
package twentyone;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class SecondUDPServer {
    public static void main(String[] args) {
        try {
            DatagramSocket serverSocket = new DatagramSocket(12346);

            System.out.println("第二个服务器已启动,等待客户端加入...");

            while (true) {
                byte[] receiveData = new byte[1024];

                // 接收客户端消息
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                serverSocket.receive(receivePacket);

                String clientMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("第二个服务器收到来自 " + receivePacket.getAddress() + ":" + receivePacket.getPort() + " 的消息: " + clientMessage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

客户端
package twentyone;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;


class ConsoleHelper {
    private static final BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

    public static String readLine(String prompt) {
        try {
            System.out.print(prompt);
            return reader.readLine();
        } catch (IOException e) {
            throw new RuntimeException("Error reading from console", e);
        }
    }
}


public class UDPClient {
    public static void main(String[] args) {
        try {
            DatagramSocket clientSocket = new DatagramSocket(); // 随机分配端口

            // 启动接收线程
            new Thread(() -> receiveMessages(clientSocket, 3)).start();

            while (true) {
                // 从控制台读取消息并发送给服务端1和服务端2
                String message = ConsoleHelper.readLine("客户端: ");
                byte[] sendData = message.getBytes();

                // 发送消息给服务端1
                DatagramPacket sendPacket1 = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("localhost"), 12345);
                clientSocket.send(sendPacket1);

                // 发送消息给服务端2
                DatagramPacket sendPacket2 = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("localhost"), 12346);
                clientSocket.send(sendPacket2);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void receiveMessages(DatagramSocket clientSocket, int maxReceiveCount) {
        try {
            byte[] receiveData = new byte[1024];
            int receiveCount = 0;

            while (receiveCount < maxReceiveCount) {
                // 接收服务器广播消息
                DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                clientSocket.receive(receivePacket);

                String serverMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
                System.out.println("服务器: " + serverMessage);

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

http://www.niftyadmin.cn/n/5242812.html

相关文章

CMMI5大成熟度等级和4大过程域

CMMI&#xff08;Capability Maturity Model Integration&#xff0c;能力成熟度模型集成&#xff09;模型系列是帮助组织改进其过程的最佳实践的集合。这些模型由来自产业界、政府以及软件工程研究所&#xff08;Software Engineering Institute&#xff0c; SEI&#xff09;的…

【GAMES101】二维变换和齐次坐标

这几天都在抽空学OpenGL、敲leetcode和看games&#xff0c;这里留点笔记给以后复习 games101第一节课在吹水&#xff0c;第二节课讲了线性代数的入门知识&#xff0c;比较简单&#xff0c;这里稍微回顾一下重点&#xff0c;然后开始讲第三节课的二维变换和齐次坐标 目录 向量…

用HeidiSQL在MySQL中创建新的数据库

用有权限的用户登录&#xff1a; 右键单击&#xff0c;选择&#xff1a; 输入要创建的数据库名称&#xff0c;然后点击“确定”&#xff1a; 刷新下&#xff0c;就看到新创建的数据库了&#xff1a; 在新创建的数据库中&#xff0c;就可以做其它操作了&#xff0c;例如…

SQL Server 数据库,创建数据库并使用索引查询学员考试成绩

5.1索引 索引提供指针以指向存储在表中指定列的数据值&#xff0c;然后根据指定的次序排列这些指针&#xff0c;再跟随 指针到达包含该值的行。 5.1.1什么是索引 数据库中的索引与书籍中的目录类似。在一本书中&#xff0c;无须阅读整本书&#xff0c;利用目录就可以快速查 找…

SQL手工注入漏洞测试(Access数据库)-墨者

———靶场专栏——— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 靶场背景&#xff1a; 来源&#xff1a; 墨者学院 简介&#xff1a; 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

深入理解网站响应码:指南与最佳实践

深入理解网站响应码&#xff1a;指南与最佳实践 摘要 网站响应码是服务器对客户端&#xff08;如Web浏览器&#xff09;请求的响应的一部分&#xff0c;通常由三位数字组成&#xff0c;指示请求成功、重定向、客户端错误或服务器错误。本文深入解析了常见的网站响应码类别及其…

MYSQL练题笔记-高级查询和连接-连续出现的数字

一、题目相关内容 1&#xff09;相关的表和题目 2&#xff09;帮助理解题目的示例&#xff0c;提供返回结果的格式 二、自己初步的理解 其实这一部分的题目很简单&#xff0c;但是没啥思路啊&#xff0c;怎么想都想不通&#xff0c;还是看题解吧&#xff0c;中等题就是中等题…

每日OJ题_算法_滑动窗口②_力扣3. 无重复字符的最长子串

力扣3. 无重复字符的最长子串 难度 中等 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。示例 2: 输入: …