概述:计算机网络原理之TCP笔记一

TCP的特点:

  • 1、面向连接
  • 2、每一条连接只能有两个端点(套接字:IP:端口号)
  • 3、TCP提供可靠的交付服务
  • 4、TCP提供全双工通讯
  • 5、面向字节流

停止等待协议:每发完一个分组就停止发送,等待对方确认,收到确认后再发下一个分组。

  • 1、无差错情况

  • 2、有查错情况(超时重传)

    • 发送方暂时保存已发送分组的副本
    • 分组与确认分组要进行编号对应
    • 超时计时器时间的设定
  • 3、确认分组丢失&确认分组迟到

    • 丢弃重复分组,再发确认

连续ARQ协议和滑动窗口协议:停止等待协议低效

  • 位于窗口中的分组可以连续的发送出去,而不需要等待对方的确认。

  • 发送方每收到一个确认就把窗口向前滑动一个分组的位置。

  • 接收方采用累积确认方式:对按序到达的最后一个分组发送确认。

TCP报文首部格式:

  • 1、首部最小长度20字节
    • 源端口&目的端口
    • 序号:本报文段所发送的数据的第一个字节的序号
    • 确认号:期望收到对方下一个报文段的第一个字节的序号
    • 数据偏移:数据起始处距离报文起始处的距离(首部长度)
    • 保留:目前权全为0
    • URG:URG=1时 紧急指针字段
    • ACK:ACK=1时 确认号字段,TCP连接后所传送的报文必须把ACK置1
    • PSH:推送
    • RST:复位
    • SYN:连接时进行同步
    • FIN:释放连接
    • 窗口:发送本报文的一方的接收窗口(允许对方发送的数据)
    • 检验和:检验首部和数据部分
    • 紧急指针:URG=1时有意义(紧急数据字节数)

一、彻底学习JAVA基础非编程思想莫属。越看越觉得自己基础薄弱,很多用法都没有见过。学而时习之,学而时总结之。

二、内部类语法总结

1、定义:将一个类的定义放在另一个类内部

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
* 访问非静态内部类的方法
* 访问外部类的属性
* @author 杜伟
*/

public class OutterClass {
private String name = "duwei"; //私有变量
public String sex = "man"; //公有变量
private static int age = 15; //静态变量

interface IPrintString{
String print();
}

public String sayOutter() { //1、这是局部内部类
class PrintString implements IPrintString{
@Override
public String print() {
return "Outter";
}
}
return new PrintString().print();
}

public String sayOutter2(){
return new IPrintString() { //2、这是匿名内部类
@Override
public String print() {
return "Outter2";
}
}.print();
}

class InnerClass {
//private static String name = "123"; //不可以有静态变量
public void sayInner() { //访问外部类的私有,共有,静态属性
System.out.println("inner:name="+name+",sex="+sex+",age = "+age);
System.out.println(OutterClass.this.sayOutter()+";匿名内部类:"
+OutterClass.this.sayOutter2());//访问外部类的方法
}
}

public static void main(String[] args) {
OutterClass outter = new OutterClass();
InnerClass inner = outter.new InnerClass();//内部类对象的初始化方式
inner.sayInner();
}
}
  • 1、内部类自动拥有对外围类的所有成员的访问权。
  • 2、上述1处演示了局部内部类
  • 3、上述2处演示了匿名内部类
  • 4、当方法的参数在匿名内部类使用时要用final关键字修饰参数
  • 5、匿名内部类既可以扩展类也可以实现接口,但二者不可兼得,如果实现接口也只能实现一个

2、静态内部类:嵌套类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* 静态内部类
* @author 杜伟
*/

public class StaticInnerClassTest {
private String name = "StaticInnerClassTest";
private static String name2 = "StaticInnerClassTest2";

interface InnerClassInterface{ //接口里面定义类
void print();
class TestInnerClassInterface implements InnerClassInterface{//接口里面的类可以实现该接口
@Override
public void print() {
System.out.println("InnerClassInterface");
}
}
}

static class InnerClass{
private static String name = "innerclass";
public void say(){
System.out.println("inner="+name);
//System.out.println(StaticInnerClassTest.this.name);//内部类先加载了,外部类不可达
}
}

public static void main(String[] args) {
InnerClass inner = new InnerClass();
inner.say();
System.out.println(inner.name);
new StaticInnerClassTest.InnerClassInterface.TestInnerClassInterface().print();
}

}
  • 普通的内部类对象隐式的保存了一个引用,指向创建它的外围类对象,然而static内部类不是这样:
    • 要创建嵌套类的对象,并不需要其外围类的对象
    • 不能从嵌套类的对象中访问非静态的外围类对象

今天花了一上午的时间实践了一下通过JNI调用C/C++程序,遇到BUG也不少,总结如下:

使用到的工具:

  • eclipse
  • visual studio 2013
  • jdk1.7

第一步:新建eclipse项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.duwei.jni;

public class HelloWorld {
/**
* 静态代码块加载C/C++库
*/

static {
System.loadLibrary("ConsoleApplication3");
}
/**
* main函数测试
* @param args
*/

public static void main(String[] args) {
HelloWorld word = new HelloWorld();
word.sayHello();

}
/**
* 所有的native方法都用C/C++实现
*/

public native void sayHello();
}

第二步:生成头文件

  • 在java项目的bin目录下执行如下命令:

    1
    D:\Usersworkspace\Java\bin>javah -classpath . -jni com.duwei.jni.HelloWorld
  • 在bin目录下将生成如下格式的头文件:

    1
    com_duwei_jni_HelloWorld.h

第三步:实现上述头文件的函数体:

  • 打开visual studio 2013

  • 新建Win32 Console Application->next->dll(动态链接库)->finish

  • 打开项目所在文件夹将第二步生成的头文件拖入(实践证明直接再接在vs中拖入会报找不到文件的bug)

  • 右键项目->properties->C/C++->General->Additional Include Directories添加如下:

    1
    2
    3
    4
    1、JDK目录下include文件夹
    C:\Program Files\Java\jdk1.7.0_60\include
    2、JDK目录下include文件夹下的win32
    C:\Program Files\Java\jdk1.7.0_60\include\win32
  • 如下图实现头文件中函数声明的函数体:

注意:如果为64位JDK请将图片上方的标示改为x64

第四步:使用dll

  • 将上述生成的dll放于java项目的根目录,运行->run

概述:Android的View系统的体系结构总结:(ViewRoot–>ViewRootImpl)

  • View与ViewRootImpl的关系
  • Activity与Window的关系
  • Window与WindowManagerImpl的关系
  • ViewRootImpl和WindowManagerImpl的关系
  • ViewRootImpl与WindowManagerService关系

View与ViewRoot的关系

  • ViewRootImpl中的成员变量指向View树的根

Activity与Window的关系

  • Activity内部有一个Window的成员变量指向其子类PhoneWindow

Window与WindowManagerImpl的关系

  • WindowManager是Window的成员变量,其实现类为WindowManagerImpl

ViewRoot和WindowManagerImpl的关系

  • WindowManagerImpl内部通过WindowManagerGlobal对象对如下三个对象进行管理:
    1
    2
    3
    4

    private final ArrayList<View> mViews = new ArrayList<View>();
    private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
    private final ArrayList<WindowManager.LayoutParams> mParams =new ArrayList<WindowManager.LayoutParams>();

ViewRootImpl与WindowManagerService关系

  • ViewRootImpl负责与WMS进行通信(IWindowSession),反向通过IWindow来完成。

初次尝试使用MVP进行APP开发,对MVP的几点个人理解记录:

  • 1、建议以功能模块进行包结构的管理。

  • 2、每个功能模块下都要定义View层及其接口+Presenter接口及其实现+Model层及接口(如果有数据操作)。

  • 3、对View的操作及其行为要在View层接口定义,对业务逻辑处理要定义在Presenter接口。

  • 4、Presenter层必须要持有View层接口的引用,可通过构造函数传入。

  • 5、在Presenter层定义onDestroy方法记得释放View层引用。

可进一步考虑的优化:

  • 1、因为Presenter必须持有View层引用,Presenter必须最后释放引用,所以建议定义所有Presenter接口的父接口,抽离出onAttach和onDetach方法。