首页 > 编程语言 >JAVA实现客户端通过服务端对话(NET)

JAVA实现客户端通过服务端对话(NET)

时间:2024-12-06 10:33:39浏览次数:6  
标签:java String new clientId import println JAVA NET 服务端

通过使用java.net实现客户端向服务端发送信息内容以及发送目标地址ID,服务端通过寻找对应ID转发给目标客户端。

代码仅供参考,其中有很多地方仍需要优化,比如:ID无法注册、没有添加密码、代码优化不够等问题

java版本:17

服务端代码:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.*;
import java.util.*;

public class Sever {
    public static Sever Instance;
    private static  int port = 9999;
    private String[] id = {"1", "2", "3", "4", "5"};//ID为固定ID,可根据需求添加或更改
    Map<String, PrintWriter> land_id = new HashMap<>();
    //判断账号输入是否存在
    public boolean JudgeID(String id_)
    {
        for(int i = 0;i < id.length;i++)
        {
            if(Objects.equals(id_, id[i]))
            {
                return true;
            }
        }
        return false;
    }

    public void AddLandID(String id_, PrintWriter writer)
    {
        land_id.put(id_,writer);
    }


    public static void main(String[] args) throws IOException {
        Instance = new Sever();//通过使用单例来实现其他模块代码调用
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("服务器已启动,等待客户端连接...");
        //死循环使服务端一直运行
        while (true) {
            Socket clientSocket = null; // 接受客户端连接
            try {
                clientSocket = serverSocket.accept();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            new ClientWorking(clientSocket).start(); //为每个客户端创建一个新的线程处理
        }
    }
}

客户端进程代码:

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

public class ClientWorking extends Thread {
    private Socket clientSocket;
    private String clientId;
    private BufferedReader reader;
    private PrintWriter writer;

    private String aimId;


    public ClientWorking(Socket socket) {
        this.clientSocket = socket;
    }

    //重写进程运行代码,主要包括对客户端发送的信息进行处理
    @Override
    public void run() {
        try {
            reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            writer = new PrintWriter(clientSocket.getOutputStream(), true);
            // 登录过程,接收客户端ID
            while(true)
            {
                writer.println("请输入你的ID(输入/q断开连接):");//ID为服务端指定ID
                clientId = reader.readLine();
                if (Sever.Instance.JudgeID(clientId)) {
                    Sever.Instance.AddLandID(clientId, writer);
                    System.out.println(clientId + " 已连接.");
                    while(true)
                    {
                        writer.println("请输入你要发送信息到的目标ID:");
                        aimId = reader.readLine();
                        if (Objects.equals(aimId, "/q"))
                        {
                            System.out.println(clientId + " 已断开.");
                            return;
                        }
                        else if (Sever.Instance.land_id.containsKey(aimId)) {
                            String message;
                            while (true)
                            {
                                writer.println("(输入q退出)->");
                                if((message = reader.readLine()) != null)
                                {
                                    System.out.println("收到来自 " + clientId + " 的消息: " + message);
                                    if(message.equals("q"))
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        PrintWriter targetWriter = (Sever.Instance.land_id.get(aimId));
                                        targetWriter.println(clientId + ": " + message);
                                    }
                                }
                            }
                        }
                        else
                        {
                            writer.println("未找到用户,请再次输入(输入/q退出)");
                        }
                    }
                }
                else if (Objects.equals(clientId, "/q"))
                {
                    System.out.println(clientId + " 已断开.");
                    return;
                }
                else
                {
                    writer.println("输入id错误,请重新输入");
                }
            }

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

客户端代码:

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

public class Client {
    private static final String SERVER_ADDRESS = "localhost";
    private static final int SERVER_PORT = 9999;

    public static void main(String[] args) {
        try (Socket socket = new Socket(SERVER_ADDRESS, SERVER_PORT);
             BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
             BufferedReader serverReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter serverWriter = new PrintWriter(socket.getOutputStream(), true)) {
            System.out.println("连接到服务器成功.");
            // 登录
            System.out.println(serverReader.readLine()); // 服务器发送登录提示
            Scanner in = new Scanner(System.in);
            String clientId = in.next();
            serverWriter.println(clientId);
            if (clientId.equalsIgnoreCase("/q")) {
                serverWriter.println(clientId);
                return;
            }

            // 新建线程持续接收服务器反馈的消息
            new Thread(() -> {
                try {
                    String serverMessage;
                    while ((serverMessage = serverReader.readLine()) != null) {
                        System.out.println(serverMessage); // 打印来自服务器的消息1

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

            // 死循环持续检测发送消息
            while (true) {
                //System.out.print("请输入消息 (格式: 目标ID: 消息内容) 或 输入 'exit' 退出: ");
                String message = consoleReader.readLine();
                serverWriter.println(message);
                if (message.equalsIgnoreCase("/q")) {
                    serverWriter.println(message);
                    break;
                }
            }

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

标签:java,String,new,clientId,import,println,JAVA,NET,服务端
From: https://blog.csdn.net/qq_73300425/article/details/144274728

相关文章

  • JAVA学习-练习试用Java实现“从用户输入获取一个整数n,并打印出从1到n的所有整数的阶乘
    问题:编写一个Java程序,从用户输入获取一个整数n,并打印出从1到n的所有整数的阶乘。解答思路:以下是一个Java程序,它接受用户输入的整数n,并打印出从1到n的所有整数的阶乘:importjava.util.Scanner;publicclassFactorialCalculator{publicstaticvoidmain(String[]......
  • Linux下部署.Net 应用程序和Web应用程序
    发布应用:选择对应的平台版本进行保存发布。上传应用程序,进入发布的文件,压缩文件,在地址栏运行命令行(cmd),使用scp上传文件到对应的服务器。scppublish.ziproot@xxx.xxx.xxx.xxx:/var/wwwroot解压缩文件unzippublish.zipsudoyuminstallzipunzip#安装zip解压工具......
  • Java-19 深入浅出 MyBatis - 用到的设计模式 源码剖析 代理设计模式
    点一下关注吧!!!非常感谢!!持续更新!!!大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html目前已经更新到了:MyBatis(正在更新)代理模式概念介绍代理模式(ProxyPattern):给某一个对象提供一个代理,并由代理对象控制对原对象的引用,代理模式的英文名字叫Prox......
  • c#和 .net 类似于 java 和spring吗?
    是的,C#和.NET确实与Java和Spring有一些类似之处,它们在各自的生态系统中提供类似的功能和架构支持。以下是它们的对应关系和差异点:C#和Java的比较语言层面C#是一种由微软开发的现代化编程语言,语法风格与Java非常相似(两者都受C/C++的影响)。Java是一种跨......
  • 医院招聘考试管理系统|Java|SSM|JSP| 前后端分离
     【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远......
  • 医院远程诊断管理系统|Java|SSM|JSP| 前后端分离
    【重要1⃣️】前后端源码+万字文档+部署文档            【包含内容】【一】项目提供非常完整的源码注释【二】相关技术栈文档【三】源码讲解视频                     【其它服务】【一】可以提供远程......
  • javascript语言
    不要相信手掌的纹路,要相信手攥成拳的力量。javascript是一种脚本语言,和java完全不同的语言特点:大括号表示代码块区分大小写结尾的分号可加可不加,如果一行上写多个语句时,必须加分号用来区分多个语句单行注释//多行注释/**/注意:外部脚本不能包含<script>标签在js文件......
  • 关于java中的过滤器(Filter)
    在学习SpringBoot中了解到了过滤器和拦截器,浅谈一下对这两个的认识,若有不足,烦请斧正!首先,过滤器是javaWeb中提供的,而拦截器是spring提供的,这篇主要讲解Filter。用法:过滤器允许开发者在请求到达Servlet之前或响应返回客户端之前执行一些预处理或后处理操作(例如登录校验、敏感......
  • 【唐叔学算法】第一天:Java常见数据结构
    工欲善其事必先利其器。虽然算法本身是不区分语言的,但是作为专注于Java开发的唐叔,那么善于使用Java自带的已实现的数据结构,将有利于在更短的时间内快速通关具体的算法题。而今天我们就来学习Java中的数据结构实现。善用这些API将有助于我们更有效地存储和处理数据。数组(Ar......
  • 第 6 章 Java 并发包中锁原理剖析Part one
    目录6.1LockSupport工具类 6.2独占锁ReentrantLock的原理 获取锁 1.voidlock()方法2.voidlockInterruptibly()方法3.booleantryLock()方法4.booleantryLock(longtimeout,TimeUnitunit)方法释放锁6.1LockSupport工具类 LockSupport它的主......