Java 简易版 TCP UDP聊天

客户端

 import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class MyClient {
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    JScrollPane scroll;
    MyClient(){
        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 {
        MyClient client=new MyClient();
        client.Win();
        client.Connect();
 
    }
}

服务端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;
 
public class MyServer {
    //以下是聊天窗口的实现,上一篇文章有说过,不必多说
    private JFrame jf;
    private JButton jBsend;
    private JTextArea jTAcontent;
    private JTextField jText;
    private JLabel JLcontent;
    private Date data;
    private JPanel jPanel;
    private JScrollPane scroll;
 
    MyServer() { 
        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 {
        MyServer server = new MyServer();
        server.Win();
        server.Connect();
    }
}

结果:

 

 UDP 多人聊天室

服务端

 
 
import java.io.*;
import java.net.*;
import java.util.ArrayList;
public class Server{
    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());
            Server bo = new Server();
            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("3333",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.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.DataOutputStream;
public class People{
//服务端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){
        People po = new People();
        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("(如果要退出聊天室请输入“3333”!)");
            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(){
        People po = new People();
        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/225224.html

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

相关文章

自定义类加载器

通过继承ClassLoader类&#xff0c;重写findClass方法&#xff0c;实现自定义类加载器。 一、自定义类加载器 package com.molange.JavaSE.myclassloader;import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; impor…

MATLAB - 绘制立体图(平面+水深)

目录 代码结果 代码 % 在 X-Y 平面上绘图 % 正常绘制平面图 [X,Y,Z] peaks; contour(X,Y,Z,20); hold on% ****重点******************************************** % 改为三维视图&#xff0c;具体可以help % view(3); %此时的平面图对应z0 &#xff1b;默认az-37.5&#x…

大模型在企业知识库场景的落地思考

一、引言 在这个信息爆炸的时代&#xff0c;企业的知识库已不再是简单的数据堆砌&#xff0c;而是需要智能化、高效率的知识管理和利用。大模型作为AI领域的一个重要突破&#xff0c;正逐步成为企业知识库管理的强大助力。通过前面一段时间对于大模型在企业落地的深入调研和实…

Linux---逻辑卷管理

本章主要介绍逻辑卷的管理。 了解什么是逻辑卷创建和删除逻辑卷扩展逻辑卷缩小逻辑卷逻辑卷快照的使用 前面介绍了分区的使用&#xff0c;如果某个分区空间不够&#xff0c;想增加空间是非常困难的。所以&#xff0c;建议尽可能使用逻辑卷而非普通的分区&#xff0c;因为逻辑卷…

【C语言】数据在内存中的存储

目录 练笔 整型数据的存储&#xff1a; char 型数据——最简单的整型 整型提升&#xff1a; 推广到其他整形&#xff1a; 大小端&#xff1a; 浮点型数据的存储&#xff1a; 存储格式&#xff1a; 本篇详细介绍 整型数据&#xff0c;浮点型数据 在计算机中是如何储存的。…

Redis和MySQL双写一致性实用解析

1、背景 先阐明一下Mysql和Redis的关系&#xff1a;Mysql是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致&#xff08;即缓存一致性问题…

RT-DETR手把手教程:NEU-DET钢材表面缺陷检测任务 | 不同网络位置加入EMA注意力进行魔改

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;本文首先复现了将EMA引入到RT-DETR中&#xff0c;并跟不同模块进行结合创新&#xff1b;1&#xff09;多种Rep C3结合&#xff1b;2&#xff09;直接作为注意力机制放在网络不同位置&#xff1b; NEU-DET钢材…

C#excel导入dategridview并保存到数据库/dategridview增加一行或几行一键保存数据库

excel导入到dategridview显示并保存到数据库 dategridview增加一行或几行一键保存数据库 ExcelHelper类(这个要导入NPOI包) using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using Syste…

java多人聊天

服务端 package 多人聊天;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;…

用 Bytebase 做数据库 schema 迁移

数据库 schema 迁移指修改管理数据库结构的变更&#xff0c;包括为数据库添加视图或表、更改字段类型或定义新约束。Bytebase 提供了可视化 GUI 方便迁移数据库 schema&#xff0c;本教程将展示如何使用 Bytebase 为 schema 迁移配上 SQL 审核&#xff0c;自定义审批流&#xf…

解决Could not establish connection to : XHR failed

解决Could not establish connection to : XHR failed 问题描述 用vscode用远程连接服务器时总报上面的错误&#xff0c;用xshell和Xftp和vscode终端都可以连上&#xff0c;但是用vscode的ssh连接缺总报错&#xff0c;导致无法连接服务器进行代码调试 一、原因 原因可能是在…

Python tkinter 之文件对话框(filedialog)

文章目录 1 文件1.1 获取单个文件名称&#xff1a;askopenfilename()1.2 获取多个文件名称&#xff1a;askopenfilenames()1.3 获取单个文件属性&#xff1a;askopenfile()1.4 获取多个文件属性&#xff1a;askopenfiles()1.5 获取保存文件的路径&#xff1a;asksaveasfilename…

树莓派4B iio子系统 mpu6050

编写基于iio的mpu6050 遇到的问题&#xff0c;在读取数据时&#xff0c;读出来的数据不能直接拼接成int类型 需要先将其转换成short int&#xff0c;再转换成int 效果如图所示 注&#xff1a;驱动是使用的modprobe加载的 简单画的思维导图 设备树修改部分&#xff1a; …

大模型发展对教育领域的巨大影响

摘要&#xff1a; 教育是一个复杂而微妙的领域;有效的教学涉及对学生认知的推理&#xff0c;并应反映学生的学习目标。基础模型的性质在这里提出了在人工智能教育领域尚未实现的承诺&#xff1a;虽然教育中的某些许多数据流单独地过于有限&#xff0c;无法训练基础模型&#xf…

【linux系统编程】编辑器gcc/g++

目录 Linux下的编辑器 介绍&#xff1a; 1&#xff0c;编辑器gcc/g 1-1&#xff0c;系统的编译过程 1-2&#xff0c;预处理过程 1-3&#xff0c;编译过程 1-4&#xff0c;汇编过程 1-5&#xff0c;链接过程 Linux下的编辑器 介绍&#xff1a; Linux系统下可支持很多高…

祝大雪节气安康,大雪动态表情包图片带字祝福大全,大雪快乐暖心问候祝福语

1、大雪节气&#xff0c;送你防寒秘笈&#xff1a;1、天寒地冻防路滑;2、寒风呼啸防感冒;3、寒气袭人防哮喘;4、戴上耳套防冻耳;5、戴上手套防冻手;6、穿上棉鞋防冻脚;7、多喝开水防上火。8、加强锻炼防疾患。祝健康快乐。 2、奉天承运&#xff0c;皇帝诏曰&#xff1a;大雪节气…

STM32CubeMx+MATLAB Simulink串口输出实验

STM32CubeMxMATLAB Simulink串口输出实验 &#x1f4cc;《STM32CubeMxMATLAB Simulink点灯程序》&#x1f4cd;相关篇《MATLAB Simulink STM32硬件在环 &#xff08;HIL&#xff09;实现例程测试》&#x1f516;需要的软件支持包&#xff1a;Embedded Coder Support Package fo…

Spingboot 之spring-boot-starter-parent与spring-boot-dependencies区分

在创建spring boot工程时&#xff0c;spring-boot-starter-parent 和 spring-boot-dependencies是二选一的关系&#xff0c;在pom中引入其中一个就可以了。 那么什么时候用spring-boot-starter-parent 和 spring-boot-dependencies呢&#xff1f;从字面名称上看&#xff0c;如…

「Verilog学习笔记」根据状态转移写状态机-二段式

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 和三段式相比&#xff0c;就是将输出块和次态切换块合并。 timescale 1ns/1nsmodule fsm2(input wire clk ,input wire rst ,input wire data ,output reg flag );//****…

利器|一款集成的BurpSuite漏洞探测插件

本着市面上各大漏洞探测插件的功能比较单一&#xff0c;因此与TsojanSecTeam成员决定在已有框架的基础上修改并增加常用的漏洞探测POC&#xff0c;它会以最少的数据包请求来准确检测各漏洞存在与否&#xff0c;你只需要这一个足矣。 1、加载插件 2、功能介绍 &#xff08;1&a…