目录

前言

一、Java

1. 网络通信——socket

二、数据结构

1. 归并排序

2. 基数排序

参考来源:


前言

活动很多,事情很多,每天感觉都在高压之中生活,但是总是觉得自己无端在浪费时间而不想动弹,感觉有逃避的心态,想办法克制。


一、Java

大作业搞定了,最后还学了一点挺有意思的东西,还挺好玩。虽然周一修socket修了大半天,觉得自己很笨,信心大受打击......

1. 网络通信——socket

个人认为socket需要关注和记忆的点:

  1. OSI(开放式系统互联)定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)。
  2. TCP/IP五层模型(物理层、数据链路层、网络层、传输层、应用层)
  3. TCP:得到的是一个顺序的无差错数据流,发送方与接收方的成对的两个socket必须建立连接。

    TCP的三次握手:

    建立起一个TCP连接需要经过“三次握手”:第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。断开连接时服务器和客户端均可以主动发起断开TCP连接的请求。

  4. UDP:UDP是(User Datagram Protocol)的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

  5. 工作的基本流程:
    1、 创建Socket
    2、 打开连接到Socket的输入/出流
    3、 按照一定的协议对Socket进行读/写操作
    4、 关闭Socket

我在项目的实践中,利用Socket去实现双方互相通信的私聊聊天室,主要遇到的大问题在于,必须要按照你来我往的顺序进行发送,然后客户端经常crash。

后来发现,如果要实现双方的实时发送监听,两端都必须分别多开一条线程来接收对方的消息,这一点可能是课堂上疏忽了的地方,导致花费了很长的时间在上面纠结。

在项目中的代码案例:

客户端:

//客户端,还包含了一个Swing界面,通过敲击回车的监听事件来发送package com.ascent.ui;import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;public class CustomerServiceFrame extends JFrame {static JTextArea jta=null;public JTextField jtf=null;public JPanel jp=null;public JScrollPane jsp=null;static String text_message;static Socket socket=null;public BufferedReader reader;public PrintWriter writer;public CustomerServiceFrame(){ jta=new JTextArea();jta.setEditable(false);jtf=new JTextField(20);jp=new JPanel();jsp=new JScrollPane();jsp.setViewportView(jta);jp.add(jtf);this.add(jsp,"Center");this.add(jp,"South");this.setTitle("客户端");this.setSize(300, 400);this.setLocation(636,186);this.setResizable(false);this.setVisible(true);jtf.addFocusListener(new JTextFieldListener(jtf,"请在此输入内容"));jtf.addActionListener(new SendMessageListener());}/***文本输入框聚焦监听内部类*/class SendMessageListener implements ActionListener{public void actionPerformed(ActionEvent e) {if(jtf.getText().isEmpty()) {JOptionPane.showMessageDialog(CustomerServiceFrame.this, "请输入内容!");}else {writer.println(jtf.getText());jta.append(jtf.getText()+"\n");jta.setSelectionEnd(jta.getText().length());jtf.setText("");}}}class JTextFieldListener implements FocusListener{private String hintText;          //提示文字private JTextField textField;public JTextFieldListener(JTextField textField,String hintText) {this.textField=textField;this.hintText=hintText;textField.setText(hintText);   //默认直接显示textField.setForeground(Color.GRAY);}@Overridepublic void focusGained(FocusEvent e) {//获取焦点时,清空提示内容String temp=textField.getText();if(temp.equals(hintText)){textField.setText("");textField.setForeground(Color.BLACK);}}@Overridepublic void focusLost(FocusEvent e) {//失去焦点时,没有输入内容,显示提示内容String temp=textField.getText();if(temp.equals("")) {textField.setForeground(Color.GRAY);textField.setText(hintText);}}}public void connect() {try {jta.append("尝试连接...\n");socket=new Socket("127.0.0.1",8001);writer=new PrintWriter(socket.getOutputStream(),true);reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));jta.append("连接成功!\n");jta.append("客服 "+socket.getInetAddress() + ":" + socket.getPort()+"很高兴为您服务!\n");jta.append("========可以开始沟通了=======\n");Thread t1=new Thread(new getServerMessage());t1.start();}catch(Exception e) {e.printStackTrace();}} class getServerMessage implements Runnable {public void run(){try {while(true) {jta.append("服务器:"+reader.readLine()+"\n");}}catch(Exception e) {e.printStackTrace();}try {if(reader!=null) {reader.close();}if(socket!=null) {socket.close();}}catch(Exception e) {e.printStackTrace();}}
}class WindowCloser extends WindowAdapter {public void windowClosing(WindowEvent e) {setVisible(false);dispose();System.exit(1);try{socket.close();}catch(IOException exc){exc.printStackTrace();}}}
}

服务端:

//服务端,独立main函数启动,同样也是Swing界面package com.ascent.util;import javax.swing.*;import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Calendar;public class ServiceServer extends JFrame{static JTextArea jta=null;public JTextField jtf=null;JScrollPane jsp=null;static public BufferedReader reader=null;public PrintWriter writer;JPanel jp=null;static Socket socket=null;static String text_message;ServerSocket server=null;public static void main(String[] args) throws IOException {ServiceServer server=new  ServiceServer();server.getClient();}public void getClient(){try{jta.append("等待连接...\n");server=new ServerSocket(8001);while(true) {socket=server.accept();writer=new PrintWriter(socket.getOutputStream(),true);reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));jta.append("连接成功!\n");jta.append(socket.getInetAddress() + ":" + socket.getPort() + "连接到服务器\n");jta.append("========可以开始沟通了=========\n");Thread t1=new Thread(new getClientMessage());t1.start();}}catch(Exception e){System.out.println("不能监听:"+e);}  }public ServiceServer(){jta=new JTextArea();jta.setEditable(false);jtf=new JTextField(20);jp=new JPanel();jsp=new JScrollPane();jsp.setViewportView(jta);jp.add(jtf);this.add(jsp,"Center");this.add(jp,"South");this.setTitle("服务端");this.setSize(300, 400);this.setLocation(318,186);this.setResizable(false);this.setVisible(true);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jtf.addFocusListener(new JTextFieldListener(jtf,"请在此输入内容"));jtf.addActionListener(new SendMessageListener());}static class getClientMessage implements Runnable {public void run(){try {while(true) {//获得客户端信息jta.append("客户端:"+reader.readLine()+"\n");}}catch(Exception e) {e.printStackTrace();}try {if(reader!=null) {reader.close();}if(socket!=null) {socket.close();}}catch(Exception e) {e.printStackTrace();}}}class SendMessageListener implements ActionListener{public void actionPerformed(ActionEvent e) {if(jtf.getText().isEmpty()) {JOptionPane.showMessageDialog(ServiceServer.this, "请输入内容!");}else {try{writer.println(jtf.getText());jta.append(jtf.getText()+"\n");jta.setSelectionEnd(jta.getText().length());jtf.setText("");}catch(Exception exc){exc.printStackTrace();JOptionPane.showMessageDialog(ServiceServer.this, "未连接到客户端!","错误",JOptionPane.ERROR_MESSAGE);}}}}class JTextFieldListener implements FocusListener{private String hintText;          //提示文字private JTextField textField;public JTextFieldListener(JTextField textField,String hintText) {this.textField=textField;this.hintText=hintText;textField.setText(hintText);   //默认直接显示textField.setForeground(Color.GRAY);}@Overridepublic void focusGained(FocusEvent e) {//获取焦点时,清空提示内容String temp=textField.getText();if(temp.equals(hintText)){textField.setText("");textField.setForeground(Color.BLACK);}}@Overridepublic void focusLost(FocusEvent e) {//失去焦点时,没有输入内容,显示提示内容String temp=textField.getText();if(temp.equals("")) {textField.setForeground(Color.GRAY);textField.setText(hintText);}}}
}

二、数据结构

1. 归并排序

实际上来说,归并排序就是不断散化不断散化,然后两两合并排序、合并排序,我觉得这样说,以后自己一看应该会明白大概是怎么回事。

归并排序需要先递归左半段,再递归右半段,然后给两段进行排序。

主要的MergeSort部分:

void MergeSort(int* num,int low,int mid,int high){int l=low,h=mid+1;int *temp=new int[high-low+1];int i=0;while(l<=mid&&h<=high){if(num[l]<num[h]) temp[i++]=num[l++];else temp[i++]=num[h++];}while(l<=mid)temp[i++]=num[l++];while(h<=high)temp[i++]=num[h++];for(int i=low;i<=high;i++)num[i]=temp[i-low];
}

详细内容可以参考:https://www.cnblogs.com/rio2607/p/4489893.html

2. 基数排序

这个一开始刚看的时候:

“哇又要挂来挂去,9m。”

不过接触了之后发现其实实现的原理还比较简单,本质上就是查字典,按每一位的排序一次一次的排序。其中,通过每个位数的排序结果利用一个辅助数组来进行记录,最后排序。

主要的算法排序部分:

bool rxsort(int A[],int l,int h,int d,int k){if(NULL==A||l>h)return false;int size = h-l+1;int* counts = new int[k];//用于计数排序的辅助数据,详见计数排序int* temp = new int[size];//用于存储重新排序的数组int index;int pval=1;//依次处理不同的位for(int i=0;i<d;i++){//counts数组清零for(int j=0;j<k;j++)counts[j] = 0;for(int j=l;j<=h;j++){/*1.data[j]/pval:去掉数字data[j]的后i个数,例如:当data[j]=1234,i=2时,此时pval=100,data[j]/pval=12;2.(data[j]/pval)%k:取数字data[j]/pval的最后一位数3.(int)(data[j]/pval)%k:取数字data[j]的第i位数*/index = (int)(A[j]/pval)%k;/*统计数组A中每个数字的第i位数中各个数字的频数,用于计数排序;*/counts[index]++;}//计算累加频数,用户计数排序for(int j=1;j<k;j++)counts[j] = counts[j] + counts[j-1];//使用倒数第i+1位数对A进行排序for(int j=h;j>=l;j--){index = (int)(A[j]/pval)%k;temp[counts[index]-1] = A[j];counts[index]--;}//将按第i为数排序后的结果保存回数组A中for(int j=0;j<size;j++)A[j+l] = temp[j];//更新pvalpval = pval*k;}delete[] counts;delete[] temp;
}

详细内容可以参考:https://blog.csdn.net/bqw18744018044/article/details/81810190


参考来源:

https://blog.csdn.net/u014209205/article/details/80461122

Longstick的学习周记——第二周相关推荐

  1. Longstick的学习周记——ES6新特性

    Longstick的学习周记--ES6新特性 前言 ES6新特性 1. let 和 const let关键字 const 关键字 2. 模块字符串\` \` 3. 解构 4. 函数的参数默认值 5. ...

  2. Longstick的学习周记——http协议小解

    Longstick的学习周记--第十九周 前言 HTTP跟HTTPS HTTP协议简介 HTTP协议特点 HTTP工作原理 HTTP状态码 HTTP请求方法 URL(统一资源定位器) HTTPS 前言 ...

  3. 认真学习前端第二周学习笔记(浮动,定位,精灵图,布局)

    文章目录 前言 一.关于浮动 二.关于定位 三.关于精灵图 四.关于布局 总结 前言 提示:这是我在专业培训机构学习的第二周,感觉学习进度好像有一点点慢,不过也还好,能让我们更好的消化消化,今天也是先 ...

  4. 学习linux第二周作业

    第二周作业: 本周作业内容: 1.Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示. touch,rm,mv,cp,file,ls,chmod,chown,ln,rename, ...

  5. 信息安全系统设计基础学习总结第二周

    实验一: 作业 zy e http://www.cnblogs.com/zhengwei0712/p/4823168.html 实验二和实验三: http://www.cnblogs.com/zhen ...

  6. WPF学习笔记-第二周【基本笔刷】

    书接上回,这一次,讲的是WPF中的基本笔刷,由于是菜鸟,就不多说了,继续帖示例代码:) 第一部份 代码 第二章 基本笔刷 第一个 示例 VaryTheBackgroud P38  1     #reg ...

  7. 【学习周报】深度学习笔记第二周

    学习目标: 吴恩达深度学习课程week2 学习内容: 梯度下降法(Gradient Descent) 计算图(Computation Graph) 逻辑回归中的梯度下降(Logistic Regres ...

  8. 吴恩达2022机器学习——第二部分高级学习算法第二周笔记

    目录 1.Tensorflow实现 2.模型训练细节 3.Sigmoid激活函数的替代方案 4.如何选择激活函数 5.为什么模型需要激活函数 6.多分类问题 7.softmax回归算法 8.神经网络的 ...

  9. 学习java第二周——面向对象、堆栈方法区、代码块、抽象类、接口和异常

    面向对象 2020年9月7日星期一 概述:面向对象(Object Oriented)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,是一种对现实世界理解和抽象的方法,是计算机编程技术发 ...

  10. 豚鼠努力学习前端第二周

    文章目录 一.第一部分 1.嵌套列表 2.表格标签 3.表格属性 4.表格input标签 5.表单相关标签 6.表格表单组合实例 一.第二部分 1.div与span 2.CSS语法格式 3.内联样式与 ...

最新文章

  1. jmeter启动警告项解决方案
  2. flutter-webview的坑用到第三方插件的
  3. 机器人视觉——使用numpy进行像素的处理 || 获取图像的属性 || 感兴趣区域ROI || 通道的拆分与合并
  4. 小波的秘密6_小波包的理解
  5. Alpha 答辩总结
  6. 一次搞定各种数据库SQL执行计划
  7. python response重头开始_你必须学写 Python 装饰器的五个理由
  8. 30. 包含min函数的栈
  9. 当 Windows 11 宕机时:从蓝屏死机变成“黑屏死机”!
  10. 分治法解决组合问题(递归)
  11. 已触发了一个断点 vs_实现ABAP条件断点的三种方式
  12. 【Websocket编程】基于libwebsockets实现客户端数据通信
  13. 实施成功的ITIL变更管理的6个步骤
  14. struct termios结构体详解
  15. java使用ffmpeg完成视频加水印功能
  16. 人工智能之模式识别(一)
  17. Python数据可视化 Pyecharts 制作 Timeline 时间轴组件
  18. 浙大远程教育计算机小抄,一张A4纸能写多少个字?看完浙大考生的“小抄”,网友:稳过!...
  19. Java编程答题游戏
  20. linux操作系统 以下哪个命令,Linux认证考试基础试题及答案

热门文章

  1. el-table点击单元格自动聚焦可编辑,且失去焦点即修改成功的实现方法
  2. SAP常用后台表总结
  3. 9020cdn更换墨粉_感动常在!佳能ts9020打印机更换墨盒经验
  4. SegmentFault 社区访谈 | 有位公子在奇舞
  5. 如何锁定excel的一列不允许修改编辑
  6. 相关系数excel_如何求组内相关系数ICC?(应用篇)
  7. 影视剪辑,12天自学视频剪辑入门规划
  8. 怎么把EXCEL内的十六进制数进行两位两位倒序排列
  9. 拦截图片代码 精易web浏览器_精易Web浏览器 UChk验证源码
  10. Web 全栈大会:万维网之父的数据主权革命