[关闭]
@nextleaf 2018-08-24T03:56:20.000000Z 字数 5385 阅读 1144

2018-08-23 工作日志

Java 工作日志 网络 IP TCP


上午

线程同步

下午

线程生命周期
线程间通信
线程死锁

网络编程


Java网络编程

OSI七层与TCP/IP网络架构

此处输入图片的描述

五层协议只是OSI和TCP/IP的综合,是业界产生出来的非官方协议模型,实际应用还是TCP/IP的四层结构

OSI七层网络模型

TCP/IP四层概念模型  

对应网络协议

应用层(Application)

应用层

HTTP、TFTP, FTP, NFS, WAIS、SMTP

表示层(Presentation)

应用层

Telnet, Rlogin, SNMP, Gopher

会话层(Session)

应用层

SMTP, DNS

传输层(Transport)

传输层

TCP, UDP

网络层(Network)

网络层

IP, ICMP, ARP, RARP, AKP, UUCP

数据链路层(Data Link)

数据链路层(网络接口层)

FDDI, Ethernet, Arpanet, PDN, SLIP, PPP

物理层(Physical)

数据链路层(网络接口层)

IEEE 802.1A, IEEE 802.2到IEEE 802.11

此处输入图片的描述

OSI七层和TCP/IP四层的关系

  1. OSI引入了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。
  2. OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用再提出了模型,且是参照的OSI模型。
  3. OSI是一种理论下的模型,而TCP/IP已被广泛使用,成为网络互联事实上的标准。

TCP:transmission control protocol 传输控制协议
UDP:user data protocol 用户数据报协议

OSI的基本概念

OSI是Open System Interconnect的缩写,意为开放式系统互联。
OSI七层参考模型的各个层次的划分遵循下列原则:

1)根据不同层次的抽象分层
2)每层应当有一个定义明确的功能
3)每层功能的选择应该有助于制定网络协议的国际标准。
4)各层边界的选择应尽量节省跨过接口的通信量。
5)层数应足够多,以避免不同的功能混杂在同一层中,但也不能太多,否则体系结构会过于庞大
6)同一层中的各网络节点都有相同的层次结构,具有同样的功能。
7)同一节点内相邻层之间通过接口(可以是逻辑接口)进行通信。
8)七层结构中的每一层使用下一层提供的服务,并且向其上层提供服务。
9)不同节点的同等层按照协议实现对等层之间的通信。

层次特征:
物理层的主要功能是:利用传输介质为数据链路层提供物理连接,实现比特流的透明传输。

数据链路层的主要功能是:通过各种控制协议【介质访问控制(MAC)和逻辑链路控制(LLC)】,将有差错的物理信道变为无差错的、能可靠传输数据帧的数据链路。

网络层主要任务是:通过路由选择算法,为报文或分组通过通信子网选择最适当的路径。
寻址、交换、路由算法、连接服务

传输层的主要任务是:向用户提供可靠的端到端的差错和流量控制,保证报文的正确传输。
传输连接管理、处理传输差错、监控服务质量

会话层,会话管理、会话流量控制、寻址、出错控制。

表示层的主要功能是“处理用户信息的表示问题,如编码、数据格式转换和加密解密”等。
数据格式处理、数据的编码、压缩和解压缩、数据的加密和解密

应用层功能是直接向用户提供服务,完成用户希望在网络上完成的各种工作。
提供用户接口、实现各种服务

1)第七至第四层(应用层->表示层->会话层->传输层)处理数据源和数据目的地之间的端到端通信,
2)第三至第一层(网络层->数据链路层->物理层)处理网络设备间的通信。

TCP/IP层次模型共分为四层:应用层->传输层->网络层->数据链路层(网络接口层)

此处输入图片的描述

OSI网络与TCP/IP网络的主要区别如下:

1)TCP/IP协议中的应用层处理OSI模型中的第五层、第六层和第七层的功能。
2)TCP/IP协议中的传输层并不能总是保证在传输层可靠地传输数据包,而OSI模型可以做到。
3) TCP/IP协议还提供一项名为UDP(用户数据报协议)的选择。UDP不能保证可靠的数据包传输。

开放系统互连参考模型
开放系统互连参考模型

套接字

端口号和IP地址组合得出一个网络套接字。
不同的进程有不同的端口号。
TCP 三次握手和四次挥手

2018-08-24 星期五上午————InetAddress和Socket

InetAddress

  1. package com.nl.sx823.networkprogram;
  2. /**
  3. * Created with IntelliJ IDEA 2018.
  4. * Description:这个类表示互联网协议(IP)地址
  5. * 方法:
  6. * 1 static InetAddress getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。
  7. * 2 static InetAddress getByAddress(String host, byte[] addr) 根据提供的主机名和 IP 地址创建 InetAddress。
  8. * 3 static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
  9. * 4 String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
  10. * 5 String getHostName() 获取此 IP 地址的主机名。
  11. * 6 static InetAddress getLocalHost() 返回本地主机。
  12. * 7 String toString() 将此 IP 地址转换为 String。
  13. *
  14. * @author: 黄昭鸿
  15. * @date: 2018-08-23
  16. * Time: 17:53
  17. */
  18. import java.net.InetAddress;
  19. public class InetAddressDemo {
  20. public static void main(String[] args) throws Exception {
  21. //获取本机的IP
  22. InetAddress inet=InetAddress.getLocalHost();
  23. System.out.println(inet);
  24. //获取主机名称
  25. System.out.println(inet.getHostName());
  26. //获取当前主机IP
  27. System.out.println(inet.getHostAddress());
  28. InetAddress inet1=InetAddress.getByName("fanyi.baidu.com");
  29. System.out.println(inet1.getHostName());
  30. System.out.println(inet1.getHostAddress());
  31. }
  32. }

Socket

服务器端

  1. package com.nl.sx823.networkprogram.socket;
  2. import cn.hutool.core.util.NetUtil;
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.net.SocketTimeoutException;
  9. /**
  10. * Created with IntelliJ IDEA 2018.
  11. * Description:Socket服务器
  12. * java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个 Socket 对象通过实例化 ,而 服务器获得一个 Socket 对象则通过 accept() 方法的返回值。
  13. *
  14. * @author: 黄昭鸿
  15. * @date: 2018-08-24
  16. * Time: 10:30
  17. */
  18. public class GreetingServer extends Thread {
  19. private ServerSocket serverSocket;
  20. @Override
  21. public void run() {
  22. while (true) {
  23. try {
  24. System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
  25. System.out.println();
  26. Socket server = serverSocket.accept();
  27. System.out.println("远程客户端地址:" + server.getRemoteSocketAddress());
  28. DataInputStream in = new DataInputStream(server.getInputStream());
  29. System.out.println("收到客户端信息:" + in.readUTF());
  30. DataOutputStream out = new DataOutputStream(server.getOutputStream());
  31. out.writeUTF("蟹蟹连接我:" + server.getLocalSocketAddress() + ",ヾ( ̄▽ ̄)Bye~Bye~!");
  32. System.out.println();
  33. in.close();
  34. out.close();
  35. server.close();
  36. } catch (SocketTimeoutException s) {
  37. System.out.println("Socket timed out!");
  38. break;
  39. } catch (IOException e) {
  40. e.printStackTrace();
  41. break;
  42. }
  43. }
  44. }
  45. private GreetingServer(int port) throws IOException {
  46. serverSocket = new ServerSocket(port);
  47. //通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位。
  48. serverSocket.setSoTimeout(3600000);
  49. }
  50. public static void main(String[] args) {
  51. //int port = Integer.parseInt(args[0]);
  52. try {
  53. //检测本地端口可用性
  54. if (NetUtil.isUsableLocalPort(9090)) {
  55. //Thread t = new GreetingServer(port);
  56. Thread t = new GreetingServer(9090);
  57. t.run();
  58. }else {
  59. System.out.println("端口已被占用");
  60. }
  61. } catch (IOException e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. }

客户端

  1. package com.nl.sx823.networkprogram.socket;
  2. import java.io.*;
  3. import java.net.Socket;
  4. /**
  5. * Created with IntelliJ IDEA 2018.
  6. * Description:Socket客户端
  7. * java.net.Socket 类代表客户端和服务器都用来互相沟通的套接字。客户端要获取一个 Socket 对象通过实例化 ,而 服务器获得一个 Socket 对象则通过 accept() 方法的返回值。
  8. * 不同的进程有不同的端口号
  9. * @author: 黄昭鸿
  10. * @date: 2018-08-24
  11. * Time: 10:28
  12. */
  13. public class GreetingClient {
  14. public static void main(String[] args) {
  15. //String serverName = args[0];
  16. String serverName = "localhost";
  17. //int port = Integer.parseInt(args[1]);
  18. int port = Integer.parseInt("9090");
  19. try {
  20. System.out.println("连接到远程主机:" + serverName + " ,端口号:" + port);
  21. Socket client = new Socket(serverName, port);
  22. System.out.println("远程主机地址:" + client.getRemoteSocketAddress());
  23. OutputStream outToServer = client.getOutputStream();
  24. DataOutputStream out = new DataOutputStream(outToServer);
  25. out.writeUTF("我是客户端的消息(客户端地址: " + client.getLocalSocketAddress()+")");
  26. InputStream inFromServer = client.getInputStream();
  27. DataInputStream in = new DataInputStream(inFromServer);
  28. System.out.println();
  29. System.out.println("服务器响应: " + in.readUTF());
  30. outToServer.close();
  31. out.close();
  32. inFromServer.close();
  33. in.close();
  34. client.close();
  35. } catch (IOException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注