利用java编写网络聊天程序并加密信息

优化了代码后的地址:https://blog.csdn.net/qq_43483251/article/details/125470514?spm=1001.2014.3001.5501

所用知识:javaGUI+网络编程+多线程+信息加密

**原理:**GUI编写基本的图形化界面,利用UDP传输信息,利用多线程同时接收以及发送信息,利用信息加密,加密,密码以及聊天信息。

可能会遇到的问题:

2.javaGUI中的重画方法,repaint只能在原有基础上重绘,并不能清除原来痕迹。因为我使用的Swing默认为轻量级则不执行update,awt组件才是重量级。解决方法:

removeAll()移除组件,repaint()刷新面板,再添加组件( add() ),最后重新布局面板( revalidate() )。

3.只有字符串类型的相同变量的哈希值才会相同,因为字符串都存储在同一内存池中,且每定义一个字符串变量会先判断内存池中是否有相同内容的,如果有就不会开辟新的空间,而是直接将变量指向此内容。

4.网络编程中接收的消息被存储进字节数组中,再次拿出来时其实还附带了空余的字节数组空间中的默认值:0,需要对字节数组做判断并只拿取有效的字符串信息。

代码:

登陆界面代码:

package MyNetworkSecurity01;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.*;public class Land   {//用来当按钮按下后赋值的变量,控制客户端的弹出int i=0;JFrame frame=new JFrame();//设置面板,为了显示标签JPanel panel=new JPanel();//设置账号,密码的标签JLabel land =new JLabel("请登录或者注册!");JLabel accountNumber =new JLabel("账号:");JLabel password=new JLabel("密码:");//设置标签旁的文本框,因为要观察加密情况,所以密码框也使用普通文本框JTextField accountNumber02 = new  JTextField(20);JTextField password02 = new  JTextField(20);//设置登陆和注册按钮!JButton landButton= new JButton("登陆");JButton registerButton = new JButton("注册");//显示登陆成功的标签JLabel label = new JLabel( "登陆成功!");//登陆成功后跳转的按钮JButton Jump=new JButton("继续");//构造方法Land(){//设置界面居中frame.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2-200,Toolkit.getDefaultToolkit().getScreenSize().height/2-250,400,500);//设置程序标题frame.setTitle("                      登陆界面");//设置关闭frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置容器Container container=frame.getContentPane();//设置面板的布局panel.setLayout(null);//将面板放入容器container.add(panel);//设置标签位置land.setBounds(100,25,200,50);accountNumber.setBounds(50,75,50,50);password.setBounds(49,150,50,50);//设置字体的样式:行楷,粗体,大小land.setFont(new Font("行楷",Font.BOLD,20));accountNumber.setFont(new Font("行楷",Font.BOLD,20));password.setFont(new Font("行楷",Font.BOLD,20));//将标签放入面板panel.add(land);panel.add(accountNumber);panel.add(password);//设置文本框的位置accountNumber02.setBounds(100,85,200,30);password02.setBounds(99,160,200,30);//将文本框放入面板panel.add(accountNumber02);panel.add(password02);//设置按钮的位置和大小landButton.setBounds(70,300,80,35);registerButton.setBounds(230,300,80,35);//将按钮添加进面板panel.add(landButton);panel.add(registerButton);Button_ button_ = new Button_();//创建按钮点击事件实现类的对象//设置按钮的监听事件//登陆的监听事件landButton.addActionListener(button_);//注册的监听事件registerButton.addActionListener(button_);Jump.addActionListener(new Button_01());//文本框的事件监听//账号框accountNumber02.addActionListener(button_);//密码框password02.addActionListener(button_);frame.setVisible(true);}//用成员内部类实现按钮点击事件class  Button_ implements ActionListener  {@Overridepublic void actionPerformed(ActionEvent e) {//获取账号框的内容String accountNumber_Button = accountNumber02.getText();accountNumber02.setText("");//清空账号框//获取密码框内容String password_Button = (password02.getText());password02.setText("");//清空密码框//确认账号,密码输入不为空if (accountNumber_Button.equals("") || password_Button.equals("")) {JLabel password03 = new JLabel("抱歉,框不能为空!");password03.setForeground(Color.red);//设置字体颜色password03.setBounds(70, 350, 250, 40);password03.setFont(new Font("行楷", Font.BOLD, 20));panel.removeAll();//移除组件panel.repaint();//刷新移除组件后的效果组件//重新添加组件panel.add(land);panel.add(accountNumber);panel.add(password);panel.add(accountNumber02);panel.add(password02);panel.add(landButton);panel.add(registerButton);panel.add(password03);//重新布局面板panel.revalidate();} else {String hashCode_password="";//将接收到的密码转换成字符数组进行倒置//将获取的密码(字符串)变成字符数组char[] hashCode_password01 =password_Button.toCharArray();//倒置字符数组并转换成字符串,如:第一个变为最后一个。for (int length = hashCode_password01.length-1; length >=0; length--) {hashCode_password=hashCode_password+hashCode_password01[length];}//计算密码的字符串形式的哈希值,并重新赋值给hashCode_password(字符串变量)int i = hashCode_password.hashCode();hashCode_password=""+i;//处理登陆和注册问题if (e.getActionCommand().equals("登陆")) {try {TextSend(accountNumber_Button,hashCode_password);} catch (IOException  ioException) {ioException.printStackTrace();}}//设置显示点击按钮后加密后的密码JLabel password03 = new JLabel("加密后的密码是:");password03.setForeground(Color.red);//设置字体颜色password03.setBounds(70, 100, 200, 40);password03.setFont(new Font("行楷", Font.BOLD, 20));JTextField password_text = new JTextField();//用来显示加密后的密码password_text.setBounds(70, 150, 250, 35);password_text.setText(""+hashCode_password);panel.removeAll();//移除组件panel.repaint();//刷新移除组件后的效果组件//重新添加组件panel.add(password03);panel.add(password_text);panel.add(label);panel.add(Jump);//重新布局面板panel.revalidate();}}}class  Button_01 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e1) {//设置登陆后的跳转按钮点击事件if(e1.getActionCommand().equals("继续")){frame.setVisible(false);//对信息加密解密的类EncryptionAndDecryption ed = new EncryptionAndDecryption();YouClient youClient = new YouClient();//接收Runnable runnable = () -> {//定义自身名字 //定义对方的端口号//建立进程要用的端口DatagramSocket socket = null;try {socket = new DatagramSocket(9100);} catch (SocketException e) {e.printStackTrace();}//  设置一个接收数据的字符串String data;while (true) {//设置一次接收多少的字节byte数据byte[] data_byte = new byte[100];//单位是字节//构造一个 DatagramPacket用于接收长度的数据包 length 。DatagramPacket packet = new DatagramPacket(data_byte, 0, data_byte.length);//接收来自DatagramPacket的数据包try {socket.receive(packet);} catch (IOException e) {e.printStackTrace();}String s3="";//存储接收到的信息char[] s2 = (new String(packet.getData(), 0, packet.getData().length)).toCharArray();for(char s1:s2){if(s1==0)break;s3=s3+s1;}//在界面上显示收到的信息youClient.receive_text01.setText(s3);//解密ed.Decryption(s3);youClient.receive_text02.setText(ed.data02);//获得包裹中的数据data = "服务端:" + " " +ed.data02;if (!data.equals("")) {youClient.str = youClient.str + data + "\n";youClient.ChatBox.setText(youClient.str);}youClient.connect.setText("连接成功!");}};//接收Thread thread = new Thread(runnable);thread.start();}}}public static void main(String[] args)  {new Land();}//用来发送登陆请求并接收回执/或者发送消息public void TextSend(String accountNumber,String password ) throws IOException {//建立端口DatagramSocket socket=new DatagramSocket(9090);//获取本机地址InetAddress inetAddress=InetAddress.getByName("localhost");//设置另一个的端口号int port=5051;//账号和密码的数据String account="账号"+accountNumber+"密码"+password;//发送数据需要的,数据,地址,端口号DatagramPacket packet=new DatagramPacket(account.getBytes(),0,account.getBytes().length,inetAddress,port);//打包发送socket.send(packet);//接收回执//接收数据包byte[] buffer=new byte[1024];//构造一个 DatagramPacket用于接收长度的数据包 length 。DatagramPacket packet1=new DatagramPacket(buffer,0,buffer.length);//接收来自DatagramPacket的数据包socket.receive(packet1);String receive = new String(packet1.getData(), 0, "登陆成功!".getBytes().length);if(receive.equals("登陆成功!")){try {label.setBounds(120,190,250,30);label.setFont(new Font("行楷", Font.BOLD, 30));Jump.setBounds(140,350,100,30);} catch (Exception e) {e.printStackTrace();}}//关闭流socket.close();}
}


服务端代码:

package MyNetworkSecurity01;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.*;public class MyServer {//用来存储聊天信息static String str="";//用来接收输入框中的信息static String str1="";JFrame frame=new JFrame();//设置最内层面板JPanel panel=new JPanel();//设置panel_text聊天面板的组件JTextArea ChatBox=new JTextArea(20,10);//文本域,聊天记录显示//设置显示对话内容的面板JScrollPane panel_text=new JScrollPane(ChatBox);//设置容器Container container=frame.getContentPane();//panel的组件JTextField connect = new JTextField();//标签JLabel receive01=new JLabel("收到的加密信息:");JLabel receive02=new JLabel("解译后:");JLabel send_out01=new JLabel("想发送的文字:");JLabel send_out02=new JLabel("加密后:");//文本框JTextField receive_text01=new JTextField();JTextField receive_text02=new JTextField();JTextField send_out_text01=new JTextField();JTextField send_out_text02=new JTextField();JTextField ChatText=new JTextField();//聊天输入框JButton inButton=new JButton("发送"); //发送信息按钮public void init(){//设置界面居中frame.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2-300,Toolkit.getDefaultToolkit().getScreenSize().height/2-350,600,700);//设置程序标题frame.setTitle("服务端");//设置关闭frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置面板的布局panel.setLayout(null);//设置聊天面板的大小,位置panel_text.setBounds(200,0,380,500);//将面板放入容器container.add(panel);panel.add(panel_text);//设置最内层面板的组件connect.setBounds(20,50,150,30);receive01.setBounds(20,130,180,30);receive01.setFont(new Font("行楷",Font.BOLD,20));receive01.setForeground(Color.red);//设置字体颜色receive_text01.setBounds(20,160,150,30);receive_text01.setFont(new Font("行楷",Font.BOLD,20));receive02.setBounds(20,190,150,30);receive02.setFont(new Font("行楷",Font.BOLD,20));receive02.setForeground(Color.red);receive_text02.setBounds(20,220,150,30);receive_text02.setFont(new Font("行楷",Font.BOLD,20));send_out01.setBounds(20,300,150,30);send_out01.setFont(new Font("行楷",Font.BOLD,20));send_out01.setForeground(Color.blue);//设置字体颜色send_out_text01.setBounds(20,330,150,30);send_out_text01.setFont(new Font("行楷",Font.BOLD,20));send_out02.setBounds(20,360,150,30);send_out02.setFont(new Font("行楷",Font.BOLD,20));send_out02.setForeground(Color.blue);//设置字体颜色send_out_text02.setBounds(20,390,150,30);send_out_text02.setFont(new Font("行楷",Font.BOLD,20));//聊天输入框设置ChatText.setBounds(200,500,300,30);//聊天框的发送按钮inButton.setBounds(500,500,100,30);//聊天域的字体,大小设置ChatBox.setFont(new Font("行楷",Font.BOLD,20));panel.add(connect);panel.add(receive01);panel.add(receive_text01);panel.add(receive02);panel.add(receive_text02);panel.add(send_out01);panel.add(send_out_text01);panel.add(send_out02);panel.add(send_out_text02);panel.add(ChatText);panel.add(inButton);frame.setVisible(true);//发送按钮的监听事件inButton.addActionListener(new InButton());}//成员内部类实现接口且发发送数据class InButton implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//获取聊天输入框的内容str1 = ChatText.getText();ChatText.setText("");str=str+"我: "+str1+"\n";ChatBox.setText(str);//加密前的信息到界面显示send_out_text01.setText(str1);//对信息加密解密的类EncryptionAndDecryption ed = new EncryptionAndDecryption();//加密ed.Encryption(str1);//  将加密后的信息发送到界面显示send_out_text02.setText(ed.data01);try {new UDP_Send(5656, 9100,ed.data01);} catch (IOException ioException) {ioException.printStackTrace();}}}//处理登陆或者注册问题public void landAndRegister() throws IOException {//在本机地址上建立端口,以接收DatagramSocket socket=new DatagramSocket(5051);//接收数据包byte[] buffer=new byte[1024];//构造一个 DatagramPacket用于接收长度的数据包 length 。DatagramPacket packet=new DatagramPacket(buffer,0,buffer.length);//接收来自DatagramPacket的数据包socket.receive(packet);System.out.println("发送的内容:"+new String(packet.getData(),0,packet.getData().length));if(packet.getData()!=null){connect.setText("连接成功!");//获取本机地址InetAddress inetAddress= InetAddress.getByName("localhost");int port=9090;//参数:数据(Byte类型),发送数据的长度,要发给谁DatagramPacket packet1=new DatagramPacket("登陆成功!".getBytes(),0,"登陆成功!".getBytes().length,inetAddress,port);socket.send(packet1);//发送包}//关闭流socket.close();}MyServer( ) throws IOException {init();landAndRegister();}public static void main(String[] args) throws IOException {MyServer myServer = new MyServer();//对信息加密解密的类EncryptionAndDecryption ed = new EncryptionAndDecryption();//接收Runnable runnable = () -> {//定义自身名字 //定义自己的端口号//建立进程要用的端口DatagramSocket socket = null;try {socket = new DatagramSocket(5052);} catch (SocketException e) {e.printStackTrace();}//  设置一个接收数据的字符串String data;while (true) {//设置一次接收多少的字节byte数据byte[] data_byte = new byte[100];//单位是字节//构造一个 DatagramPacket用于接收长度的数据包 length 。DatagramPacket packet = new DatagramPacket(data_byte, 0, data_byte.length);//接收来自DatagramPacket的数据包try {socket.receive(packet);} catch (IOException e) {e.printStackTrace();}//因为接收的信息的字节数组长度很长,除了信息外还有很多无用的默认值为:0//的数据在数组中,需要加以判断,哪些是有用的,如果不进行判断,输出来的信息//会带很长的正方形的小尾巴String s3="";//存储接收到的信息char[] s2 = (new String(packet.getData(), 0, packet.getData().length)).toCharArray();for(char s1:s2){if(s1==0)break;s3=s3+s1;}//在界面上显示收到的信息myServer.receive_text01.setText(s3);//解密ed.Decryption(s3);myServer.receive_text02.setText(ed.data02);//设置显示在文本域中的信息data = "客户端:" + " "+ ed.data02;if (!data.equals("")) {str = str + data + "\n";myServer.ChatBox.setText(str);}}};//接收Thread thread = new Thread(runnable);thread.start();}
}

客户端代码:

package MyNetworkSecurity01;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;public class YouClient {//用来存储聊天信息static String str="";//用来接收输入框中的信息static String str1="";JFrame frame=new JFrame();//设置最内层面板JPanel panel=new JPanel();//设置panel_text聊天面板的组件JTextArea ChatBox=new JTextArea(20,10);//文本域,聊天记录显示//设置显示对话内容的面板JScrollPane panel_text=new JScrollPane(ChatBox);//设置容器Container container=frame.getContentPane();//panel的组件JTextField connect = new JTextField();//标签JLabel receive01=new JLabel("收到的加密信息:");JLabel receive02=new JLabel("解译后:");JLabel send_out01=new JLabel("想发送的文字:");JLabel send_out02=new JLabel("加密后:");//文本框JTextField receive_text01=new JTextField();JTextField receive_text02=new JTextField();JTextField send_out_text01=new JTextField();JTextField send_out_text02=new JTextField();JTextField ChatText=new JTextField();//聊天输入框JButton inButton=new JButton("发送"); //发送信息按钮public void init(){//设置界面居中frame.setBounds(Toolkit.getDefaultToolkit().getScreenSize().width/2-300,Toolkit.getDefaultToolkit().getScreenSize().height/2-350,600,700);//设置程序标题frame.setTitle("客户端");//设置关闭frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置面板的布局panel.setLayout(null);//设置聊天面板的大小,位置panel_text.setBounds(200,0,380,500);//将面板放入容器container.add(panel);panel.add(panel_text);//设置最内层面板的组件connect.setBounds(20,50,150,30);receive01.setBounds(20,130,180,30);receive01.setFont(new Font("行楷",Font.BOLD,20));receive01.setForeground(Color.red);//设置字体颜色receive_text01.setBounds(20,160,150,30);receive_text01.setFont(new Font("行楷",Font.BOLD,20));receive02.setBounds(20,190,150,30);receive02.setFont(new Font("行楷",Font.BOLD,20));receive02.setForeground(Color.red);receive_text02.setBounds(20,220,150,30);receive_text02.setFont(new Font("行楷",Font.BOLD,20));send_out01.setBounds(20,300,150,30);send_out01.setFont(new Font("行楷",Font.BOLD,20));send_out01.setForeground(Color.blue);//设置字体颜色send_out_text01.setBounds(20,330,150,30);send_out_text01.setFont(new Font("行楷",Font.BOLD,20));send_out02.setBounds(20,360,150,30);send_out02.setFont(new Font("行楷",Font.BOLD,20));send_out02.setForeground(Color.blue);//设置字体颜色send_out_text02.setBounds(20,390,150,30);send_out_text02.setFont(new Font("行楷",Font.BOLD,20));//聊天输入框设置ChatText.setBounds(200,500,300,30);//聊天框的发送按钮inButton.setBounds(500,500,100,30);//聊天域的字体,大小设置ChatBox.setFont(new Font("行楷",Font.BOLD,20));panel.add(connect);panel.add(receive01);panel.add(receive_text01);panel.add(receive02);panel.add(receive_text02);panel.add(send_out01);panel.add(send_out_text01);panel.add(send_out02);panel.add(send_out_text02);panel.add(ChatText);panel.add(inButton);frame.setVisible(true);//发送按钮的监听事件inButton.addActionListener(new InButton());}//成员内部类实现接口且发发送数据class InButton implements ActionListener {@Overridepublic void actionPerformed(ActionEvent e) {//获取聊天输入框的内容str1 = ChatText.getText();send_out_text01.setText(str1);//对信息加密解密的类EncryptionAndDecryption ed = new EncryptionAndDecryption();//加密ed.Encryption(str1);//  将加密后的信息发送到界面显示send_out_text02.setText(ed.data01);ChatText.setText("");str=str+"我: "+str1+"\n";ChatBox.setText(str);try {new UDP_Send(9099, 5052,ed.data01);} catch (IOException ioException) {ioException.printStackTrace();}}}YouClient(){init();}
}

UDP发送代码:

package MyNetworkSecurity01;import java.io.IOException;
import java.net.*;//发送
public class UDP_Send {//定义对方的端口号public int MyPort,YouPort;//建立进程要用的端口DatagramSocket socket=new DatagramSocket(MyPort);//获取本机ipInetAddress inetAddress= InetAddress.getByName("localhost");//要传输的数据private String data;public UDP_Send(int MyPort,int YouPort,String data) throws IOException {this.MyPort=MyPort;this.YouPort=YouPort;this.data=data;if(!this.data.equals("")) {//准备好要发的数据,目的地的ip地址,进程端口号DatagramPacket packet = new DatagramPacket(this.data.getBytes(), 0, this.data.getBytes().length, inetAddress, this.YouPort);//发送try {socket.send(packet);} catch (IOException e) {e.printStackTrace();}socket.close();this.data="";//清空要传输的数据数据}}
}

加密与解密代码:

package MyNetworkSecurity01;import java.util.Random;public class EncryptionAndDecryption {//设置接收最终加密后信息的字符串变量String data01="";//设置接收最终解密后信息的字符串变量String data02="";//加密public  void Encryption(String encryption){data01="";Random r=new Random();//随机取0-10一个数作为偏移量int Offset01 =r.nextInt(10);//将需要加密的字符串变为字符数组,并且将偏移量作为字符数组的第一个数char[] char01=(Offset01+encryption).toCharArray();/*加入在字符数组的每个数中加入偏移量,使之改变为其他数,如:a+3(3为偏移量)=d,这样加密了信息*/for (int i = 0; i < char01.length; i++) {data01=data01+(char) ((int)char01[i]+Offset01);}}//解密public  void Decryption(String decryption){data02="";//将得到的信息变成字符数组char[] char02 = decryption.toCharArray();//获取偏移量int Offset02= ((int)char02[0]-48)/2;//利用循环和偏移量解出信息,并保存在字符数组中for(int i=1;i<char02.length;i++){data02=data02+(char) (char02[i]-Offset02);}}}

利用java编写网络聊天程序并加密信息相关推荐

  1. Java实验:编写网络聊天程序(图形界面)

    课程名称 高级Java程序设计 实验项目 Java网络编程 实验目的: 使用客户机/服务器模式.基于TCP协议编写一对多"群聊"程序.其中客户机端单击"连接服务器&quo ...

  2. 利用Java编写手机应用程序PalmOS基础篇

    作者:王森 相信大家一定會發現,最近到處都是嵌入式系統(embedded system)的新聞.而目前也已經有不少國內外廠商推出各式各樣的PDA(Personal Digital Assistant, ...

  3. 用java编写一个聊天程序_基于JAVA实现的一个简单的网络聊天程序

    一.Java Socket的概述 1.Socket套接字方便了开发网络应用程序.TCP面向连接的可靠传输协议.具有数据确认和数据重传机制.保证了发送数据一定能到达通信的对方.UPD协议无连接,不可靠的 ...

  4. 利用JAVA编写剪刀石头布的程序

    本案例要求编写一个剪刀石头布游戏的程序.程序启动后会随机生成1~3的随机数,分别代表剪刀.石头和布,玩家通过键盘输入剪刀.石头和布与电脑进行5轮的游戏,赢的次数多的一方为赢家.若五局皆为平局,则最终结 ...

  5. Java实现网络聊天程序的设计与实现(基于UDP协议)

    目录         TCP/IP协议介绍         Java中socket编程         测试结果 TCP/IP协议介绍         TCP/IP协议包含的范围非常的广,它是一种四层 ...

  6. 基于Linux的网络编程——网络聊天程序

    网络聊天程序是目前应用极为广泛的一种网络软件,对于方便人们的交流沟通非常有效,同时,作为一种典型的网络应用,编写网络聊天程序是学习基于Linux的网络编程的有效方法. 结合任务需求设计该程序,程序采用 ...

  7. 计网实验一 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。具体如下:

    一[实验目的] 掌握基于多线程的复杂网络程序的开发方法和开发流程: 按照要求设计实现软件,以培养应用复杂计算系统开发的能力,并在设计和开发过程中体现出创新意识. 二[实验要求] 以下每个实验均要求: ...

  8. 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序。

    假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与Datagr ...

  9. java jmf 视屏监控的核心代码_Java中利用JMF编写摄像头拍照程序_java

    我把程序分为两种,有趣的和无趣的,最近做了几个有趣的项目,其中一个,应当就算是摄像头拍照程序了.用于现场拍照,生成照片,主要用到java Media Framework(JMF). 首先到SUN下载最 ...

最新文章

  1. nginx利用referer指令实现防盗链配置
  2. 【排序算法】计数排序引发的围观风波——一种O(n)的排序
  3. 【数据结构与算法】之给Nx3网格图涂色的方案数的求解算法
  4. python plotly 弹出子图_python – 在plotly中添加组条形图作为子图
  5. 在.Net framework中动态加载Assembly的loadFromRemoteSources配置
  6. 基础算法 —— 高精度计算 —— 高精度乘法
  7. python 把txt变成字符串_如何通过 Python 如何写文件 ?
  8. HTTP协议从入门到大牛,初识HTTP协议(学习笔记)
  9. Java基础学习总结(46)——JAVA注解快速入门
  10. pthreads v3下一些坑和需要注意的地方
  11. 国美易卡网络大数据,国美易卡MySQL数据库
  12. Vulhub-coldfusion--CVE-2017-3066
  13. 最低成本DIY视频遥控车方案:ESP32-CAM视频遥控车
  14. 文章排版——上机实验,C语言
  15. [并发并行]_[线程池]_[Programming With POSIX Threads的线程池实现分析1]
  16. 为什么很多计算机专业大学生毕业后还会参加培训?
  17. pytorch之词嵌入(三)
  18. linux查看cpu核数命令,centos查看CPU以及核数命令
  19. 3.1 Docker最新入门教程-Docker入门-概述
  20. 【Python】Python Seaborn搞定线型回归图曲线

热门文章

  1. 无需App!中国移动5G消息数字人民币钱包正式上线
  2. 永久删除计算机文件怎么操作步骤,两种可以直接彻底删除文件的操作方法-电脑自学网...
  3. 工作态度决定了你的层次
  4. 2018-2019年度学习计划
  5. 【Linux】无法读取/挂载U盘
  6. 创建一个Student 类 包含属性有 序号 姓名 年龄 生日 提供对应的setter/getter 创建对象,完成赋值(setter赋值和构造方法赋值) 在控制台输出学生对象的信息
  7. CR-Fill: Generative Image Inpainting with Auxiliary Contexutal Reconstruction
  8. ps快速切图,文件命名图片自动导出
  9. 电子元器件手册中assert和deassert的含义
  10. 抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。抖音矩阵系统。