zoukankan      html  css  js  c++  java
  • Java基础学习(六) 网络编程简介

    基础知识:
    1、osi分层模型和TCP/IP分层模型对应关系

    2、七层模型与协议的对应关系
    网络层 ------------ IP(网络之间的互联协议)
    传输层 ------------ TCP(传输控制协议)、UDP(用户数据报协议)
    应用层 ------------ Telnet(Internet远程登录服务的标准协议和主要方式)、FTP(文本传输协议)、HTTP(超文本传送协议)

    3、IP地址和端口号
    1、ip地址用于唯一标示网络中的一个通信实体,这个通信实体可以是一台主机,可以是一台打印机,或者是路由器的某一个端口。而在基于IP协议网络中传输的数据包,必须使用IP地址来进行标示。
    2、ip地址唯一标示了通信实体,但是一个通信实体可以有多个通信程序同时提供网络服务。这个时候就要通过端口来区分开具体的通信程序。一个通信实体上不能有两个通信程序使用同一个端口号。

    4、TCP和UDP
    1、TCP是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。它能够提供两台计算机之间的可靠的数据流,HTTP、FTP、Telnet等应 用都需要这种可靠的通信通道。
    2、UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传送目的地,至于能够达到目的地,达到目的地的时 间以及内容的正确性都是不能保证的。

    TCP和UDP差异:
    1、可靠的传输是要付出代价的,对数据内容的正确性的检验必然会占用计算机处理时间和网络带宽。因此TCP的传输效率不如UDP高。
    2、许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求视频音频数据绝对正确,只要能够连贯就可以了。所以在这些场景下,使用UDP更合适些。

    5、URL
    1、URL对象代表统一资源定位器,是指向互联网“资源”的指针。它是用协议名、主机、端口和资源组成,即满足如下格式:
    protocol://host:port/resourceName
    http://www.crazyit.org/index.php
    2、通过URL对象的一些方法可以访问该URL对应的资源:
    String getFile():获取该URL的资源名
    String getHost():获取主机名
    String getPath():获取路径部分
    int getPort():获取端口号
    public static void main(String[] args) throws IOException
    {
    URL url = new URL("https://i.cnblogs.com/EditPosts.aspx?opt=1");
    String file = url.getFile();
    String host = url.getHost();
    int port = url.getPort();
    String query = url.getQuery();
    String protocol = url.getProtocol();
    }
    URL最重要的两个方法:openConnection()、openStream()
    public static void main(String[] args) throws IOException
    {
    URL url = new URL("http://www.baidu.com");
    URLConnection connection = url.openConnection();
    InputStream is = connection.getInputStream();
    OutputStream os = new FileOutputStream("c:/data.txt");
    byte[] buffer = new byte[1024];
    int flag = 0;
    while (-1 != (flag = is.read(buffer, 0, buffer.length)))
    {
    os.write(buffer, 0, flag);
    }
    os.close();
    is.close();
    }

    1、代码第4行openConnection()该方法用于返回URLConnection对象,表示到URL所引用的远程连接。
    2、代码第5行getInputStream方法,用于返回从此打开的连接读取的输入流。
    3、后面的代码就是我们已经很熟悉的从输入流中读到数据,再通过输出流写入文件。
    4、执行的结果就是我们通过浏览器访问http://www.baidu.com,百度服务器返回的内容。
    5、这里是文本文件,我们将后缀修改为html,然后用浏览器访问,这样看起来更直观:

    6、InetAddress
    JAVA提供了InetAddress类来代表IP地址。

    public static void main(String[] args) throws IOException
    {
    InetAddress address = InetAddress.getLocalHost();
    System.out.println(address);
    address = InetAddress.getByName("www.baidu.com");
    System.out.println(address);

    }
    1 WINDOWS-EC813QQ/192.168.88.1
    2 www.baidu.com/115.239.211.112

    7、Socket网络通信
    Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点。

    使用Socket进行网络通信的过程
    服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接请求。
    客户端:客户端程序根据你服务器所在的主机名和端口号发出连接请求。
    两者之间的通信是通过Socket完成的,我们可以认为Socket是两个城市之间的交通工具,有了它,就可以在两个城市之间穿梭了。

    主机A的应用程序和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket必须由底层的TCP/IP协议来建立TCP连接。建立TCP连接需要底层IP协议来寻址网络中的主机。IP地址只能帮助我们找到目标主机,但是一个主机上面有多个应用程序,如何才能找到我们需要的应用程序,这个时候就可以通过端口号来指定了。

    简易服务端、客户端模拟,样例:
    服务器端:
    public class ServerTest {
    public static void main(String[] args) throws IOException {
    //创建一个ServerSocket,用于监听客户端Socket连接请求
    ServerSocket ss = new ServerSocket(9999);
    System.out.println("server start");
    //采用循环方式监听客户端的请求
    while (true) { //侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
    Socket socket = ss.accept();
    //获取客户端的信息
    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String str = br.readLine();
    System.out.println(str);
    //向客户端发送信息
    OutputStream os = socket.getOutputStream();
    PrintStream ps = new PrintStream(os);
    ps.print("服务端 -> 客户端");
    ps.close();
    os.close();
    br.close();
    is.close();
    socket.close();
    }
    }
    }

    客户端:
    public class Client{
    public static void main(String[] args) throws Exception {
    Socket socket = new Socket("localhost", 9999);
    //向服务器发信息
    OutputStream os = socket.getOutputStream();
    PrintStream ps = new PrintStream(os);
    ps.println("客户端->服务端");
    //读取服务器发送的信息
    InputStream is = socket.getInputStream();
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String str = br.readLine();
    System.out.println(str);
    br.close();
    is.close();
    socket.close();
    }

    }

  • 相关阅读:
    Java_大数加法
    Java_找出最多的10个单词
    过滤文本敏感词
    JDK(Win10)下载与安装
    Agile PLM_统计物料消耗
    Java_扑克牌顺子
    Java8_stream_集合对象属性的合并
    Apache Maven下载与安装
    java泛型 无敌
    Java异常处理 无敌
  • 原文地址:https://www.cnblogs.com/KaKa-King/p/9559681.html
Copyright © 2011-2022 走看看