JAVA中的网络编程

一、网络编程概述

1.实现网络传输的三个要素:

使用IP地址(准确定位网络上一台或多台主机)
使用端口号(定位主机上的特定的应用)
规范网络通信协议(可靠、高效的数据传输)

2.通信要素1:IP地址

  • 作用:IP地址用来给网络中的一台计算机设备做唯一的编号
  • IP地址分类

IP地址分类方式1

IPV4(占用4个字节)
IPV6(占用16个字节)

IP地址分类方式2

公网地址(万维网使用)和私有地址(局域网使用)

  • 本地回路地址:127.0.0.1
  • 域名:便捷的记录ip地址 www.baidu.com

3.通信要素2:端口号

  • 端口号可以唯一标识设备中的进程(应用程序)
  • 不同的进程分配不同的端口号
  • 范围0~65535

4.InetAddress的使用

  • 作用:InetAddress类的一个实例就代表一个具体的ip地址
  • 实例化的方式:

InetAddress getByName(String host):获取指定ip对应的InetAddress的实例
InetAddress getLocalHost():获取本地ip对应的InetAddress的实例

  • 常用方法

getHostName():获取域名
getHostAddress():获取ip地址

5.通信要素3:通信协议

  • 网络通信协议的目的

为了可靠且高效的数据传输。

  • 网络参考模型

OSI参考模型:过于理想化,没有实施起来
TCP/IP参考模型:将网络分为4层:应用层、传输层、网络层、物理+数据链路层。

6.利用Socket网络编程C/S通信(TCP/IP):

package com.weike.C;

import org.junit.Test;
import sun.net.InetAddressCachePolicy;

import java.io.*;
import java.net.*;

/**
 *  TCP/IP socket网络通信
 *  客户端发送内容给服务端、服务端将内容打印到控制台上
 */
public class SocketTest {
    //客户端
    @Test
    public void client(){
        Socket socket = null;
        OutputStream outputStream = null;
        try {
            //1.创建一个Scoket 192.168.233.50 注意是对方的ip地址
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port = 8989; //声明对方的端口号
            socket = new Socket(inetAddress, port);

            //2.发送数据
            outputStream = socket.getOutputStream();
            outputStream.write("你好,北京!".getBytes());
            //客户端表明不再继续发送数据
            socket.shutdownOutput();

        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            //3.关闭资源
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    //服务端
    @Test
    public void Server() throws IOException {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            //1.创建一个ServerSocket
            int port = 8989;
            serverSocket = new ServerSocket(port);

            //2.调用accept(),接受来自客户端的Socket
            socket = serverSocket.accept();
            System.out.println("服务端已开启!");

            //3.接收数据
            inputStream = socket.getInputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            byteArrayOutputStream = new ByteArrayOutputStream();
            while((len = inputStream.read(buffer)) != -1){
                byteArrayOutputStream.write(buffer , 0 , len);
            }
            System.out.println(byteArrayOutputStream);
            System.out.println("数据接受完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            //4.关闭资源
            try {
                if (byteArrayOutputStream != null) {

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

    }
}

UDP通信案例:

package com.weike.C;

import org.junit.Test;

import java.io.IOException;
import java.net.*;

public class SocketTest3 {
    @Test
    public void testSender() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket();
        byte[] bytes = "你好!".getBytes();
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("127.0.0.1"), 8989);
        datagramSocket.send(datagramPacket);

        datagramSocket.close();

    }
    @Test
    public void Receiver() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(8989);
        byte[] bytes = new byte[1024 * 64];
        DatagramPacket datagramPacket = new DatagramPacket(bytes , 0 , bytes.length);

        datagramSocket.receive(datagramPacket);

        byte[] data = datagramPacket.getData();

        String str = new String(data , 0 , datagramPacket.getLength());
        System.out.println(str);
        datagramSocket.close();
    }

}

url编程:

package com.weike.C;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;

public class URLTest {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://www.wenm.com/。。。");
        HttpURLConnection uc = (HttpURLConnection)url.openConnection();

        InputStream inputStream = uc.getInputStream();

        FileOutputStream fileOutputStream = new FileOutputStream(new File("copy1.html"));
        int len = 0;
        byte[] buffer = new byte[1024];
        while ((len = inputStream.read(buffer)) != -1){
            fileOutputStream.write(buffer , 0 , len);
        }

        System.out.println("下载完成!");
        fileOutputStream.close();
        inputStream.close();
        uc.disconnect();

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向日葵不喜欢在客厅里种橘子树

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值