学游者

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

JAVA基础:网络

一.概述:

1.1 简介:

在操作系统中,网络和文件其实都是通过I/O总线连接到系统。都会有一个定位类,例如:file和Url,然后再通过input,output等I/O类才进行数据交互。本文介绍下java的网络,及其相关类。

1.2 网络协议

不同设备之间、不同进程之间的通信都是需要通信协议来格式化数据、分装,然后组装数据、反格式化数据。

a) 7层协议:

总体划分:

ISO提出的OSI(Open System Interconnection)模型将网络分为七层,即 物理层( Physical )、 数据链路层(Data Link)、网络层(Network)、 传输层(Transport)、 会话层(Session)、 表示层(Presentation)和 应用层(Application)。

层数 总结
1. 物理层 物理层(Physical layer)是参考模型的最低层。该层是网络通信的数据传输介质,由连接不同结点的电缆与设备共同构成。主要功能是:利用传输介质为数据链路层提供物理连接,负责处理数据传输并监控数据出错率,以便数据流的透明传输。
2. 数据链路层 数据链路层(Data link layer)是参考模型的第2层。 主要功能是:在物理层提供的服务基础上,在通信的实体间建立数据链路连接,传输以“帧”为单位的数据包,并采用差错控制与 流量控制方法,使有差错的物理线路变成无差错的数据链路。
3. 网络层 网络层(Network layer)是参考模型的第3层。主要功能是:为数据在结点之间传输创建逻辑链路,通过路由选择算法为分组通过通信子网选择最适当的路径,以及实现拥塞控制、 网络互联等功能。
4. 传输层 传输层(Transport layer)是参考模型的第4层。主要功能是向用户提供可靠的端到端(End-to-End)服务,处理数据包错误、数据包次序,以及其他一些关键传输问题。传输层向高层屏蔽了下层数据通信的细节,因此,它是计算机通信体系结构中关键的一层。
5. 会话层 会话层(Session layer)是参考模型的第5层。主要功能是:负责维扩两个结点之间的传输链接,以便确保点到点传输不中断,以及管理数据交换等功能。
6. 表示层 表示层(Presentation layer)是参考模型的第6层。主要功能是:用于处理在两个通信系统中交换信息的表示方式,主要包括数据格式变换、 数据加密与解密、数据压缩与恢复等功能。
7. 应用层 应用层(Application layer)是参考模型的最高层。主要功能是:为 应用软件提供了很多服务,例如文件服务器、数据库服务、 电子邮件与其他网络软件服务。

b) 5层协议

名称 功能 协议
应用层 文件传输、电子邮件、文件服务、虚拟终端 TFTP(文件传输)、HTTP(万维网)、SNMP、FTP、SMTP、DNS、Telnet(远程终端接入)
传输层 提供端对端的接口 TCP、UDP
网络层 为数据包选择路由 IP、ICMP、OSPF、EIGRP、Lgmp
数据链路层 传送有地址的帧以及错误检测功能 SLIP、CSLIP、PPP、MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110、IEEE802、IEEE802.2

c)  TCP数据封装

  • tcp封装数据包的格式为:
    • 数据帧:帧头+IP数据包+帧尾 (帧头包括源和目标主机MAC地址及类型,帧尾是校验字)
    • IP数据包:IP头部+TCP数据信息(IP头包括源和目标主机IP地址、类型、生存期等)
    • TCP数据信息:TCP头部+实际数据 (TCP头包括源和目标主机端口号、顺序号、确认号、校验字等)

d)  tcp连接《3次握手为主》

  • tcp的3次握手
  • tcp的4次握手

1.3  java依赖类:

  • java.net.InetAddress:ip处理类,将域名或者IP解析为 ip/域名的形式。
  • java.net.URL:网络连接类。封装了InetAddress和系统网络连接。处理连接问题,和File类对文件的作用相似。
  • java.net.URLConnection:网络处理类,连接后处理数据交互等功能。
  • java.net.ServerSocket:服务器
  • java.net.Socket

二.案例

2.1 InAddress:地址处理

/**
	 * @throws Exception
	 * @see 域名处理:返回域名/IP
	 */
	@Test
	public void intAddress() throws Exception {
		InetAddress local = InetAddress.getLocalHost();
		System.out.println("本地IP:" + local.getHostAddress());//本地IP:192.168.124.1
		System.out.println("本地名称:" + local.getHostName());//本地名称:ssHss-PC
		InetAddress[] local2 = InetAddress.getAllByName("www.baidu.com");//IP180.97.33.108
		for (InetAddress ia : local2) {
			System.out.println("IP" + ia.getHostAddress());
			System.out.println("名称" + ia.getHostName());
			//IP:180.97.33.108
			//名称:www.baidu.com
			//IP:180.97.33.107
			//名称:www.baidu.com
		}
	}

3.2 URLConnection

/**
        * @throws Exception
        * @see URLConnection
        * @see 域名类:URL、处理连接前的工作(协议、域名、IP、端口、连接)
        * @See 连接处理类类:URLConnection、处理连接后的工作(读写)
        */
public void testURL() throws Exception {
              // 域名
              String urlPath = "http://www.baidu.com";
              // 生成 URL类
              URL url = new URL(urlPath);
              // 连接
              URLConnection urlconn = url.openConnection();
              System.out.println("========== head  ===========");
              Map<String, List<String>> map = urlconn.getHeaderFields();
              for (Entry<String, List<String>> entry : map.entrySet()) {
                     String key = entry.getKey();
                     List<String> value = entry.getValue();
                     System.out.println(key + "  :  " + value);
              }
 
              System.out.println("========== inputStream    ================");
              InputStream urlinput = urlconn.getInputStream();
 
              /**
               * 以字符
               */
              BufferedReader r = new BufferedReader(new InputStreamReader(urlinput));
              String readLine = null;
              int line = 1;
              while ((readLine = r.readLine()) != null) {
                     System.out.println(line + "  :" + readLine);
                     line++;
              }
              /**
               * 以字节
               */
              // byte[] tempBytes = new byte[100];
              // int byteRead = 0;
              // while ((byteRead = urlinput.read(tempBytes)) != -1) {
              // System.out.println(tempBytes);
              // }
       }

连接www.baidu.com获取的信息:

浏览器截图

console打印图:

3.3 Socket编程(TCP协议)

a) 监听80端口:

    /**
     * @throws IOException
     * @see severSocket :服务器Socket
     * @see socket:网络处理对象
     */
    @Test
    public void serviceSocket() throws IOException {
       // 创建ServerSocket(端口)
       ServerSocket server = new ServerSocket(8080);
       // 监听--》阻塞(等待连接)
       Socket socket = server.accept();
       // 处理数据
       BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
       String readline = null;
       while ((readline = buffer.readLine()) != null) {
           System.out.println(readline);
       }
    }

Console图

browers图

b) Server-Clinet实例

server-socket:

	/**
	 * @throws IOException
	 * @see severSocket :服务器Socket
	 * @see socket:网络处理对象
	 */
	@Test
	public void serviceSocket() throws IOException {
		// 创建ServerSocket(端口)
		ServerSocket server = new ServerSocket(8080);
		// 监听--》阻塞(等待连接)
		Socket socket = server.accept();

		PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
		System.out.println("========== server-write  ===========");
		out.println("你好!--我是server");
		// 处理数据
		BufferedReader buffer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		String readline = null;
		System.out.println("========== server-read  ===========");
		while ((readline = buffer.readLine()) != null) {
			System.out.println(readline);
		}

		out.close();
		socket.close();

	}

client:

/**
     * @throws IOException
     * @See clientSocket
     */
    @Test
    public void clientSocket() throws Exception {
       Socket s = new Socket("localhost", 8080);
       PrintWriter out = new PrintWriter(s.getOutputStream(), true);
       System.out.println("========== client-write  ===========");
       out.println("你好!..我是client");
        BufferedReader buffer = new BufferedReader(new InputStreamReader(s.getInputStream()));
       String readline = null;
       System.out.println("========== client-read  ===========");
       while ((readline = buffer.readLine()) != null) {
           System.out.println(readline);
       }
 
       out.close();
       s.close();
 
    }
posted on 2024-06-19 23:43  学游者  阅读(110)  评论(0)    收藏  举报