【java基础】 14 网络编程

目录

14.1 网络编程概述

14.2 网络通信要素概述

1 如何实现网络中的主机互相通信

14.3 通信要素1:IP和端口号

1 IP地址(InetAddress)

2 InetAddress类

3 端口号

14.4 通信要素2:网络通信协议

1 网络通信协议

2 TCP/IP协议簇

3 TCP和UDP

14.5 TCP网络编程

14.6 UDP网络编程

14.7 URL编程

1 URL

2 URL类构造器

3 方法


14.1 网络编程概述

  • Java提供的网络类库,可以实现无痛的网络连接,联网的底层 细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并 且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一 的网络编程环境。
  • 网络编程的目的: 直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
  • 网络编程中有两个主要的问题:
    • 如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
    • 找到主机后如何可靠高效地进行数据传输

14.2 网络通信要素概述

  1. IP和端口号
  2. 网络通信协议

1 如何实现网络中的主机互相通信

  • 通信双方地址: IP、 端口号
  • 一定的规则(即:网络通信协议。有两套参考模型)
    • OSI参考模型:模型过于理想化,未能在因特网上进行广泛推广
    • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。


14.3 通信要素1:IP和端口号

1 IP地址(InetAddress

  • 在java中,使用InetAddress类代表IP
  • 作用:唯一的标识 Internet 上的计算机(通信实体)
  • 本地回环地址(hostAddress):127.0.0.1 主机名(hostName):localhost
  • 特点:不易记忆
  • 分类:
    • IP地址分类方式1:IPV4 和 IPV6
      • IPV4:4个字节组成,4个0-255。大概42亿,30亿都在北美,亚洲4亿。2011年初已 经用尽。以点分十进制表示,如192.168.0.1
      • IPV6:128位(16个字节),写成8个无符号整数,每个整数用四个十六进制位表示, 数之间用冒号(:)分开,如:3ffe:3201:1401:1280:c8ff:fe4d:db39:1984
    • IP地址分类方式2:公网地址(万维网使用)和私有地址(局域网使用)。
      • 192.168. 开头的就是私有址址,范围即为192.168.0.0--192.168.255.255,专门为组织机 构内部使用

2 InetAddress类

  • 域名:
    • Internet上的主机有两种方式表示地址:
      • 域名(hostName):www.baidu.com
      • IP 地址(hostAddress):14.215.177.38
    • 域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS) 负责将域名转化成IP地址,这样才能和主机建立连接。
  • InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取 InetAddress实例
    • public static InetAddress getLocalHost() //获取本机的IP地址
    • public static InetAddress getByName(String host) //(通过域名或具体IP值)获取指定IP地址

3 端口号

  • 端口号标识正在计算机上运行的进程(程序)
  • 不同的进程有不同的端口号, 被规定为一个 16 位的整数 0~65535。
  • 端口分类:
    • 公认端口:0~1023。被预先定义的服务通信占用(如:HTTP占用端口 80,FTP占用端口21,Telnet占用端口23)
    • 注册端口:1024~49151。分配给用户进程或应用程序。(如:Tomcat占 用端口8080,MySQL占用端口3306,Oracle占用端口1521等)。
    • 动态/私有端口:49152~65535。
  • 端口号与IP地址的组合得出一个网络套接字:Socket。

14.4 通信要素2:网络通信协议

1 网络通信协议

计算机网络中实现通信必须有一些约定,即通信协议,对速率、传输代码、代 码结构、传输控制步骤、出错控制等制定标准。

2 TCP/IP协议簇

  • 传输层协议中有两个非常重要的协议:
    • 传输控制协议TCP(Transmission Control Protocol)
    • 用户数据报协议UDP(User Datagram Protocol)。
  • TCP/IP 以其两个主要协议:传输控制协议(TCP)和网络互联协议(IP)而得 名,实际上是一组协议,包括多个具有不同功能且互为关联的协议。
  • IP(Internet Protocol)协议是 网络层的主要协议,支持网间互连的数据通信。
  • TCP/IP协议模型从更实用的角度出发,形成了高效的四层体系结构,即 物理链路层、IP层、传输层和应用层。

3 TCP和UDP

  • TCP协议:
    • 使用TCP协议前,须先建立TCP连接,形成传输数据通道
    • 传输前,采用“三次握手”方式,点对点通信,是 可靠的
    • TCP协议进行通信的两个应用进程:客户端、服务端。
    • 在连接中可进行大数据量的传输
    • 传输完毕,需释放已建立的连接, 效率低
  • UDP协议:
    • 将数据、源、目的封装成数据包,不需要建立连接
    • 每个数据报的大小限制在64K内
    • 发送不管对方是否准备好,接收方收到也不确认,故是 不可靠的
    • 可以广播发送
    • 发送数据结束时无需释放资源, 开销小,速度快

14.5 TCP网络编程

基于TCP的socket通信:
编程:客户端发送消息给服务器端,服务器端将数据显示在控制台上
//需要使用try-catch-finally处理异常,为了方便阅读省略
public void client() throws IOException {
    //1.创建Socket对象,指明服务器端的IP和端口号
    InetAddress inet = InetAddress.getByName("127.0.0.1"); //服务器端的IP
    Socket socket = new Socket(inet,8899);
    //2.获取输出流,用于输出数据
    OutputStream os = socket.getOutputStream();
    //3.写出数据
    os.write("我是客户端".getBytes());
    socket.shutdownOutput(); //关闭数据输出
    //客户端接收服务器端的消息
    InputStream is = socket.getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[20];
    int len;
    while ((len = is.read(buffer)) != -1){
        baos.write(buffer,0,len);
    }
    System.out.println(baos.toString());
    //4.资源关闭
    baos.close();
    is.close();
    os.close();
    socket.close();
}

public void server() throws IOException {
    //1.创建服务器端的ServerSocket,指明自己的端口号
    ServerSocket ss = new ServerSocket(8899);
    //2.调用accept()表示接受来自于客户端的socket
    Socket socket = ss.accept();
    //3.获取输入流
    InputStream is = socket.getInputStream();
    //4.读取输入流中的数据
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[20];
    int len;
    while ((len = is.read(buffer)) != -1){
        baos.write(buffer,0,len); //写入ByteArrayOutputStream类中定义的数组中
    }
    //显示操作
    System.out.println(baos.toString()); //全部存储到baos中再去转字符串,不会出现乱码
    System.out.println(socket.getInetAddress()); //获取客户端的IP地址
    //服务器端给予客户端反馈
    OutputStream os = socket.getOutputStream();
    os.write("消息已收到".getBytes());
    //5.资源关闭
    os.close();
    baos.close();
    is.close();
    socket.close();
    ss.close();
}

14.6 UDP网络编程

  • UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证 UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
  • DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP 地址和端口号以及接收端的IP地址和端口号。
  • UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和 接收方的连接。如同发快递包裹一样。
UDP收发数据:
//省略了try-catch-finally
//发送端
public void sender() throws IOException {
    DatagramSocket socket = new DatagramSocket();
    String str = "UDP发送的消息";
    byte[] data = str.getBytes();
    InetAddress inet = InetAddress.getLocalHost();
    //UDP数据报
    DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet,9090);
    socket.send(packet);
    socket.close();
}

//接收端
public void receiver() throws IOException {
    DatagramSocket socket = new DatagramSocket(9090);
    byte[] buffer = new byte[100];
    DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
    socket.receive(packet);
    System.out.println(new String(packet.getData(),0,packet.getLength()));
    socket.close();
}

14.7 URL编程

1 URL

  • URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一 资源的地址。
  • 它是一种具体的URI,即URL可以用来标识一个资源,而且还指明了如何locate 这个资源。 通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
  • URL的基本结构由5部分组成:
    • <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表
    • 例如:  http://192.168.1.100:8080/helloworld/index.jsp#a?username=shkstart&password=123
    • #片段名:即锚点,例如看小说,直接定位到章节
    • 参数列表格式:参数名=参数值&参数名=参数值....

2 URL类构造器

  • public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。
    • URL url = new URL ("http://www. baidu.com/");
  • public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。
    • URL downloadUrl = new URL(url, “download.html")
  • public URL(String protocol, String host, String file);
    • new URL("http", "www. baidu .com", “download. html");
  • public URL(String protocol, String host, int port, String file);
    • URL gamelan = new URL("http", "www. baidu .com", 80, “download.html");

3 方法

public static void main(String[] args) {
    try {
        URL url = new URL("http://localhost:8080/examples/1.jpg");
        //获取该URL的协议名
        System.out.println(url.getProtocol());
        //获取该URL的主机名
        System.out.println(url.getHost());
        //获取该URL的端口号
        System.out.println(url.getPort());
        //获取该URL的文件路径
        System.out.println(url.getPath());
        //获取该URL的文件名
        System.out.println(url.getFile());
        //获取该URL的查询名
        System.out.println(url.getQuery());
    } catch (MalformedURLException e) {
        e.getMessage();
    }
}

从给定的url下载资源:
public void test2() throws IOException {
    URL url = new URL("http://localhost:8080/examples/1.jpg");
    //创建HTTP连接的对象
    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
    //获取连接
    urlConnection.connect();
    InputStream is = urlConnection.getInputStream();
    FileOutputStream fos = new FileOutputStream("2.jpg");
    byte[] buffer = new byte[1024];
    int len;
    while((len = is.read(buffer)) != -1){
        fos.write(buffer,0,len);
    }
    is.close();
    fos.close();
    urlConnection.disconnect();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 网络编程 说明: 网络编程,分为两种一种是TCP、另一种是UDP方式。我们分别写一下TCP、UDP端的Server和Client简单演示代码。 TCP: Sever import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; public class TCPServer { public static void main(String[] args) { try { ServerSocket socket = new ServerSocket(4444); while (true) { Socket sc =socket.accept(); InputStream instr = sc.getInputStream(); DataInputStream dataInputStream = new DataInputStream(instr); System.out.println(dataInputStream.readUTF()); } } catch (IOException e) { e.printStackTrace(); } } } Client import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class TCPClient { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1",4444); OutputStream oStream = socket.getOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(oStream); dataOutputStream.writeUTF("Hello"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } UDP: Server: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UDPServer { public static void main(String[] args) { try { byte [] buffer = new byte[1024]; DatagramSocket socket = new DatagramSocket(4444); DatagramPacket packet = new DatagramPacket(buffer, buffer.length); while(true){ socket.receive(packet); System.out.println(new String(buffer,0,packet.getLength())); } } catch (SocketException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } Client import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; public class UDPClient { public static void main(String[] args) { byte [] buffer = null; buffer = new String("hello").getBytes(); DatagramPacket packet=null; try { packet = new DatagramPacket(buffer, buffer.length,new InetSocketAddress("127.0.0.1", 4444)); DatagramSocket socket = new DatagramSocket(1234); socket.send(packet); socket.close(); } catch (SocketException e1) { e1.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值