[关闭]
@MRsunhuimin 2019-08-01T13:02:08.000000Z 字数 3223 阅读 186

java (08.01)

java基础

作者:孙慧敏

1. 网络

    分为局域网(LAN)、城域网(MAN)和广域网(WAN)

1.2 网络分层

        TCP/IP 5层模型

            应用层

            传输层

            网络层

            数据链路层

            物理层

1.3 IP地址

概念:
    唯一标识网络上的每一台计算机

组成:
    32位,由4个8位二进制数组成

    IP地址 = 网络地址 +主机地址
        网络地址:标识计算机或网络设备所在的网段
        主机地址:标识特定主机或网络设备

    0.0.0.0:本机
    127.0.0.1:本机回环地址,用于本机测试
    255.255.255.255:当前子网,一般用于向当前子网广播信息

配置和检测:
        查看本机的IP地址
                ipconfig

        测试网络是否通畅
                ping  目标IP地址

2. Socket(套接字)

2.1 java.net.Socket

    1. 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket。 

    2. 任何一个Socket都是由IP地址和端口号唯一确定的。 

    3. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 

    4. Socket也称为套接字,可以用来实现不同虚拟机或不同计算机之间的通信。

    5. 在Java语言中,Socket可以分为两种类型: 

    (1)面向连接的Socket通信协议(TCP,传输控制协议)

    (2)面向无连接的Socket通信协议(UDP,用户数据报协议)

2.2 基于TCP的通信过程

    首先,Server端Listen指定的某个端口是否有连接请求(建议端口号大于1024); 

    其次,Client端向Server端发出Connect请求; 

    最后,Server端向Client端发回Accept消息。

    一个连接就建立起来了,会话随即产生。 
    Server端和Client端都可以通过Send、Writer等方法与对方通信。

2.3 Socket通讯的过程

    Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

    对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  (1) 创建Socket;

  (2) 打开连接到Socket的输入/出流;

  (3) 按照一定的协议对Socket进行读/写操作;

  (4) 关闭Socket.(在实际应用中,通常并未使用到显示的close)

2.4 java.net.ServerSocket重要属性

    1. port(服务器的端口号) 

    2. backlog(最大客户端等待队列数,可选填) 
        用于ServerSocket,配置ServerSocket的最大客户端等待队列。等待队列的意思。 

    下面这个服务器最多可以同时连接3个客户端,其中2个等待队列: 

    int backlog = 2; 
    ServerSocket serverSocket = new ServerSocket(port, backlog); 

    这个参数设置为-1表示无限制,默认是50个最大等待队列,如果设置无限制,那么你要小心了,如果你服务器无法处理那么多连接,那么当很多客户端连到你的服务器时,每一个TCP连接都会占用服务器的内存,最后会让服务器崩溃的。

2.5 创建Socket

    java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端。这是两个封装得非常好的类,使用很方便。其构造方法如下:
  1.  Socket(InetAddress address, int port);
  2.   Socket(InetAddress address, int port, boolean stream);
  3.   Socket(String host, int prot);
  4.   Socket(String host, int prot, boolean stream);
  5.   Socket(SocketImpl impl)
  6.   Socket(String host, int port, InetAddress localAddr, int localPort)
  7.   Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
  8.   ServerSocket(int port);
  9.   ServerSocket(int port, int backlog);
  10.   ServerSocket(int port, int backlog, InetAddress bindAddr)
    其中address、host和port分别是双向连接中另一方的IP地址、主机名和端 口号,stream指明socket是流socket还是数据报socket,localPort表示本地主机的端口号,localAddr和 bindAddr是本地机器的地址(ServerSocket的主机地址),impl是socket的父类,既可以用来创建serverSocket又可 以用来创建Socket。count则表示服务端所能支持的最大连接数。例如:
  1. Socket client = new Socket(“127.0.01.”, 80);
  2. ServerSocket server = new ServerSocket(80);
    【注意】在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才 能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。

    在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出异常。

2.6 BufferedWriter与PrintWriter.println(String s)的区别

    PrintWriter和BufferedWriter都是继承java.io.Writer,所以很多功能都一样。 

    不过PrintWriter提供println()方法可以写不同平台的换行符,即自动换行,而BufferedWriter可以任意设定缓冲大小,但不能自动换行,需手动。 
  1. //OutputStream可以直接传给PrintWriter(BufferedWriter不能接收),如:
  2. PrintWriter pw
  3. = new PrintWriter(new BufferedOutputStream(new FileOutputStream("foo.out")));
  4. //或者用OutputStreamWriter来将OutputStream转化为Wrtier.这时就可以用BufferedWriter了。

2.7 java.net.BindException:Address already in use异常

    端口被占用的结果,需要修改一下端口。

3. Socket编程

3.1 基于TCP协议的Socket编程

    Socket网络编程一般可以分成如下步骤进行:

        1. 建立连接
        2. 打开Socket关联的输入输出流
        3. 数据流中读写信息
        4. 关闭所有的数据流和Socket

3.2 基于UDP协议的Socket编程

    基于UDP协议的Socket网络编程步骤:

        1. 利用 DatagramPacket 对象封装数据包
        2. 利用 DatagramSocket 发送数据包
        3. 利用 DatagramSocket 接收数据包
        4. 利用 DatagramPacket 处理数据包

3.3 TCP协议和UDP协议的对比

对比内容 TCP UDP
是否连接 面向连接 面向非连接
传输可靠性 可靠 不可靠
速度
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注