Java网络编程

Java网络编程

课程:1、什么是计算机网络_哔哩哔哩_bilibili

一.什么是计算机网络 

邮件 Java网络编程_第1张图片

1.计算机网络: 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。

2.网络编程的目的:无线电台…传播交流信息,数据交换,通信。

3.想要达到这个效果需要什么

(1).如何让准确的定位网络上的一台主机 192.168.16.124:端口, 定位上这个计算机上的某个资源。

(2).找到了这个主机,如何传输数据呢?

  • Javaweb:网页编程 、 B/S架构
  • 网络编程:TCP/IP 、 C/S

 二.网络通信要素

 1.如何实现网络的通信?

通信双方的地址:ip:192.168.16.124 与 端口:5900

2.规则:网络通信的协议:TCP/IP

Java网络编程_第2张图片

小结:

一.网络编程中有两个主要的问题:

如何让准确的定位到网络上的一台或多台主机;Java网络编程_第3张图片

找到主机之后如何通信;

二.网络编程中的要素:

IP和端口号:IP

网络通信协议:UDP、TCP

三.ip地址 

 Java 8 中文版 - 在线API手册 - 码工具 (matools.com)

 IP 地址:JavaInetAddress类

Modifier and Type Method and Description
boolean equals(Object obj)

将此对象与指定对象进行比较。

byte[] getAddress()

返回此 InetAddress对象的原始IP地址。

static InetAddress[] getAllByName(String host)

给定主机的名称,根据系统上配置的名称服务返回其IP地址数组。

static InetAddress getByAddress(byte[] addr)

给出原始IP地址的 InetAddress对象。

static InetAddress getByAddress(String host, byte[] addr)

根据提供的主机名和IP地址创建InetAddress。

static InetAddress getByName(String host)

确定主机名称的IP地址。

String getCanonicalHostName()

获取此IP地址的完全限定域名。

String getHostAddress()

返回文本显示中的IP地址字符串。

String getHostName()

获取此IP地址的主机名。

static InetAddress getLocalHost()

返回本地主机的地址。

static InetAddress getLoopbackAddress()

返回回送地址。

int hashCode()

返回此IP地址的哈希码。

boolean isAnyLocalAddress()

检查通配符地址中的InetAddress的实用程序。

boolean isLinkLocalAddress()

检查InetAddress是否是链接本地地址的实用程序。

boolean isLoopbackAddress()

检查InetAddress是否是一个环回地址的实用程序。

boolean isMCGlobal()

检查多播地址是否具有全局范围的实用程序。

boolean isMCLinkLocal()

检查组播地址是否具有链路范围的实用程序。

boolean isMCNodeLocal()

检查多播地址是否具有节点范围的实用程序。

boolean isMCOrgLocal()

检查组播地址是否具有组织范围的实用程序。

boolean isMCSiteLocal()

检查多播地址是否具有站点范围的实用程序。

boolean isMulticastAddress()

检查InetAddress是否是IP组播地址的实用程序。

boolean isReachable(int timeout)

测试该地址是否可达。

boolean isReachable(NetworkInterface netif, int ttl, int timeout)

测试该地址是否可达。

boolean isSiteLocalAddress()

检查InetAddress是否是站点本地地址的实用程序。

String toString()

将此IP地址转换为 String 。

1.唯一定位一台网络上的计算机

127.0.0.1: 本机localhost

2.ip地址的分类

(1)ipv4与ipv6 

IPV4: 127.0.0.1 ,4个字节组成。,0~255, 42亿~;30亿都在北美,亚洲4亿。2011年就用尽;

IPV6: fe80::f0e0:7383:ad8e:f32f%3 ,128位。8个无符号整数与字母a~e

(2)公网(互联网)—私网(局域网)

   ABCD地址

   192.168.xx.xx,专门给组织内部使用。

3.域名:为了方便记忆IP!

package github.Web;
import java.net.InetSocketAddress;
/**
 * @author subeiLY
 * @create 2021-06-06 10:34
 */
public class TestInetSocketAddress {
    public static void main(String[] args) {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress2);
        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getHostName());    // 地址
        System.out.println(socketAddress.getPort());    // 端口
    }
}

四.端口 

1.端口表示

在计算机网络中,端口是用于标识特定应用程序或服务的数字。计算机有许多网络通信通道,每个通道都有一个唯一的数字端口号。这些端口号帮助指定数据包传输到正确的应用程序或服务。 

2.被规定0~65535

TCP,UDP:65535*2个端口 tcp:80 udp:80 单个协议下,端口号不能冲突

3.端口分类

(1).共有端口 0~1023 内置的进程使用

HTTP:80

HTTP:443 如访问https://www.baidu.com:443 访问的还是百度

FTP:21

TELENT:23

(2).程序注册端口:1014-49151,分配给用户和程序

Tomcat:8080

MySql:3306

Oracle:1521

(3).动态、私有端口:49152~65535

4.命令 

  1. netstat -ano #查看所有的端口
  2. netstat -nao|findstr "7808" #查看指定的端口
  3. tasklist|findstr "8696"

package github.Web;
import java.net.InetSocketAddress;
/**
 * @author subeiLY
 * @create 2021-06-06 10:34
 */
public class TestInetSocketAddress {
    public static void main(String[] args) {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress2);
        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getHostName());    // 地址
        System.out.println(socketAddress.getPort());    // 端口
    }
}

五.通信协议 

协议:约定,就好比中国人交流说的是普通话

1.网络通信协议: 速率,传输码率,代码结构,传输控制…

问题:非常的复杂

大事化小:分层

2.TCP/IP协议簇:实际上是一组协议

重要:

  • TCP:用户传输协议
  • UDP:用户数据报协议

出名的协议:

  • TCP:
  • IP:网络互联协议

Java网络编程_第4张图片

3.TCP UDP 对比

(1).TCP:打电话

  • 连接,稳定
  • 传输完成,释放连接,效率低

  • 客户端、服务器

  • 三次握手,四次挥手

     
        
    1. 最少需要三次,保证稳定连接!
    2. A:你瞅啥?
    3. B:瞅你咋地?
    4. A:干一场
    5. A:我要分手了
    6. B:我知道你要分手了
    7. B:你真的要分手吗?
    8. A:我真的要分手了
  • UDP:发短信

    • 不连接,不稳定
    • 客户端、服务端:没有明确的解现
    • 不管有没有准备好,都可以发给你
    • DDOS:洪水攻击! 发垃圾包 堵塞线路 (饱和攻击)

 六.TCP

1.实现聊天 

先启动服务端,再启动客户端

 (1)客户端

构造方法
Modifier Constructor and Description
  Socket()

创建一个未连接的套接字,并使用系统默认类型的SocketImpl。

  Socket(InetAddress address, int port)

创建流套接字并将其连接到指定IP地址的指定端口号。

  Socket(InetAddress host, int port, boolean stream)已弃用

使用DatagramSocket代替UDP传输。

  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

创建套接字并将其连接到指定的远程端口上指定的远程地址。

  Socket(Proxy proxy)

创建一个未连接的套接字,指定应该使用的代理类型(如果有的话),无论其他任何设置如何。

protected Socket(SocketImpl impl)

使用用户指定的SocketImpl创建一个未连接的Socket。

  Socket(String host, int port)

创建流套接字并将其连接到指定主机上的指定端口号。

  Socket(String host, int port, boolean stream)已弃用

使用DatagramSocket代替UDP传输。

  Socket(String host, int port, InetAddress localAddr, int localPort)

创建套接字并将其连接到指定远程端口上的指定远程主机。

所有方法
Modifier and Type Method and Description
void bind(SocketAddress bindpoint)

将套接字绑定到本地地址。

void close()

关闭此套接字。

void connect(SocketAddress endpoint)

将此套接字连接到服务器。

void connect(SocketAddress endpoint, int timeout)

将此套接字连接到具有指定超时值的服务器。

SocketChannel getChannel()

返回与此套接字相关联的唯一的SocketChannel对象(如果有)。

InetAddress getInetAddress()

返回套接字所连接的地址。

InputStream getInputStream()

返回此套接字的输入流。

boolean getKeepAlive()

测试是否启用了 SO_KEEPALIVE 。

InetAddress getLocalAddress()

获取套接字所绑定的本地地址。

int getLocalPort()

返回此套接字绑定到的本地端口号。

SocketAddress getLocalSocketAddress()

返回此套接字绑定到的端点的地址。

boolean getOOBInline()

测试是否启用了 SO_OOBINLINE 。

OutputStream getOutputStream()

返回此套接字的输出流。

int getPort()

返回此套接字连接到的远程端口号。

int getReceiveBufferSize()

获取这个 Socket的 SO_RCVBUF选项的值,即平台在此 Socket上输入的缓冲区大小。

SocketAddress getRemoteSocketAddress()

返回此套接字连接,或端点的地址 null如果是未连接。

boolean getReuseAddress()

测试是否启用了 SO_REUSEADDR 。

int getSendBufferSize()

获取此 Socket的 SO_SNDBUF选项的值,即该平台在此 Socket上输出使用的缓冲区大小。

int getSoLinger()

SO_LINGER的退货设置。

int getSoTimeout()

SO_TIMEOUT的退货设置。

boolean getTcpNoDelay()

测试是否启用了 TCP_NODELAY 。

int getTrafficClass()

在从此Socket发送的数据包的IP头中获取流量类或服务类型

boolean isBound()

返回套接字的绑定状态。

boolean isClosed()

返回套接字的关闭状态。

boolean isConnected()

返回套接字的连接状态。

boolean isInputShutdown()

返回套接字连接的一半是否关闭。

boolean isOutputShutdown()

返回套接字连接的写半是否关闭。

void sendUrgentData(int data)

在套接字上发送一个字节的紧急数据。

void setKeepAlive(boolean on)

启用/禁用 SO_KEEPALIVE 。

void setOOBInline(boolean on)

启用/禁用 SO_OOBINLINE (接收TCP紧急数据)默认情况下,此选项被禁用,并且在套接字上接收的TCP紧急数据被静默地丢弃。

void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

设置此套接字的性能首选项。

void setReceiveBufferSize(int size)

设置 SO_RCVBUF选项为这个指定的值 Socket 。

void setReuseAddress(boolean on)

启用/禁用 SO_REUSEADDR套接字选项。

void setSendBufferSize(int size)

设置 SO_SNDBUF选项为这个指定的值 Socket 。

static void setSocketImplFactory(SocketImplFactory fac)

设置应用程序的客户端套接字实现工厂。

void setSoLinger(boolean on, int linger)

启用/禁用 SO_LINGER ,具有指定的逗留时间(以秒为单位)。

void setSoTimeout(int timeout)

启用/禁用 指定超时的 SO_TIMEOUT(以毫秒为单位)。

void setTcpNoDelay(boolean on)

启用/禁用 TCP_NODELAY (禁用/启用Nagle的算法)。

void setTrafficClass(int tc)

在从此Socket发送的数据包的IP头中设置流量类或服务类型字节。

void shutdownInput()

将此套接字的输入流放置在“流的末尾”。

void shutdownOutput()

禁用此套接字的输出流。

String toString()

将此套接字转换为 String 。

package com;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

// 客户端
public class TCPClientDemo01 {
    public static void main(String[] args) {

        Socket accept = null;
        OutputStream os = null;

        try {
            // 1.要知道服务器的地址
            InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
            int port = 9999;

            // 2.创建一个socket链接
            accept = new Socket(inetAddress,port);

            // 3.发送信息IO流
            os = accept.getOutputStream();
            os.write("fuck fffffffff".getBytes());

        }catch (Exception e){
            e.printStackTrace();
        } finally {
            // 关闭资源
            if(os != null){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(accept != null){
                try {
                    accept.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

(2)服务端

                                                                构造方法 

Constructor and Description
ServerSocket()

创建未绑定的服务器套接字。

ServerSocket(int port)

创建绑定到指定端口的服务器套接字。

ServerSocket(int port, int backlog)

创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。

ServerSocket(int port, int backlog, InetAddress bindAddr)

创建一个具有指定端口的服务器,侦听backlog和本地IP地址绑定。

                                                                 方法 

Modifier and Type Method and Description
Socket accept()

侦听要连接到此套接字并接受它。

void bind(SocketAddress endpoint)

将 ServerSocket绑定到特定地址(IP地址和端口号)。

void bind(SocketAddress endpoint, int backlog)

将 ServerSocket绑定到特定地址(IP地址和端口号)。

void close()

关闭此套接字。

ServerSocketChannel getChannel()

返回与此套接字相关联的唯一的ServerSocketChannel对象(如果有)。

InetAddress getInetAddress()

返回此服务器套接字的本地地址。

int getLocalPort()

返回此套接字正在侦听的端口号。

SocketAddress getLocalSocketAddress()

返回此套接字绑定到的端点的地址。

int getReceiveBufferSize()

获取此 ServerSocket的 SO_RCVBUF选项的值,即将用于从该 ServerSocket接受的套接字的建议缓冲区大小。

boolean getReuseAddress()

测试是否启用了 SO_REUSEADDR 。

int getSoTimeout()

检索 SO_TIMEOUT的设置。

protected void implAccept(Socket s)

ServerSocket的子类使用这个方法来覆盖accept()来返回自己的套接字子类。

boolean isBound()

返回ServerSocket的绑定状态。

boolean isClosed()

返回ServerSocket的关闭状态。

void setPerformancePreferences(int connectionTime, int latency, int bandwidth)

设置此ServerSocket的性能首选项。

void setReceiveBufferSize(int size)

设置从 ServerSocket接受的套接字的 SO_RCVBUF选项的默认建议值。

void setReuseAddress(boolean on)

启用/禁用 SO_REUSEADDR套接字选项。

static void setSocketFactory(SocketImplFactory fac)

设置应用程序的服务器套接字实现工厂。

void setSoTimeout(int timeout)

启用/禁用 SO_TIMEOUT带有指定超时,以毫秒为单位。

String toString()

将该套接字的实现地址和实现端口返回为 String 。

package com;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 服务端
public class TCPServerDemo01 {
    public static void main(String[] args) {

        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;

        try{
            // 1.有一个地址
            serverSocket = new ServerSocket(9999);

            // 2.等待客户端连接过来
            socket = serverSocket.accept();

            // 3.读取客户端的消息
            is = socket.getInputStream();

            // 管道流
            baos = new ByteArrayOutputStream();

            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);

            }
            System.out.println(baos.toString());


        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (baos != null) {
                try {
                    baos.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 (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

注意:运行的时候先开服务端再开客户端 Java网络编程_第5张图片

2.文件上传 

客户端 

package com;


import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

// 客户端
public class TCPClientDemo02 {
    public static void main(String[] args) throws Exception {
        // 1.建立连接
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9000);

        // 2.创建输出流
        OutputStream os = socket.getOutputStream();

        // 3.读取文件
        FileInputStream stream = new FileInputStream("one.jpg");

        // 4.输出测试文件

        byte[] buffer = new byte[1024];

        int len = 0;
        while((len = stream.read(buffer)) != -1){
            os.write(buffer,0,len);
        }

        // 5.通知服务器已发送完成
        socket.shutdownOutput();

        // 6.确定服务器已经收到,断开连接
        InputStream inputStream = socket.getInputStream();

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] buffer2 = new byte[1024];

        int len2 = 0;
        while((len2 = stream.read(buffer2)) != -1){
            byteArrayOutputStream.write(buffer2,0,len2);
        }

        System.out.println(byteArrayOutputStream);

        // 7.关闭流
        byteArrayOutputStream.close();
        inputStream.close();
        stream.close();
        os.close();
        socket.close();
    }
}

服务端 

package com;


import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

// 服务器
public class TCPServerDemo02 {
    public static void main(String[] args) throws Exception{
        // 1.创建一个服务器地址
        ServerSocket socket = new ServerSocket(9000);

        // 2.监听客户连接
        Socket accept = socket.accept();    // 阻塞式监听,能等待用户连进来

        // 3.获取输入流
        InputStream is = accept.getInputStream();

        // 4.确定存放文件的位置
        FileOutputStream fileOutputStream = new FileOutputStream("resort.jpg");

        // 5.写入文件
        byte[] buffer = new byte[1024];
        int len = 0;
        while((len = is.read(buffer)) != -1){
            fileOutputStream.write(buffer,0,len);
        }

        // 6.通知客户端收集完毕
        OutputStream outputStream = accept.getOutputStream();
        outputStream.write("服务器已经收集成功,请断开连接!".getBytes());

        // 7.关闭流
        outputStream.close();
        fileOutputStream.close();
        is.close();
        accept.close();
        socket.close();
    }
}

 七.初识Tomcat

服务端

  • 自定义 S
  • Tomcat服务器 S :Java后台开发

客户端

  • 自定义 C
  • 浏览器 B

Tomcat下载安装以及配置(详细教程)_tomcat安装及配置教程-CSDN博客 

视频教程: 8、初识Tomcat_哔哩哔哩_bilibili

 Java网络编程_第6张图片

八.UDP

1.发送消息 

构造方法
Modifier Constructor and Description
  DatagramSocket()

构造数据报套接字并将其绑定到本地主机上的任何可用端口。

protected DatagramSocket(DatagramSocketImpl impl)

使用指定的DatagramSocketImpl创建一个未绑定的数据报套接字。

  DatagramSocket(int port)

构造数据报套接字并将其绑定到本地主机上的指定端口。

  DatagramSocket(int port, InetAddress laddr)

创建一个数据报套接字,绑定到指定的本地地址。

  DatagramSocket(SocketAddress bindaddr)

创建一个数据报套接字,绑定到指定的本地套接字地址。

                                                                         方法

Modifier and Type Method and Description
void bind(SocketAddress addr)

将此DatagramSocket绑定到特定的地址和端口。

void close()

关闭此数据报套接字。

void connect(InetAddress address, int port)

将套接字连接到此套接字的远程地址。

void connect(SocketAddress addr)

将此套接字连接到远程套接字地址(IP地址+端口号)。

void disconnect()

断开插座。

boolean getBroadcast()

测试是否启用了SO_BROADCAST。

DatagramChannel getChannel()

返回与该数据报套接字相关联的唯一的DatagramChannel对象(如果有)。

InetAddress getInetAddress()

返回此套接字连接到的地址。

InetAddress getLocalAddress()

获取套接字所绑定的本地地址。

int getLocalPort()

返回此套接字绑定到的本地主机上的端口号。

SocketAddress getLocalSocketAddress()

返回此套接字绑定到的端点的地址。

int getPort()

返回此套接字连接到的端口号。

int getReceiveBufferSize()

获取此 DatagramSocket的SO_RCVBUF选项的值,即平台在此 DatagramSocket上输入的缓冲区大小。

SocketAddress getRemoteSocketAddress()

返回此套接字连接,或端点的地址 null如果是未连接。

boolean getReuseAddress()

测试是否启用了SO_REUSEADDR。

int getSendBufferSize()

获取此 DatagramSocket的SO_SNDBUF选项的值,即该平台用于在此 DatagramSocket上输出的缓冲区大小。

int getSoTimeout()

检索SO_TIMEOUT的设置。

int getTrafficClass()

在从该DatagramSocket发送的数据包的IP数据报头中获取流量类或服务类型。

boolean isBound()

返回套接字的绑定状态。

boolean isClosed()

返回套接字是否关闭。

boolean isConnected()

返回套接字的连接状态。

void receive(DatagramPacket p)

从此套接字接收数据报包。

void send(DatagramPacket p)

从此套接字发送数据报包。

void setBroadcast(boolean on)

启用/禁用SO_BROADCAST。

static void setDatagramSocketImplFactory(DatagramSocketImplFactory fac)

设置应用程序的数据报套接字实现工厂。

void setReceiveBufferSize(int size)

设置SO_RCVBUF选项设置为这个指定的值 DatagramSocket 。

void setReuseAddress(boolean on)

启用/禁用SO_REUSEADDR套接字选项。

void setSendBufferSize(int size)

设置SO_SNDBUF选项设置为这个指定的值 DatagramSocket 。

void setSoTimeout(int timeout)

以指定的超时(以毫秒为单位)启用/禁用SO_TIMEOUT。

void setTrafficClass(int tc)

在从该DatagramSocket发送的数据报的IP数据报头中设置流量类别或服务类型的八位字节。

构造方法
Constructor and Description
DatagramPacket(byte[] buf, int length)

构造一个 DatagramPacket用于接收长度的数据包 length 。

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

DatagramPacket(byte[] buf, int offset, int length)

构造一个 DatagramPacket用于接收长度的分组 length ,指定偏移到缓冲器中。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)

构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。

DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

构造用于发送长度的分组数据报包 length具有偏移 ioffset指定主机上到指定的端口号。

DatagramPacket(byte[] buf, int length, SocketAddress address)

构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。

                                                                 方法

Modifier and Type Method and Description
InetAddress getAddress()

返回该数据报发送或接收数据报的计算机的IP地址。

byte[] getData()

返回数据缓冲区。

int getLength()

返回要发送的数据的长度或接收到的数据的长度。

int getOffset()

返回要发送的数据的偏移量或接收到的数据的偏移量。

int getPort()

返回发送数据报的远程主机上的端口号,或从中接收数据报的端口号。

SocketAddress getSocketAddress()

获取该数据包发送到或正在从其发送的远程主机的SocketAddress(通常为IP地址+端口号)。

void setAddress(InetAddress iaddr)

设置该数据报发送到的机器的IP地址。

void setData(byte[] buf)

设置此数据包的数据缓冲区。

void setData(byte[] buf, int offset, int length)

设置此数据包的数据缓冲区。

void setLength(int length)

设置此数据包的长度。

void setPort(int iport)

设置发送此数据报的远程主机上的端口号。

void setSocketAddress(SocketAddress address)

设置该数据报发送到的远程主机的SocketAddress(通常是IP地址+端口号)。

package com;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

// 还是需要客户端的链接
public class UDPServerDemo01 {
    public static void main(String[] args) throws Exception{
        // 1.开放端口
        DatagramSocket socket = new DatagramSocket(9090);

        // 2.接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        socket.receive(packet); // 阻塞接受
        System.out.println(packet.getAddress().getHostAddress());
        System.out.println(new String(packet.getData()));

        // 3.关闭连接
        socket.close();
    }
}
package com;


import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

// 不需要连接服务器
public class UDPClientDemo01 {
    public static void main(String[] args) throws Exception{
        // 1.建立一个Socket
        DatagramSocket socket = new DatagramSocket();

        // 2.建个包
        String msg = "服务器,你好!";
        InetAddress localhost = InetAddress.getByName("localhost");
        int port = 9090;

        // 数据,数据的长度起始,要发送给谁
        DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0,msg.getBytes().length,localhost,port);

        // 3.发送包
        socket.send(packet);

        // 4.关闭流
        socket.close();
    }
}

Java网络编程_第7张图片

 

2.循环发送消息 

package com;


import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPReceiveDemo01 {
    public static void main(String[] args) throws Exception{

        // 开放端口
        DatagramSocket socket = new DatagramSocket(9090);

        while (true) {
            // 准备接收包裹
            byte[] container = new byte[1024];
            DatagramPacket packet = new DatagramPacket(container, 0, container.length);
            socket.receive(packet);

            byte[] data = packet.getData();

            String receiveData = new String(data);

            System.out.println(receiveData);

            if (receiveData.equals("bye")) {
                break;
            }

        }
        // 关闭socket
        socket.close();
    }
}
package com;


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UDPSenderDemo01 {
    public static void main(String[] args) throws Exception{

        DatagramSocket socket = new DatagramSocket(8888);

        // 准备数据:控制台读取
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        while(true) {
            String data = reader.readLine();
            byte[] buffer = data.getBytes();
            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length, new InetSocketAddress("localhost", 9090));
            // 发送包
            socket.send(packet);
            if (data.equals("bye")) {
                break;
            }
        }
        // 关闭socket
        socket.close();
    }
}

Java网络编程_第8张图片Java网络编程_第9张图片

3.在线咨询

两个人都可以是发送方,也可以是接收方(配合多线程) 

输入端 

package com;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class TalkSend implements Runnable {
    DatagramSocket socket = null;
    BufferedReader reader = null;

    private int formPort;
    private String hostname;
    private int    toPort;

    public TalkSend(int formPort, String hostname, int toPort) {

        this.formPort = formPort;
        this.hostname = hostname;
        this.toPort = toPort;

        try {
            socket = new DatagramSocket(formPort);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                String s = reader.readLine();
                byte[] buffer = s.getBytes();
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length,
                        new InetSocketAddress(hostname, toPort));
                // 发送包
                socket.send(packet);
                if (s.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 关闭socket
        socket.close();
    }
}

接收端 

package com;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class TalkReceive implements Runnable{
    DatagramSocket socket = null;

    private int port;
    private String name;

    public TalkReceive(int port,String name) {

        this.port = port;
        this.name = name;

        try {
            socket =  new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        //开放端口
        // 接收包
        while (true){
            try {
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container,0,container.length);
                // 接收
                socket.receive(packet);
                byte[] data = packet.getData();
                String receiveData = new String(data);
                System.out.println(name+ ":" + receiveData);
                if (receiveData.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        socket.close();
    }
}
package com;

public class Teachar {
    public static void main(String[] args) {
        new Thread(new TalkSend(5555,"localhost",9999)).start();
        new Thread(new TalkReceive(6666,"学生")).start();
    }
}
package com;

public class Student {

    public static void main(String[] args) {
        new Thread(new TalkSend(5556,"localhost",6666)).start();
        new Thread(new TalkReceive(9999,"老师")).start();
    }
}

Java网络编程_第10张图片Java网络编程_第11张图片

 

九.URL 

  • https://www.baidu.com

  • 统一资源定位符:定位互联网上的某一个资源

  • DNS域名解析 www.baidu.com —> xxx.xxx.xxxx.xxx…xxx

 

  1. 协议:// ip地址:端口号/项目名/资源
构造方法
Constructor and Description
URL(String spec)

从 String表示形成一个 URL对象。

URL(String protocol, String host, int port, String file)

创建 URL从指定对象 protocol , host , port数,和 file 。

URL(String protocol, String host, int port, String file, URLStreamHandler handler)

创建 URL从指定对象 protocol , host , port数, file和 handler 。

URL(String protocol, String host, String file)

从指定的 protocol名称, host名称和 file名称创建一个URL。

URL(URL context, String spec)

通过在指定的上下文中解析给定的规范来创建一个URL。

URL(URL context, String spec, URLStreamHandler handler)

通过在指定上下文中使用指定的处理程序解析给定规范来创建URL。

                                                                方法 

Modifier and Type Method and Description
boolean equals(Object obj)

将此URL与其他对象进行比较。

String getAuthority()

获取此的授权部分 URL 。

Object getContent()

获取此URL的内容。

Object getContent(类[] classes)

获取此URL的内容。

int getDefaultPort()

获取与此 URL的协议的默认端口号。

String getFile()

获取此 URL的文件名。

String getHost()

获取此 URL的主机名(如适用)。

String getPath()

获取此 URL的路径部分。

int getPort()

获取此 URL的端口号。

String getProtocol()

获取此 URL的协议名称。

String getQuery()

获取此 URL的查询部分。

String getRef()

获取此的锚定(也称为“参考”) URL 。

String getUserInfo()

获取该 URL的userInfo部分。

int hashCode()

创建适合哈希表索引的整数。

URLConnection openConnection()

返回一个URLConnection实例,表示与URL引用的远程对象的URL 。

URLConnection openConnection(Proxy proxy)

与openConnection()相同,但连接将通过指定的代理进行; 不支持代理的协议处理程序将忽略代理参数并进行正常连接。

InputStream openStream()

打开与此 URL ,并返回一个 InputStream ,以便从该连接读取。

boolean sameFile(URL other)

比较两个URL,不包括片段组件。

static void setURLStreamHandlerFactory(URLStreamHandlerFactory fac)

设置应用程序的 URLStreamHandlerFactory 。

String toExternalForm()

构造这个 URL的字符串 URL 。

String toString()

构造此 URL的字符串表示 URL 。

URI toURI()

返回相当于此URL的URI 。

package com;

import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo01 {
    public static void main(String[] args) throws MalformedURLException {
        
        URL url = new URL("https://www.matools.com/api/java8");
        System.out.println(url.getProtocol());  // 协议
        System.out.println(url.getHost());  // 主机IP
        System.out.println(url.getPort());  // 端口
        System.out.println(url.getPath());  // 路径
        System.out.println(url.getFile());  // 文件名
        System.out.println(url.getQuery()); // 参数
    }
}

Java网络编程_第12张图片

 

爬虫 

package com;

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

public class URLDemo02 {
    public static void main(String[] args) throws Exception{
        // 1.下载地址
        URL url = new URL("https://www.matools.com/doc/java8/java/net/URL.html");
        // 2.连接到这个资源 HTTP
        HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
        InputStream is = urlConnection.getInputStream();
        FileOutputStream stream = new FileOutputStream("1.html");
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = is.read(bytes)) != -1){
            stream.write(bytes,0,len);
        }
        stream.close();
        is.close();
        urlConnection.disconnect();
    }
}

 

你可能感兴趣的:(网络,服务器,运维)