JavaSE:网络编程

概述

Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在Java的本机安装系统里,由JVM进行控制。并且Java实现了跨平台的网络库,程序员名对的是一个统一的网络编程环境。

网络基础

计算机网络:

把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模大、功能强的网络系统,从而使从多的计算机可以方便地互相传递信息、共享硬件、软件、数据信息等资源。

网络编程的目的:直接或间接的通过网络协议与其他计算机实现数据交换,进行通讯。

网络编程中由两个主要的问题:

  • 如何准确的定位网络上一台或多台主机;定位主机上的特定的应用
  • 找到主机后如何可靠高效的进行数据传输

网络编程中的两个要素:

  1. 对应问题一:IP和端口号
  2. 对应问题二:提供网络通信协议:TCP/IP参考模型

网络通信要素概述

通信要素一:IP和端口号

  1. IP:唯一的标识Iternet上的计算机(通信实体)
  2. 在Java中使用InetAddress类代表IP
  3. IP分类:IPv4和IPv6 ; 万维网 和 局域网
  4. 域名: www.baidu.com
  5. 本地回路地址:127.0.0.1 对应着:localhost
  6. 如何实例化InetAddress:两个方法:getByName(String host)、getLocalHost()
    1. 两个常用方法:getHostName()、getHostAddress()
  7. 端口号:标识正在计算机上运行的进程
    1. 要求:不同的进程有不同的端口号
    2. 范围:被规定为一个16位的整数0-65535
  8. 端口号与IP地址的组合得出一个网络套接字:Socket

网络通信要素二:网络协议

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

TCP/IP 以其两个主要协议,传输控制协议(TCP)和网络互联协议(IP)而得名,实际上是一组协议,包括多个具有不同功能互为关联的协议。

IP(Intrnet Protocol)协议是网络层的主要协议,支持网间互联的数据通信。

TCP/IP协议模型从更实用的角度开发,形成了高效的4层体系结构,即物理链路层、IP层、传输层和应用层

三次握手

在这里插入图片描述

四次挥手

在这里插入图片描述

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

TCP网络编程

简单实现文件的传输
客户端:

//客户端
@Test
public void client(){
    OutputStream os = null;
    FileInputStream fis = null;
    Socket socket = null;
    try {
        //获取服务器IP地址
        InetAddress address = InetAddress.getByName("127.0.0.1");
        //创建Socket对象,指明服务器端的IP地址和端口号
        socket = new Socket(address, 8989);
        //获取一个输出流,输出数据
        os = socket.getOutputStream();
        //获取一个输入流,获取数据
        fis = new FileInputStream("pic.jpg");

        //数据传输
        byte[] buffer = new byte[1024];
        int len;
        while ((len = fis.read(buffer)) != -1){
            os.write(buffer,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        if (fis != null){
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null){
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (socket != null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

服务器端

//服务器端
@Test
public void Service(){
    ServerSocket ss = null;
    Socket socket = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try {
        //1.创建ServerSocket,指明自己的端口号
        ss = new ServerSocket(8989);
        //2。调用accept方法表示接受来自客户端的socket
        socket = ss.accept();
        //3获取一个输入流
        is = socket.getInputStream();
        //4.获取一个输出流
        fos = new FileOutputStream("pic1.jpg");
        //5.将文件保存到本地
        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1){
            fos.write(buffer,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        //关闭资源的操作
        if (fos != null){
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (is != null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (socket != null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (ss != null){
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

UDP网络通信

示例:
客户端:

@Test
public  void client(){
    DatagramSocket socket = null;
    try {
        //1.创建一个DatagramSocket对象
        socket = new DatagramSocket();

        //2.提供发送的关键信息
        String str = "UDP协议方式发送数据";
        byte[] bytes = str.getBytes();
        InetAddress localHost = InetAddress.getLocalHost();
        //3.创建一个DatagramPacket,用于存储发送或接受的数据
        DatagramPacket packet = new DatagramPacket(bytes, 0, bytes.length, localHost, 8989);
        //4.发送数据
        socket.send(packet);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //5.关闭资源
        if (socket != null){
            socket.close();
        }
    }

}

服务器端:

@Test
public void server(){
    DatagramSocket socket = null;
    try {
        //1.创建DatagramSocket,指明自己的端口号
        socket = new DatagramSocket(8989);

        //2.创建容器用于接受数据
        byte[] buffer = new byte[1024];
        //创建DatagramPacket对象,用于接受数据
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        //3.接受数据
        socket.receive(packet);
        //4.输出到控制台
        System.out.println(new String(packet.getData(),0,packet.getLength()));
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //5.关闭资源
        if (socket != null) {
            socket.close();
        }
    }
}

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=root&password=123

片段名:即锚点,例如看小说,直接定位到章节

参数列表格式:参数名=参数值&参数名=参数值…

示例:

@Test
public void test2(){
    HttpURLConnection connection = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try {
        URL url = new URL("http://localhost:8080/examples/pic.jpg?username=root");
        connection = (HttpURLConnection) url.openConnection();
        connection.connect();
        is = connection.getInputStream();
        fos = new FileOutputStream("pic2.jpg");

        byte[] buffer = new byte[1024];
        int len;
        while ((len = is.read(buffer)) != -1){
            fos.write(buffer,0,len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fos != null){
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (is != null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (connection != null){
            connection.disconnect();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值