Java 聊天

TCP(一对一)聊天 

import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class c {
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    JScrollPane scroll;
    c(){
        jf=new JFrame("客户端");
        jBsend =new JButton("发送");
        jTAcontent =new JTextArea(13,40);
        jText =new JTextField(12);
        scroll=new JScrollPane(jTAcontent,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条
        JLcontent=new JLabel("聊天记录");
        jPanel=new JPanel();
    }
    public void Win()
    {
        Box boxVBox=Box.createVerticalBox();
        boxVBox.add(JLcontent);
        boxVBox.add(Box.createVerticalStrut(5));
        boxVBox.add(scroll);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jText);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jBsend);
        boxVBox.add(Box.createVerticalStrut(10));
        jPanel.add(boxVBox);
        jf.add(jPanel);
        jf.setSize(600, 400);
        jf.setResizable(false);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
   
    public void Connect() throws Exception{
        Socket sk= new Socket("127.0.0.1",1200);
        jBsend.addActionListener(e->{ //Lambda表达式实现点击按钮发送信息   
            String str=jText.getText(); //获取文本框内容
            if (str.matches("\\s+") || str.equals("")) {
                JOptionPane.showMessageDialog(jf, "不可发送空白内容");
                return;
            }
            try {
                jTAcontent.append("我:"+str+"\n"); //文本区添加文本框内容
                BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //字符流发送信息
                bw.write(str); //发送文本框的信息给对方
                bw.newLine(); //发送后换行
                bw.flush(); //立即发送
                //不用bw.close(),为了可以一直发送信息
                jText.setText("");
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            new Thread(()->{ //Lambda表达式创建线程
                while(true){ //死循环随时接受信息
                try {
                    BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream())); //以字符流接受信息
                    String read = br.readLine(); //一行一行接受信息
                    jTAcontent.append("客服:"+read+"\n");
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                }
            }).start(); //开启线程
        });
    }
    public static void main(String[] args) throws Exception {
        c client=new c();
        client.Win();
        client.Connect();
 
    }
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class a {
    //以下是聊天窗口的实现,上一篇文章有说过,不必多说
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    private JScrollPane scroll;
 
    a() { 
        jf = new JFrame("服务端");
        jBsend = new JButton("发送");
        jTAcontent = new JTextArea(13, 40);
        jText = new JTextField(12);
        scroll = new JScrollPane(jTAcontent, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本区添加竖直滑动条
        JLcontent = new JLabel("聊天记录");
        jPanel = new JPanel();
    }
 
    public void Win() {
        Box boxVBox = Box.createVerticalBox(); //这里应用了垂直盒式布局模式排列组件
        boxVBox.add(JLcontent);
        boxVBox.add(Box.createVerticalStrut(5));
        boxVBox.add(scroll);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jText);
        boxVBox.add(Box.createVerticalStrut(10));
        boxVBox.add(jBsend);
        boxVBox.add(Box.createVerticalStrut(10));
        jPanel.add(boxVBox);
        jf.add(jPanel);
        jf.setSize(600, 400);
        jf.setResizable(false);
        jf.setLocationRelativeTo(null);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
 
    public void Connect() throws Exception {
        ServerSocket ss = new ServerSocket(1200);
        while (true) {
            Socket sk = ss.accept();
                jBsend.addActionListener(e -> { //按钮响应事件,实现点击按钮发送信息
                    String str = jText.getText(); //获取文本框的内容
                    try {
                        jTAcontent.append("我:" + str + "\n");
                        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //以字符流发送信息
                        bw.write(str); //将文本框内容发送给对方
                        bw.newLine(); //发送后换行
                        bw.flush(); //立即发送
                        //不用bw.close(),为了可以一直发送信息
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                    jText.setText("");
                });
                new Thread(() -> { //开启线程,这里是为了服务端可同时接收到多个客户端信息
                while (true) { //设置死循环,用于随时接受信息
                    try {
                        BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); //字符流方式接受信息
                        String read = br.readLine(); //以字符串方式一行一行接受到信息
                        jTAcontent.append("客户:" + read + "\n"); //将接收的信息写入文本区
                    } catch (IOException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                    }
                }
            }).start(); //用start开启线程
        }
    }
 
    public static void main(String[] args) throws Exception {
        a server = new a();
        server.Win();
        server.Connect();
    }
}

 

 UDP 多人聊天

 //服务端
 
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class a{
    public static ServerSocket server_socket;
    public static ArrayList<Socket> socketList=new ArrayList<Socket>();  
    public static void main(String []args){
        try{
            server_socket = new ServerSocket(5000);
            while(true){
                Socket socket = server_socket.accept();
                socketList.add(socket); //把sock对象加入sock集合
                ServerBO_Thread st=new ServerBO_Thread(socket,socketList); //初始化多线程
                st.start();//启动多线程
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            try{
                if(server_socket!=null){
                    server_socket.close();
                }
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }
    public void encryptWrite(String src,DataOutputStream output)throws IOException{
        //将一个字符串转化为字符数组
        //System.out.println(src);
        char[] char_arr = src.toCharArray();
        //加密操作
        for(int i = 0;i<char_arr.length;i++){
            output.writeChar(char_arr[i]+13);
        }
        //用作结束标志符
        output.writeChar(2333);
        output.flush();
    }
    //读取并解密
    public String readDecrypt(DataInputStream input)throws IOException{
        String rtn="";
        while(true){
            int char_src =input.readChar();
            if(char_src!=2333){
                rtn=rtn+(char)(char_src-13);
            }else{
                break;
            }
        }
        return rtn;
    }
}
class ServerBO_Thread extends Thread{
    Socket client = null;
    ArrayList<Socket> clients;
    ServerBO_Thread(Socket s,ArrayList<Socket> ss){//初始化
        client=s;
        clients=ss; 
    }
    public void run(){
        DataInputStream input = null;
        DataOutputStream output =null;
        try{
            input = new DataInputStream(client.getInputStream());
            a bo = new a();
            String receive=null;
            String send=null;
            while(true){//监视当前客户端有没有发来消息
                if(!client.isClosed()){
                    receive=bo.readDecrypt(input);
                    clients.trimToSize();
                    String[] param = receive.split("&");
                    if(")start".equals(param[1])){    //分析客户端发来的内容
                        send = param[0]+"进入聊天室";
                    }else{
                        send = param[0]+"说:    "+param[1];
                    }
                    if(!("3333".equals(param[1]))){//3333为退出聊天室信号
                        for(Socket socket:clients){ //遍历socke集合 
                            //把读取到的消息发送给各个客户端  
                            if(!socket.isClosed()){
                                output = new DataOutputStream(socket.getOutputStream());
                                bo.encryptWrite(send,output);
                            }
                        }  
                    }else{//如果有客户端退出
                        for(Socket socket:clients){ //遍历socke集合 
                                if(socket!=client){//告诉其他人此人退出聊天室
                                    if(!(socket.isClosed())){
                                        output = new DataOutputStream(socket.getOutputStream());
                                        bo.encryptWrite(param[0]+"已退出聊天室",output);
                                    }
                                }
                            }
                        output = new DataOutputStream(client.getOutputStream());
                        bo.encryptWrite("666",output);//返回信号给要退出的客户端,然后关闭线程
                        client.close();
                        input.close();
                        output.close();
                    }
                }else{
                    break;
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
}
 //客户端
import java.io.IOException;
import java.util.Scanner;
import java.net.*;
import java.io.*;
import java.io.DataOutputStream;
public class c{
//服务端ip
    public  String ip = "127.0.0.1";
    //服务端端口
    public  int port = 5000;
    public  DataOutputStream output = null;
    public  Socket socket = null;
    public  DataInputStream input = null;
    public  Scanner sc =new Scanner (System.in);
    public  String send ;
    public  String receive;
    public  String name;
    public String sd = null;
    public static void main(String[]aa){
        c po = new c();
        po.start();
    }
    public void start(){
        try{
            System.out.println("*******欢迎使用匿名聊天室!**********");
            System.out.println("请输入你将要使用的昵称:");
            name=sc.nextLine();//获取昵称
            socket = new Socket(ip,port);
            output=new DataOutputStream(socket.getOutputStream());
            input = new DataInputStream(socket.getInputStream());
            send = name+"&)start";//把昵称发送到server 告诉所有人有新成员加入聊天室
            System.out.println("(如果要退出聊天室请输入“666”!)");
            System.out.println("*******成功进入匿名聊天室!**********");
            System.out.println("");
            encryptWrite(send,output);
            Out out=new Out(output,name,input,socket);
            out.start();//启动发送聊天内容的多线程
            while(true){    
                String receive = readDecrypt(input);
                if("3333".equals(receive)){//如果收到“3333”则退出聊天室
                    System.out.println("*******成功退出匿名聊天室!**********");
                    input.close();
                    output.close();
                    socket.close();
                    System.exit(0);
                }
                System.out.println(receive);
            }
        }catch(Exception ex){
                ex.printStackTrace();
        }finally{
            try{
                if(socket!=null) socket.close();
                input.close();
                output.close();
            }catch(Exception ex){
                ex.printStackTrace();
            }
        }    
    }
    public void encryptWrite(String src,DataOutputStream output)throws IOException{
        //将一个字符串转化为字符数组
        char[] char_arr = src.toCharArray();
        //加密操作
        for(int i = 0;i<char_arr.length;i++){
            output.writeChar(char_arr[i]+13);
        }
        //用作结束标志符
        output.writeChar(2333);
        output.flush();
    }
    //读取并解密
    public String readDecrypt(DataInputStream input)throws IOException{
        String rtn="";
        while(true){
            int char_src =input.readChar();
            if(char_src!=2333){
                rtn=rtn+(char)(char_src-13);
            }else{
                break;
            }
        }
        return rtn;
    }
}
class Out extends Thread {
    public DataOutputStream output;
    public DataInputStream input;
    public static String name;
    public Socket socket;
    public  Scanner sc =new Scanner (System.in);
    Out(DataOutputStream ot,String n,DataInputStream it,Socket socket){
        output=ot;
        input=it;
        name=n;
    }
    public void run(){
        c po = new c();
        try{
            while(true){
                String send=sc.nextLine();//获取用户输入
                String send2=name+"&"+send;//把聊天内容打包成约定形式
                po.encryptWrite(send2,output);
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }finally{
            System.out.println("sfef");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/225754.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于jsp+servlet的图书管理系统

基于jspservlet的图书管理系统演示地址为 图书馆后台管理系统 用户名:mr ,密码:123 图书馆管理系统主要的目的是实现图书馆的信息化管理。图书馆的主要业务就是新书的借阅和归还&#xff0c; 因此系统最核心的功能便是实现图书的借阅和归还。此外&#xff0c;还需要提供图书…

如何选择适合跨境业务的客服系统?

随着全球化的发展&#xff0c;越来越多的企业开始涉足跨境业务。而跨境业务的成功与否很大程度上取决于客服系统的选择。一个适合跨境业务的客服系统可以帮助企业提供高质量的客户服务&#xff0c;提升客户满意度&#xff0c;促进业务增长。本文将介绍如何选择适合跨境业务的客…

运维05:自动化

人工运维时代 运维人员早期需要维护众多的机器&#xff0c;因此需要执行很多重复的劳动&#xff0c;很多机器需要同时部署相同的服务或者是执行相同的命令&#xff0c;还得反复地登录不同的机器&#xff0c;执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…

el-tooltip (element-plus)修改长度

初始状态&#xff1a; 修改后&#xff1a; 就是添加 :teleported"false"&#xff0c;问题解决&#xff01;&#xff01;&#xff01; <el-tooltipeffect"dark"content"要求密码长度为9-30位&#xff0c;需包含大小写字母、数字两种或以上与特殊字…

codeforces 题目 Line Empire

目录 题目&#xff1a; 题目描述&#xff1a; 思路&#xff1a; 分析&#xff1a; 结论&#xff1a; AC代码&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 对于每个案例&#xff0c;先给你三个整数&#xff08;n&#xff0c;a&#xff0c;b&#xff09;&#xff…

项目分析:解决类的复杂设计中遇到的问题

1.问题1&#xff1a;析构函数乱码问题 【样例输入】 -3 1 3 -1 -3 2 3 -2 【样例输出】 gouzao 1 -3 1 3 -1 gouzao 2 -3 2 3 -2 -3 1 3 -1 -3 2 3 -2 9.4245 18.849 Ellipse xigou 3 -2 Point xigou 3 -2 Point xigou -3 2 Point xigou 3 -2 Point xigou -3 2…

DS1307时钟模块使用记录

在网上买的一个模块&#xff0c;准备做外部的一个时钟&#xff0c;接入自己其他的项目中&#xff0c;以它的时间为基准&#xff0c;执行每半小时更新时间到其他产品中去 模块采用软件IIC方式读写&#xff0c;需给此模块VCC供5V电压 读写效果如下&#xff1a; 源代码&#xff1…

持续集成交付CICD:GitLabCI 实现Sonarqube代码扫描

目录 一、实验 1.GitLabCI 代码扫描 二、问题 1.GitLab 执行sonar-scanner命令报错 一、实验 1.GitLabCI 代码扫描 &#xff08;1&#xff09;打开maven项目 &#xff08;2&#xff09;maven项目流水线调用公共库 &#xff08;3&#xff09;项目组添加token认证 &#xf…

电位器是什么

电位器 电子元器件百科 文章目录 电位器前言一、电位器是什么二、电位器的类别三、电位器的应用实例四、电位器的作用原理总结前言 电位器是一种可调节的电阻器,通过改变电位器的接触位置,可以改变电位器的电阻值,用于调节电路中的电流、电压、信号等参数。 一、电位器是什…

推荐5款很牛的Paas平台编译构建工具

发现市面上这方面的文章还比较少&#xff0c;来扩充一下。 常用的 PaaS 平台内的构建工具包括了以下这些&#xff1a; 一、AWS CodeBuild 托管在 AWS 云平台上&#xff0c;具有高可用性和弹性。支持多种编程语言和框架&#xff0c;包括 Java、Python、Node.js、Ruby 等。可以…

履带吊,笔记

0.前言 履带吊使用了与传统的门桥式起重机不同的技术路线。因为它是移动式设备&#xff0c;所以它的动力是燃油发动机。为了精确调控升降。它的整套动力系统似乎采用了某种液压传动系统。履带吊国内也有生产商。但是下文中&#xff0c;还是从国外的一款产品说起。这款产品的pd…

HarmonyOS开发工具DevEco Studio的下载和安装

一、DevEco Studio概述 一、下载安装鸿蒙应用开发工具DevEco Studio 开发鸿蒙应用可以从鸿蒙系统上运行第一个程序Hello World开始。 为了得到这个Hello World&#xff0c;你需要得到这个Hello World的源代码&#xff0c;源代码是用人比较容易看得懂的计算机编程语言规范写的…

2024黑龙江省职业院校技能大赛信息安全管理与评估样题第二三阶段

2024黑龙江省职业院校技能大赛暨国赛选拔赛 "信息安全管理与评估"样题 *第二阶段竞赛项目试题* 本文件为信息安全管理与评估项目竞赛-第二阶段试题&#xff0c;第二阶段内容包括&#xff1a;网络安全事件响应、数字取证调查和应用程序安全。 极安云科专注技能竞赛…

Java对象转Map

在和外部系统对接时&#xff0c;对方系统提供的SDK方法入参全是Map&#xff0c;没办法&#xff0c;只能想办法把对象转成Map。这里&#xff0c;借助了hutool的工具类&#xff0c;可以方便的通过反射获取对象的属性。引入hutool的maven配置&#xff1a; <dependency><g…

从霸总短剧的热播,看出海品牌如何巧妙利用短剧进行全球推广

近期&#xff0c;中国式“霸总”短剧在国外走红&#xff0c;看着这熟悉的剧情模式和作品结构&#xff0c;让一众国内网友震惊的同时&#xff0c;也为中国品牌的全球推广带来了新的思路和灵感。本文Nox聚星将和大家从霸总短剧在海外的热播出发&#xff0c;探讨出海品牌如何巧妙利…

附录2、vuepress自定义home页

# 1、vuepress的主体继承 # 2、创建覆盖的home页面 从Github官网仓库中拷贝文件 [外链图片转存中…(img-hpmT5V89-1701937211778)] # 3、修改需要的样式 # 效果 改之前 [外链图片转存中…(img-mCfFRWok-1701937211783)] 改之后 [外链图片转存中…(img-aeQg8j1B-170193721178…

几分钟在Ubuntu搭建本地Emlog博客网站并发布至公网无需购买域名服务器

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

[MySQL] MySQL中的内置函数

本篇文章主要是对MySQL中常见的内置函数进行了详细解释。例如有日期类函数、字符串类函数、数学类函数等等。希望本篇文章会对你有所帮助。 文章目录 一、日期类函数 1、1 使用详解 1、2 实例演示 二、字符串函数 2、1 使用详解 2、2 实例演示 三、数学函数 四、其他函数 &…

Linux Docker 安装Nginx

1.21、查看可用的Nginx版本 访问Nginx镜像库地址&#xff1a;https://hub.docker.com/_/nginx 2、拉取指定版本的Nginx镜像 docker pull nginx:latest #安装最新版 docker pull nginx:1.25.3 #安装指定版本的Nginx 3、查看本地镜像 docker images 4、根据镜像创建并运行…

Linux学习笔记2

web服务器部署&#xff1a; 1.装包&#xff1a; [rootlocalhost ~]# yum -y install httpd 2.配置一个首页&#xff1a; [rootlocalhost ~]# echo i love yy > /var/www/html/index.html 启动服务&#xff1a;[rootlocalhost ~]# systemctl start httpd Ctrl W以空格为界…