首页 > 其他分享 >实现多客户端与服务端的连接,并实现群聊效果

实现多客户端与服务端的连接,并实现群聊效果

时间:2024-08-24 12:22:12浏览次数:12  
标签:java Socket 群聊 link new import public 服务端 客户端

1.创建客户端口

package com.test4;

import java.io.IOException;
import java.net.Socket;
import java.util.ArrayList;


public class KHD {
    public static void main(String[] args) throws IOException {
        Socket link = new Socket("127.0.0.1", 6666);


        XcReader reader = new XcReader(link);
        Thread t = new Thread(reader);
        t.start();

        XcWriter writer = new XcWriter(link);
        writer.start();



    }
}

2.创建服务端口

package com.test4;


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

public class FWD {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(6666);

        System.out.println("启动");
        //装载所有与服务端连接的客户端信息
        List<Socket> allLink = new ArrayList<>();
        for (int i = 0; i < 50; i++) {  //循环50个客户端
            Socket link = serverSocket.accept();
            allLink.add(link);

            //需要一个能读且能写的
            Thread t  = new RorW(link,allLink);
            t.start();

        }


    }
}

3.创建用于读取(接收消息)的线程

package com.test4;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.Socket;

public class XcReader implements Runnable {
    private Socket link;

    public XcReader(Socket link) {
        this.link = link;
    }

    @Override
    public void run() {
        try {
            InputStream is = link.getInputStream();
            Reader r = new InputStreamReader(is);

            while (true){
                StringBuilder str = new StringBuilder();
                while (true){
                    int a = r.read();
                    str.append((char)a);
                    if (str.toString().endsWith("[over]")){
                        break;
                    }
                }
                int i = str.indexOf("[over]");
                System.out.println("接受一条信息: "+str.substring(0,i));
            }

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

    }
}

4.创建用于说出(发送)的线程

package com.test4;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class XcWriter extends Thread{
    private Socket link;

    public XcWriter(Socket link) {
        this.link = link;
    }

    @Override
    public void run() {
        try {
            OutputStream os = link.getOutputStream();

            while (true){
                Scanner input = new Scanner(System.in);
                System.out.println("发送一条消息:");
                os.write(input.nextLine().getBytes());
                os.write("[over]".getBytes());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.创建能读能写的线程

package com.test4;

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

public class RorW extends Thread {

    private Socket link;
    private List<Socket> allLink;

    public RorW(Socket link, List<Socket> allLink) {
        this.link = link;
        this.allLink = allLink;
    }

    @Override
    public void run() {

        try {
            InputStream is = link.getInputStream();
            Reader reader = new InputStreamReader(is);

            while (true) {

                StringBuilder str = new StringBuilder();
                //一遍一遍读
                char[] chars = new char[0x10];
                while (true) {
                    int len = reader.read(chars);
                    str.append(chars, 0, len);
                    if (str.toString().endsWith("[over]")) {
                        break;
                    }
                }
                //代码至此 收到发送信息
                String r = str.toString().replace("[over]", "");
                System.out.println("收到了来自【" + link.getInetAddress() + "】的客户信息" + r);

                //找到所有的客户端 写给他们信息
                for (Socket s : allLink) {
                    if (link == s) {  //找到了本身
                        continue;
                    }
                    //找到别的客户端
                    OutputStream os = s.getOutputStream();
                    os.write(r.getBytes());
                    os.write("[over]".getBytes());
                }
            }


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

    }
}

6.运行结果:

客户端发送消息通过服务端来为其他客户端发送消息 其他客户端完成接受消息已实现群聊效果

标签:java,Socket,群聊,link,new,import,public,服务端,客户端
From: https://blog.csdn.net/weixin_53755148/article/details/141497869

相关文章

  • 渗透测试SSRF技术 之 【服务端请求伪造】 SSRF和CSRF区别是啥 从知道是啥到如何玩ssrf
    目录ssrf和csrf的区别是啥SSRF攻击流程SSRF带来的危害:最后:ssrf和csrf的区别是啥:解释:CSRF:跨站请求伪造,客户端请求伪造。SSRF(Server-SideRequestForgery:服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标......
  • 【开源免费】一款支持多数据库客户端(vs code设计理念,具有丰富的插件)
    AzureDataStudio是一款【开源免费】的数据管理和开发工具,可连接到常用的云和本地数据库。支持Windows、macOS和Linux,浏览扩展库以获取其他数据库支持选项,包括MySQL、PostgreSQL和MongoDB、SQLServer等...它还为SQL、PowerShell、Python、KQL、ApacheSparkTM和PyS......
  • 免输密码全自动登录金山文档Windows客户端 2024年8月22日
     免输密码全自动登录金山文档Windows客户端2024年8月22日  ;免输密码全自动登录金山文档Windows客户端2024年8月22日;;指纹加密U盘&FindText-v9.7-by-FeiYue&Loop-if-break&金山文档&Index-Your-Files&mstsc&零层壹号&WinSCP&USMv5&Acronis-true-Image-2021-WinPE&......
  • nextjs 客户端图片 因跨域 strict-origin-when-cross-origin 无法展示
    使用next.config.js配置跨域规则Next.js提供了一个配置文件next.config.js,你可以在其中配置images选项,以允许跨域加载图片。在Next.js中,remotePatterns配置用于定义允许加载远程图像的域名及路径。不过,remotePatterns并不支持传统的正则表达式,而是使用类似正则表达式......
  • PHP8.1新增的异步HTTP客户端
    php8.1新增的异步http客户端随着互联网的快速发展,各种Web应用程序的性能也变得越来越重要。为了提供更好的用户体验,开发人员需要使用高效的工具和技术来处理各种网络请求。幸运的是,PHP8.1引入了一个全新的功能,即异步HTTP客户端,它允许我们以非阻塞的方式执行HTTP请求,从而提高应用......
  • 利用Spring Boot的RestTemplate进行REST客户端开发
    利用SpringBoot的RestTemplate进行REST客户端开发大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在微服务架构中,服务之间的通信通常通过RESTAPI来实现。SpringBoot提供了RestTemplate,这是一个用于同步客户端REST请求的类。本文将介绍如何使用Spri......
  • 手把手教你用Go开发客户端软件(使用Go + HTML)
    开发桌面客户端软件一直是程序员的常见任务之一,而Go语言凭借其简洁、高效以及丰富的第三方库,越来越多地被用于开发各类应用程序。今天我们将结合Go语言和HTML,使用开源项目Sciter的Go绑定库go-sciter,为大家展示如何用最少的开发精力构建一个跨平台的桌面客户端。什么是......
  • tcp多个客户端访问服务端,运用多线程
    客户端packagecom.shujia.day20.tcpdemo3;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;importjava.util.Scanner;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通......
  • 一个专门用于Java服务端图片合成的工具,支持图片、文本、矩形等多种素材的合成,功能丰富
    前言在数字化营销的当下,企业对于图片处理的需求日益增长。然而,传统的图片处理方式往往需要复杂的操作和专业的技术,这不仅增加了工作量,也提高了时间成本。为了处理这一问题,一款能够简化图片合成流程的软件应运而生。介绍ImageCombiner是一款面向Java服务端的图片合成工具,以......
  • 如何利用sockserver模块编程实现客户端并发
    前面用sock模块写的服务端和客户端,存在一个大问题,就是当运行多个客户端的时候,必须等一个客户端运行结束,另一个客户端才能实现与服务端的交流,这显然不符合现实中的需求。有没有什么办法解决这个问题呢?有人说没有,屁话。当然有,这就需要用到一个sockserver的模块,用定义类继承类的方式......