Java实验三 基于GUI的网络通信程序设计【代码构建逻辑】【双向通信】【超多细节优化!!】

2023-11-18

写在前面:这次实验代码的构建主要是更加熟练的运用socket网络编程、文件输入输出流、GUI设计、容器的使用、多线程的运用等等多方面的知识,是综合类题型,做完受益身心的类型。

题目如下:

编写程序完成以下功能:

1.设计一个基于GUI的客户-服务器的通信应用程序,如图1,图2所示。

图1 Socket通信服务器端界面

图2 Socket通信客户端界面

2.图1为Socket通信服务器端界面,点击该界面中的【Start】按钮,启动服务器监听服务(在图1界面中间的多行文本区域显示“Server starting…”字样)。图2为Socket通信客户端界面,点击该界面中的【Connect】按钮与服务器建立链接,并在图2所示界面中间的多行文本区域显“Connect to server…”字样,当服务器端监听到客户端的连接后,在图1界面中间的多行文本区域追加一行“Client connected…”字样,并与客户端建立Socket连接。

3.当图1所示的服务器端和图2所示的客户机端建立Socket连接后,编程实现服务端、客户端之间的“单向通信”:在客户端的输入界面发送消息,在服务端接收该消息,并将接收到对方的数据追加显示在多行文本框中。


 下面开始做题:

一、学习基础知识

(如果想要学到什么的话,可以根据清单去学,不花很多时间

首先主要需要了解socket的知识,包括但不限于下列:(以下为最主要、基础的知识

1. ServerSocket、Socket的构造函数,需要什么东西来构造

2. 了解服务器与客户端之间依靠中间Socket连接,获取输入输出流

3. 为什么需要多线程,以及多线程的两种基本操作方法

        1) implements Runnable 

        2) extends Thread 

4. 在服务器与客户端通信的过程中,会引起阻塞的操作有哪几种。

了解完一些基本知识,发车,冲!!~

二、代码逻辑构建与代码包细节

之后,做出如下代码构建逻辑  (无GUI版 先设计这版的更容易理解基础知识。

 然后用如下代码包体现上面的逻辑构建

(无GUI版) 具体代码如下:(很多很多,我自己都不爱看  不过也不需要看,毕竟是我写的 :) 但是看一遍逻辑会清楚很多

因为比较大,所以分开服务端、客户端截图。

只是看起来很复杂,因为具体代码怎么写的都基本写出来,所以会显得很多。

 


但是毕竟我们的作业是有GUI版,所以再次进行代码逻辑构建

(有了上面一版的理解,有GUI版仅仅是多了GUI的代码设计而已

 

 上图知识点解释来啦:

1. 因为代码为了区分功能开了很多的类和文件 所以main函数主要用来组织这些类的发生。

2. 输出不需要等待scanner类的键盘输入了,只需要判断文本框内有没有东西然后直接输出就行,然后就直接send就可以了。

3. 因为服务器的启动时间由start组件来监听开启,所以相比于无GUI版代码直接使用start组件的类兼职accept(),意思是服务器默认永久等待客户端连接。

4. 和3一样,connect类相当于客户端的main函数,而且因为输出仅仅需要send来等待,所以这个时候使用connect兼职一下监听。

5. 为什么start和connect的里面的actionperformed不可以直接进行accept和监听呢?

因为在actionPerformed中体现点击事件,如果actionPerformed过长会一直假卡死,即该UI界面无法发生其他事件,无法进入下个动作,所以类似于accept和监听这样长时间的会阻塞线程的动作我们单独开启一个工作线程就不放在actionperformed里面了。

 代码包以及代码作用如下:(可以放大查看,代码思路都交代了

  注意:本来这里可以不使用接口类,其实没有必要,但是当时自己想实践一下面向接口的思想,并且让代码更有逻辑有利于后期维护,所以采用了很多接口类。

其实如果为了让actionperformed函数分开功能的话只需要直接写一个类进行了。不需要再写接口了。


有GUI版代码相比于无GUI版改进了很多用户交互的内容,做了很多优化包括但不限于:

1. 双向通信 2.选择不同客户发送消息 3.按钮事件的控制以及很多事件源监视器的委派 4.默认本地服务器等等。

三、具体成果显示

1. 可以连接多个客户

细节的优化:按钮事件的控制,不可调整窗口大小,默认本机地址、不同客户有自己的名字、且存在于下拉菜单中等等

2. 双向通信

细节的优化:区分客户发送的消息、分别发送给不同客户、 按钮点击文本框的清空等等

 

 3. 客户断开连接


附完整可运行代码:

代码逻辑如图: 

C_MyCommandSurveillanceForConnect接口
package Client;

import javax.swing.*;
import java.awt.event.ActionListener;
import java.net.Socket;

public interface C_MyCommandSurveillanceForConnect extends ActionListener {
     void setJTextField_IP(JTextField jTextField);
     void setJTextField_Port(JTextField jTextField);
     void setJTextArea(JTextArea jTextArea);
     void setSocket(Socket socket);
     void setBtn(JButton jButton);
}

C_MyCommandSurveillanceForSend接口
package Client;

import javax.swing.*;
import java.awt.event.ActionListener;
import java.net.Socket;

public interface C_MyCommandSurveillanceForSend extends ActionListener {
    void setJTextField(JTextField jTextField);
    void setSocket(Socket socket);
}

C_MySurveillanceForConnect类
package Client;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;


//根据输入的IP地址与端口号进行连接、监听信息线程 Client、ClientListen
public class C_MySurveillanceForConnect extends Thread implements C_MyCommandSurveillanceForConnect{
    JTextField jTextField_IP;
    JTextField jTextField_Port;
    JTextArea jTextArea;
    JButton btn;
    Socket client;
    DataInputStream in;
    String str;
    public void setJTextField_IP(JTextField jTextField){
        this.jTextField_IP = jTextField;
    }
    public void setJTextField_Port(JTextField jTextField){
        this.jTextField_Port = jTextField;
    }
    public void setBtn(JButton jButton){
        this.btn = jButton;
    }
    public void setJTextArea(JTextArea jTextArea){
        this.jTextArea = jTextArea;
    }
    public void setSocket(Socket socket){
        this.client = socket;
    }

    public void actionPerformed(ActionEvent e){
        btn.setEnabled(false);
        //判断IP与Port都填写完整,进行连接
        String IP, Port;
        if((Port = jTextField_Port.getText()) != null){
            InetAddress address;
            //开始进行连接
            try {
                if((IP = jTextField_IP.getText()) == null){
                    address = InetAddress.getLocalHost();
                }
                else{
                    address = InetAddress.getByName(IP);
                }
            }
            catch (UnknownHostException ex) {
                throw new RuntimeException(ex);
            }
            InetSocketAddress socketAddress = new InetSocketAddress(address, Integer.parseInt(Port));

            try {
                client.connect(socketAddress);
                jTextArea.append("Connecting to server...\n");
                jTextArea.paintImmediately(jTextArea.getBounds());
                in = new DataInputStream(client.getInputStream());

                Thread thread = this;
                thread.start();
            } catch (IOException ex) {
                throw new RuntimeException(ex);
            }

        }
        else{
            jTextArea.append("Please enter right IP and Port...\n");
            jTextArea.paintImmediately(jTextArea.getBounds());
        }

    }
    public void run(){

        while(true){
            try {
                str = in.readUTF();
                jTextArea.append("From server: " + str + "\n");
            } catch (IOException ex) {
                jTextArea.append("Disconnected to server...");
                jTextArea.paintImmediately(jTextArea.getBounds());
                break;
            }
        }
    }
}

C_MySurveillanceForSend类
package Client;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

//发送信息  ClientTx

public class C_MySurveillanceForSend implements C_MyCommandSurveillanceForSend {
    JTextField jTextField;
    Socket client;
    DataOutputStream out;

    public void setJTextField(JTextField jTextField){
        this.jTextField = jTextField;
    }
    public void setSocket(Socket socket){
        this.client = socket;
    }

    public void actionPerformed(ActionEvent e){
        try {
            out = new DataOutputStream(client.getOutputStream());
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
        try {
            out.writeUTF(jTextField.getText());
            jTextField.setText(null);
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}
C_MyGUI类
package Client;

import javax.swing.*;
import java.awt.*;
import java.net.Socket;

import static java.awt.Font.ITALIC;


//设置页面 添加监视器
public class C_MyGUI extends JFrame {
    JFrame jFrame = new JFrame();
    JTextField textF_IP, textF_port, textF_send;
    JButton btn_Connect, btn_send;
    JTextArea textArea;
    JPanel jPanel01;
    JPanel jPanel02;
    JPanel jPanel03;
    JPanel jPanel;
    //监视器接口
    C_MyCommandSurveillanceForSend myCommandSurveillanceForSend;
    C_MyCommandSurveillanceForConnect myCommandSurveillanceForConnect;
    //一个对象
    Socket client;

    //构造函数完成窗口的主流操作
    public C_MyGUI(){
        client = new Socket();
        init();
        jFrame.setResizable(false);
        jFrame.setBounds(100,100,460,360);
        jFrame.setTitle("客户端");
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    void init(){
        //服务器设置框
        jPanel = new JPanel();
        jPanel01 = new JPanel();
        jPanel02 = new JPanel();
        jPanel03 = new JPanel();
        textF_IP = new JTextField(10);
        textF_IP.setFont(new Font(null, Font.BOLD, 13));
        textF_port = new JTextField(8);
        textF_port.setFont(new Font(null, Font.BOLD, 13));
        btn_Connect = new JButton("Connect");
        jPanel01.add(new JLabel("Server IP: "));
        jPanel01.add(textF_IP);
        jPanel01.add(new JLabel("Port: "));
        jPanel01.add(textF_port);
        jPanel01.add(btn_Connect);
        jPanel01.setBorder(BorderFactory.createTitledBorder("客户机设置:"));
        //中间文本框
        textArea = new JTextArea(9,30);
        textArea.setLineWrap(true);
        textArea.setFont(new Font(null, Font.BOLD+ITALIC, 15));
        JScrollPane jScrollPane = new JScrollPane();
        jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        jScrollPane.setViewportView(textArea);
        jPanel02.add(jScrollPane);
        //send发送信息栏
        textF_send = new JTextField(23);
        textF_send.setFont(new Font(null, Font.BOLD, 13));
        btn_send = new JButton("Send");
        jPanel03.add(new JLabel("Send: "));
        jPanel03.add(textF_send);
        jPanel03.add(btn_send);

        //将上中下三个组件存放如jPanel
        jPanel.add(jPanel01,BorderLayout.NORTH);
        jPanel.add(jPanel02,BorderLayout.CENTER);
        jPanel.add(jPanel03,BorderLayout.SOUTH);
        jFrame.setContentPane(jPanel);
    }

    //设置监视器
    void setMyCommandSurveillanceForConnect(C_MyCommandSurveillanceForConnect myCommandSurveillanceForConnect){
        //利用组合设置对象
        this.myCommandSurveillanceForConnect = myCommandSurveillanceForConnect;
        myCommandSurveillanceForConnect.setJTextField_Port(textF_port);
        myCommandSurveillanceForConnect.setJTextField_IP(textF_IP);
        myCommandSurveillanceForConnect.setJTextArea(textArea);
        myCommandSurveillanceForConnect.setSocket(client);
        myCommandSurveillanceForConnect.setBtn(btn_Connect);
        //为事件源添加监视器  用户点击按钮才能够触发事件
        textF_port.addActionListener(myCommandSurveillanceForConnect);
        textF_IP.addActionListener(myCommandSurveillanceForConnect);
        btn_Connect.addActionListener(myCommandSurveillanceForConnect);
    }
    void setMyCommandSurveillanceForSend(C_MyCommandSurveillanceForSend myCommandSurveillanceForSend){
        this.myCommandSurveillanceForSend = myCommandSurveillanceForSend;
        myCommandSurveillanceForSend.setJTextField(textF_send);
        myCommandSurveillanceForSend.setSocket(client);
        //为事件源添加监视器
        textF_send.addActionListener(myCommandSurveillanceForSend);
        btn_send.addActionListener(myCommandSurveillanceForSend);
    }


}
Client_main类(可以设置多个相同的main类想起来连接了多个客户
package Client;


//192.168.197.121


public class Client_main {
    public static void main(String[] args){
        //设置GUI界面
        C_MyGUI myGui = new C_MyGUI();
        //设置监视器
        C_MySurveillanceForConnect MySurveillanceForConnect = new C_MySurveillanceForConnect();
        C_MySurveillanceForSend mySurveillanceForSend = new C_MySurveillanceForSend();
        myGui.setMyCommandSurveillanceForConnect(MySurveillanceForConnect);
        myGui.setMyCommandSurveillanceForSend(mySurveillanceForSend);

    }
}

S_MyCommandSurveillanceForStart接口
package Server;

import javax.swing.*;
import java.awt.event.ActionListener;

public interface S_MyCommandSurveillanceForStart extends ActionListener {
    void setJTextField(JTextField jTextField);
    void setJTextArea(JTextArea jTextArea);
    void setJBtn(JButton jButton);

}

S_MyCommandSurveillanceForSend接口
package Server;

import javax.swing.*;
import java.awt.event.ActionListener;

public interface S_MyCommandSurveillanceForSend extends ActionListener {
     void setJTextField(JTextField jTextField);
     void setJComboBox(JComboBox<String> jComboBox);
}

S_MySurveillanceForStart类
package Server;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Objects;

import static Server.S_MyGUI.socket_name;
import static Server.S_MyGUI.scs;


//accept工作线程 作用:基于GUI,读取port框内内容进行连接操作
//为客户取名,并且为每一位用户开启监听线程

public class S_MySurveillanceForStart extends Thread implements S_MyCommandSurveillanceForStart{
    JTextField Port;
    JTextArea jTextArea;
    JButton jButton;
    ServerSocket serverSocket;
    Socket sc;
    String client = "Client";
    String Client_name = null;
    static int client_num = 1;
    public void setJTextField(JTextField jTextField){
        this.Port = jTextField;
    }
    public void setJTextArea(JTextArea TextArea){
        this.jTextArea = TextArea;
    }
    public void setJBtn(JButton jButton){ this.jButton = jButton;}

    public void actionPerformed(ActionEvent e){
        Thread thread = this;
        thread.start();
    }
    public void run(){
        while(true){
            try{
                if(Port.getText() != null){
                    serverSocket = new ServerSocket(Integer.parseInt(Port.getText()));
                }
                else{
                    jTextArea.append("Please enter right Port...");
                    jTextArea.paintImmediately(jTextArea.getBounds());
                    break;
                }
            }
            catch (IOException exception){
                jTextArea.append("Server listening..."+ "\n");
                jTextArea.paintImmediately(jTextArea.getBounds());
            }
            try {
                if(client_num == 1){
                    jTextArea.append("Server starting..."+ "\n");
                    jTextArea.paintImmediately(jTextArea.getBounds());
                }
                sc = serverSocket.accept();
                scs.add(sc);
                if(Objects.equals(socket_name.get(0), "null")){
                    socket_name.remove(0);
                }
                Client_name = client + client_num;
                jTextArea.append(Client_name+" connected..."+ "\n");
                socket_name.add(Client_name);
                jTextArea.paintImmediately(jTextArea.getBounds());
            } catch (IOException even) {
                jTextArea.append("Server waiting..."+ "\n");
                jTextArea.paintImmediately(jTextArea.getBounds());
            }
            if(sc != null){
                client_num++;
                new ServerListenThread(sc, jTextArea, Client_name).start();
            }
        }
    }

}

S_MySurveillanceForSend类
package Server;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import static Server.S_MyGUI.scs;

public class S_MySurveillanceForSend implements S_MyCommandSurveillanceForSend{

    JTextField jTextField;
    JComboBox<String> jComboBox;
    Socket sc;
    DataOutputStream out;

    public void setJTextField(JTextField jTextField){
        this.jTextField = jTextField;
    }
    public void setJComboBox(JComboBox<String> jComboBox){
        this.jComboBox = jComboBox;
    }

    public void actionPerformed(ActionEvent e){
        sc = scs.elementAt(jComboBox.getSelectedIndex());
        try {
            out = new DataOutputStream(sc.getOutputStream());
            out.writeUTF(jTextField.getText());
            jTextField.setText(null);
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }

    }
}

S_MyGUI类
package Server;

import javax.swing.*;
import java.awt.*;
import java.net.Socket;
import java.util.Vector;
import static java.awt.Font.ITALIC;

//设置GUI界面 添加监视器 + 建立通信
public class S_MyGUI extends JFrame {
    //组件
    static Vector<String> socket_name;
    static Vector<Socket> scs;
    JFrame jFrame = new JFrame();
    JTextField textF_port, textF_send;
    JButton btn_start, btn_send;
    JTextArea textArea;
    JPanel jPanel01;
    JPanel jPanel02;
    JPanel jPanel03;
    JPanel jPanel;

    JComboBox<String> comboBox;
    //监视器接口
    S_MyCommandSurveillanceForStart myCommandSurveillanceForStart;
    S_MyCommandSurveillanceForSend myCommandSurveillanceForSend;
    //对象

    //构造函数完成窗口的主流操作
    public S_MyGUI(){
        socket_name = new Vector<>();
        scs = new Vector<>();
        socket_name.add("null");
        init();
        jFrame.setResizable(false);
        jFrame.setBounds(100,100,460,360);
        jFrame.setTitle("服务器");
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    void init(){
        //服务器设置框
        jPanel = new JPanel();
        jPanel01 = new JPanel();
        jPanel02 = new JPanel();
        jPanel03 = new JPanel();
        textF_port = new JTextField(23);
        textF_port.setFont(new Font(null, Font.BOLD, 13));
        btn_start = new JButton("Start");
        jPanel01.add(new JLabel("Port: "));
        jPanel01.add(textF_port);
        jPanel01.add(btn_start);
        jPanel01.setBorder(BorderFactory.createTitledBorder("服务器设置:"));
        //中间文本框
        textArea = new JTextArea(9,30);
        textArea.setLineWrap(true);
        textArea.setFont(new Font(null, Font.BOLD+ITALIC, 15));
        JScrollPane jScrollPane = new JScrollPane();
        JScrollBar jscrollBar = jScrollPane.getVerticalScrollBar();
        if (jscrollBar != null) {
            // 必须先获取一次jScrollBar.getMaximum(),否则滚动不到最底部, swing bug
            jscrollBar.setValue(jscrollBar.getMaximum());
            jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
        }
        jScrollPane.setViewportView(textArea);
        jPanel02.add(jScrollPane);
        //send发送信息栏
        textF_send = new JTextField(18);
        comboBox = new JComboBox<>(socket_name);
        textF_send.setFont(new Font(null, Font.BOLD, 13));
        btn_send = new JButton("Send");
        jPanel03.add(new JLabel("SendTo: "));
        jPanel03.add(comboBox);
        jPanel03.add(textF_send);
        jPanel03.add(btn_send);

        //将上中下三个组件存放如jPanel
        jPanel.add(jPanel01,BorderLayout.NORTH);
        jPanel.add(jPanel02,BorderLayout.CENTER);
        jPanel.add(jPanel03,BorderLayout.SOUTH);
        jFrame.setContentPane(jPanel);

    }

    //设置监视器
    void setMyCommandSurveillanceForStart(S_MyCommandSurveillanceForStart myCommandSurveillanceForStart){
        //利用组合设置对象
        this.myCommandSurveillanceForStart = myCommandSurveillanceForStart;
        myCommandSurveillanceForStart.setJTextField(textF_port);
        myCommandSurveillanceForStart.setJTextArea(textArea);
        myCommandSurveillanceForStart.setJBtn(btn_start);
        //为事件源添加监视器  用户按回车键、按钮都能够触发事件
        textF_port.addActionListener(myCommandSurveillanceForStart);
        btn_start.addActionListener(myCommandSurveillanceForStart);
    }
    void setMyCommandSurveillanceForSend(S_MyCommandSurveillanceForSend myCommandSurveillanceForSend){
        this.myCommandSurveillanceForSend = myCommandSurveillanceForSend;
        myCommandSurveillanceForSend.setJTextField(textF_send);
        myCommandSurveillanceForSend.setJComboBox(comboBox);
        //为事件源添加监视器
        textF_send.addActionListener(myCommandSurveillanceForSend);
        btn_send.addActionListener(myCommandSurveillanceForSend);

    }

}

ServerListenThread类
package Server;

import javax.swing.*;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import static Server.S_MyGUI.scs;
import static Server.S_MyGUI.socket_name;


//服务器输入流监听线程 作用:进行输入流的监听
public class ServerListenThread extends Thread{
    Socket sc;
    JTextArea jTextArea;
    DataInputStream in;
    String str;

    ServerListenThread(Socket socket, JTextArea jTextArea, String string){
        super(string);
        this.sc = socket;
        this.jTextArea = jTextArea;
        try {
            in = new DataInputStream(sc.getInputStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //后台死循环进行监听
    public void run(){
        while(true){
            try {
                str = in.readUTF();
                jTextArea.append(getName() + ": " + str + "\n");
                jTextArea.paintImmediately(jTextArea.getBounds());
            } catch (IOException e) {
                int index = scs.indexOf(sc);
                jTextArea.append(socket_name.get(index) + "disconnected...\n");
                scs.remove(index);
                socket_name.remove(index);
                if(socket_name.isEmpty()){
                    socket_name.add("null");
                }
                break;
            }

        }
    }

}

Server_main类
package Server;




public class Server_main {
    public static void main(String[] args){
        //设置GUI界面
        S_MyGUI myGui = new S_MyGUI();
        //添加监视器,利用组合调用方法
        S_MySurveillanceForStart mySurveillanceForStart = new S_MySurveillanceForStart();
        S_MySurveillanceForSend mySurveillanceForSend = new S_MySurveillanceForSend();
        myGui.setMyCommandSurveillanceForStart(mySurveillanceForStart);
        myGui.setMyCommandSurveillanceForSend(mySurveillanceForSend);

    }
}

 至此,所有代码就完成了哈哈哈。

源代码和教程附上,说是教程其实主要是讲出构建整个代码的知识与思路,希望在完成作业的同时能够对你有帮助来学习思路。

如果觉得还不错的话...... :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java实验三 基于GUI的网络通信程序设计【代码构建逻辑】【双向通信】【超多细节优化!!】 的相关文章

  • SpringBoot八种bean的加载方式

    目录 第一种bean的加载方式 配置文件 第二种加载bean方式 注解和扫描 创建第三方的bean对象 第三种加载bean方式 不使用配置文件 扩展 bean的加载方式扩展FactoryBean lt gt 扩展 ImportResourc
  • CloudCompare二次开发(1)——获取指定高程的所有点

    目录 一 源码编译 二 制作流程 三 结果展示 本文由CSDN点云侠原创 原文链接 爬虫网站自重 一 源码编译 1 WIN10系统下VS2019编译CloudCompare2 12 4 二 制作流程 1 找到源码中的插件例子 主要支持三种插
  • 线段树Segment tree(1):单点修改,区间查询

    问题描述 给定数列a 1 a 2 a N 依次进行Q次操作 操作有两类 1 i x 给定i x 将a i 加上x 2 l r 给定i x 求 i l r
  • IDEA中Translation插件无法使用怎么办?

    昨天一个小偷 来我家偷钱 我们一起找了一晚上 问题 谷歌翻译退出中国了 导致我的 IDEA 翻译插件 Translation 也不能用了 会出现这样的错误 更新 TKK 失败 请检查网络连接 解决办法 使用百度翻译 很多翻译都收费 百度翻译
  • spring boot配置类注册深入解析

    前言 spring ApplicationContext的刷新总体来看有两个过程 第一个是注册BeanDefinition 提供整个IOC容器初始化的材料 第二个是根据BeanDefinition加载bean 从spring boot开始
  • AlibabaProtect 卸载,不使用其他软件

    背景 发现系统中存在AlibabaProtect服务 停止不掉 文件夹也删除不掉 还占用内存 CPU 在网上也搜了很多其他的步骤 发现不太容易 这是整理的比较简单的 不需要装其他软件 步骤 1 删除注册表 AlibabaProtect搜索之
  • C++模板全特化(具体化)与偏特化(部分具体化)详解(转)

    1 模板简介 模板就是实现代码重用的一种机制 它可以实现类型参数化 即把类型定义为参数 从而实现了真正的代码可重用性 模板编程和函数重载可以实现C 静态多态 也叫编译时多态 模版可以分为两类 一个是 函数模版 另一个是 类模版 2 模板特化
  • STA(静态时序分析) 详解:如何计算最大时钟频率,以及判断电路是否出现时钟违例(timing violation)?

    1 什么是STA STA 静态时序分析 是时序验证的一种方法 用于计算和分析电路是否满足时序约束的要求 2 为什么需要STA 电路能否正常工作 其本质上是受最长逻辑通路 即关键路径 的限制 以及受芯片中存储器件的物理约束或工作环境的影响 为
  • 【1024狂欢】力扣经典链表OJ题合集

    现在的力扣题的源代码我会全部一并上传至我的码云仓库里面 点我看仓库 写在前面 首先祝各位程序猿1024狂欢节快乐鸭 这是属于我们的节日 为了致敬1024 今天的力扣系列不再是一题了 而是多个题的组合 也是与我们最近更新的内容梦幻联动 祝大家
  • Jenkins以root用户运行

    Jenkins安装完成后默认会创建一个jenkins的用户 并以jenkins用户运行 在我们通过jenkins编写一些命令的时候容易出现权限不足的提示 permision denied 通过为jenkins工作区赋予777的权限以后 也可
  • r语言写九九乘法表并保存为txt文件

    r语言写九九乘法表并保存为txt文件 代码 for i in 1 9 for j in 1 i cat j x i i j t file 九九乘法表 txt append TRUE cat n file 九九乘法表 txt append T
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 什么是protocol分层,垂直service??计算机网络详解【计算机网络养成】

    内容导航 分组丢失和延时 发生原因 四种分组延时 节点处理延迟 排队延迟 传输延时 Transmission 传播延时 Propagation 使用cmd命令tracert 和 tracerert 来检查延迟 分组丢失 吞吐量 有效的数据量
  • 斑马面试总结

    面试岗位 测试开发实习生 面试主要提问的是简历上的项目经历 测试相关的 给你一个视频软件 怎么测试 功能测试 黑盒测试 视频的封面正常 点击屏幕或播放键可以正常播放 视频时间倒计时显示正常 再次点击暂停 视频的声音 默认打开 无噪音 可以调
  • Java 实现令牌桶限流算法 原生极简实现 包括单机和多线程版本

    文章目录 令牌桶算法简介 令牌桶算法限流范围 单机版实现 多线程版实现 令牌桶算法简介 令牌桶是指一个限流容器 容器有最大容量 每秒或每100ms产生一个令牌 具体取决于机器每秒处理的请求数 当容量中令牌数量达到最大容量时 令牌数量也不会改
  • Deque接口简介说明

    转自 Deque接口简介说明 下文笔者讲述Deque接口的简介说明 如下所示 Deque简介 Deque接口是一个双端队列 可以对队列的头尾进行操作 所以也可以当做栈来使用 Queue和Deque接口的相对应方法 Queue方法 Deque
  • 前端将List列表转化为树型结构(reduce函数)

    主要用到了reduce 函数 for循环可以做到的事情reduce 都可以做到 甚至操作起来更加简单方便和高雅 reduce 为数组中的每一个元素依次执行回调函数 不包括数组中被删除或从未被赋值的元素 reduce语法 array redu
  • prometheus|云原生|轻型日志收集系统loki+promtail的部署说明

    一 日志聚合的概念说明 日志 每一个程序 服务都应该有保留日志 日志的作用第一是记录程序运行的情况 在出错的时候能够记录错误情况 简单来说就是审计工作 例如nginx服务的日志 kubernetes集群的pod运行日志 Linux系统的系统
  • 【网安入门】怎样花3个月零基础入门网络安全?

    写这篇教程的初衷是很多朋友都想了解如何入门 转行网络安全 实现自己的 黑客梦 文章的宗旨是 1 指出一些自学的误区 2 提供客观可行的学习表 3 推荐我认为适合小白学习的资源 大佬绕道哈 一 自学网络安全学习的误区和陷阱 1 不要试图先成为
  • 计算机提示vcruntime140.dll丢失的解决方法,多种修复教程分享

    vcruntime140 dll是一个非常重要的动态链接库文件 它包含了许多运行时的函数和类 然而 有时候我们可能会遇到vcruntime140 dll无法继续执行代码的问题 这会给我们带来很大的困扰 那么 这个问题是什么原因导致的呢 又应

随机推荐

  • 【状态估计】基于无味卡尔曼滤波模拟倾斜传感器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及讲解 1 概述 本文包括两部分中的第一部分 第一部分设计
  • VT Msr Hook Syscall

    VT Msr Hook Syscall 什么是系统调用 系统调用是内核提供给应用层的接口 比如在 win10x64 应用层打开一个应用 其实就是 explorer 调用了 CreateProcess 这个函数通过 NTDLL 调用表的 0x
  • 大数据技术——hadoop集群搭建出现的问题

    出现的问题和解决方案 ssh免密出现的问题 解决方法 出现上图的是语法错误 在ssh和 keygen中多了空格 去掉即可 2 ssh免密登录出现的问题 ssh登陆报错 WARNING REMOTE HOST IDENTIFICATION H
  • 区块链的工作原理

    区块链系统由数据层 网络层 共识层 激励层 合约层和应用层组成 其中 数据层封装了底层数据区块以及相关的数据加密和时间戳等基础数据和基本算法 网络层则包括分布式组网机制 数据传播机制和数据验证机制等 共识层主要封装网络节点的各类共识算法 激
  • tcp/ip 详细解析以及网络层简单的发送syn

    利用tcp发送syn 我们可以从网络层进行下发 其实就是组装tcp ip包发送出去 include
  • 微信小程序列表item左滑操作

    页面DOM index wxml
  • TLAB简单介绍

    1 什么是TLAB 新对象都是在Eden区分配空间 这块空间是在多线程间共享的 那么考虑一下 多线程是可能同时创建新对象的 这时候必然需要一种同步机制 使用队列 或者通过互斥 这些方式确实都可以 不过 我们还有一种更好的方式 TLAB 它全
  • 网络传输基本流程

    网络传输流程图 在数据链路层有一个标识 每一台主机的唯一符 MAC地址 MAC地址 计算机的网卡在出厂时就打上了一串数据 MAC 地址 其通常是唯一的 所以局域网中发消息必须加上目的主机的MAC地址 两台计算机通过 TCP IP 协议通讯的
  • 【算法笔记】Prim算法

    定义 prim算法 图论中的一种算法 可在加权连通图里搜索最小生成树 由此算法搜索到的边子集所构成的树中 不但包括了连通图里的所有顶点 并且其所有边的权值之和最小 算法描述 输入 一个加权连通图 其中顶点集合为V 边集合为E 初始化 Vne
  • Spring Cloud

    添加config properties文件就行了 内容为空的都可以 加上该文件再次运行
  • 如何防止CSRF攻击

    随着互联网的高速发展 信息安全问题已经成为企业最为关注的焦点之一 而前端又是引发企业安全问题的高危据点 在移动互联网时代 前端人员除了传统的 XSS CSRF 等安全问题之外 又时常遭遇网络劫持 非法调用 Hybrid API 等新型安全问
  • Lunece全文检索搜索引擎

    Lunece全文检索 1 什么是全文检索 lucene是apache软件基金会4 jakarta项目组的一个子项目 是一个开放源代码的全文检索引擎工具包 但它不是一个完整的全文检索引擎 而是一个全文检索引擎的架构 提供了完整的查询引擎和索引
  • Postman如何做接口测试,那些不得不知道的技巧

    目录 导读 前言 Postman如何做接口测试1 如何导入 swagger 接口文档 Postman如何做接口测试2 如何切换测试环境 Postman如何做接口测试3 什么 postman 还可以做压力测试 Postman如何做接口测试4
  • substance designer中的warp节点分析

    一直觉得warp挺适用 但是用起来有时候效果挺奇怪的 还有directional warp貌似两个产生的效果截然不同 于是尝试用u3d 材质实现下 directional warp 这个节点主要功能是用灰度信息推开像素 常常用来分割连续贴图
  • Ubuntu安装配置tftp服务器

    Ubuntu安装配置tftp服务器 实验环境 ubuntu 1604 x64 一 安装配置 建立tftp目录 sudo mkdir tftpboot sudo chmod 777 tftpboot 安装客户端和服务器 sudo apt ge
  • 大数据量的冒泡排序 (计次数)

    题目描述 给定一个包含从0到n 1各一次的数组 若使用冒泡排序将其排为升序 问其中需要进行多少次交换 输入 测试数据有多组 每组由两行组成 第一行包含正整数n n lt 5000 下一行包含从0到n 1的n个整数的序列 输出 对于每组测试数
  • [论文分享] Adversarial Training for Raw-Binary Malware Classifiers

    Adversarial Training for Raw Binary Malware Classifiers USENIX 2023 Keane Lucas Carnegie Mellon University Samruddhi Pai
  • 面试题61. 扑克牌中的顺子(java+python)

    从若干副扑克牌中随机抽 5 张牌 判断是不是一个顺子 即这5张牌是不是连续的 2 10为数字本身 A为1 J为11 Q为12 K为13 而大 小王为 0 可以看成任意数字 A 不能视为 14 示例 1 输入 1 2 3 4 5 输出 Tru
  • hex文件格式学习记录

    hex文件 hex文件是什么 hex文件的数据结构 按照记录类型具体分析 Mermaid Flowchart hex文件是什么 它是由一行行符合Intel HEX 文件格式的文本所构成的ASCII 文本文件 每一行包含一 个 HEX 记录
  • Java实验三 基于GUI的网络通信程序设计【代码构建逻辑】【双向通信】【超多细节优化!!】

    写在前面 这次实验代码的构建主要是更加熟练的运用socket网络编程 文件输入输出流 GUI设计 容器的使用 多线程的运用等等多方面的知识 是综合类题型 做完受益身心的类型 题目如下 编写程序完成以下功能 1 设计一个基于GUI的客户 服务