Java从入门到精通十三(java网络编程)【上】

简介: java网络编程网络通信的概念我们的计算机网络实现了将不同地理位置上的多台计算机以及相关的外部设备进行连接起来,在网络的操作系统,网络管理软件以及网络通信协议的管理和协调下,实现资源共享以及进行幸喜或者数据传递。

java网络编程

网络通信的概念

我们的计算机网络实现了将不同地理位置上的多台计算机以及相关的外部设备进行连接起来,在网络的操作系统,网络管理软件以及网络通信协议的管理和协调下,实现资源共享以及进行幸喜或者数据传递。



计算机网络编程就是在我们具体的网络通信协议的规则下,进行实现不同计算机上运行程序的一个数据交换或者说是数据通信的一个过程实现。


网络编程的三要素



上面这个三要素也就是我们java网络编程主要围绕的基本要素。



windows可以通过终端命令ipconfig查看本机的ip地址。linux对应的是ifconfig,也可以是ip addr进行查看。


查看网络是否通的话可以用ping命令

特殊的地址是127.0.0.1是本机的回送地址,自己可以进行ping测试。






InetAddress(互联网协议地址类)

首先我们看这个类


public class InetAddressextends Objectimplements Serializable


该类下面还有两个子类,分别是Inet4Address和Inet6Address。我们目前就先用这个InetAddress类。


提供的方法


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()

返回本地主机。

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。


比如我们可以这样取获取主机地址或者主机名


package internet;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Internet_1 {
    public static void main(String[] args) throws UnknownHostException {
        //确定主机地址的ip地址,主机名称可以是机器名称,也可以是ip地址
        InetAddress address = InetAddress.getByName("兰舟千帆一号");
        InetAddress localHost = InetAddress.getLocalHost();
        byte[] address1 = localHost.getAddress();
        String hostName1 = localHost.getHostName();
        System.out.println(localHost);
        String hostAddress = address.getHostAddress();
        //System.out.println(hostAddress);
        String hostName = address.getHostName();
        System.out.println("主机名:"+hostName+"主机地址"+hostAddress);
    }
}


DatagramSocket(数据报包套接字)


DatagramSocket代表数据包套接字,当然这个类也有许多的说明和详细的方法使用。


public class DatagramSocketextends Object


此类表示用来发送和接收数据报包的套接字。


数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。


在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收


这是我们需要主要去了解的信息。我们首先要了解的是这个类具有发送数据和接收数据的功能。可以绑定到主机的端口。


主要的构造方法


DatagramSocket()

构建一个数据报套接字 ,绑定到本地主机的任何可用的端口

DatagramSocket(int port)

构建一个数据报套接字,绑定到本地主机的指定端口

DatagramSocket(int port, InetAddress laddr)

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

DatagramSocket(SocketAddress bindaddr)

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

protected DatagramSocket(DatagramSocketImpl impl)

创建一个绑定的数据报套接字, 与指定的datagramsocketimpl相关(一般不使用)


提供的api方法


InetAddress getInetAddress()

返回此套接字连接的地址

InetAddress getLocalAddress()

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

int getLocalPort()

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

SocketAddress getLocalSocketAddress()

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

int getPort()

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

void close()

关闭该数据报套接字

void connect(InetAddress address, int port)

将套接字连接到这个套接字的远程地址

void connect(SocketAddress addr)

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

void bind(SocketAddress addr)

结合这个DatagramSocket到特定的地址和端口

void disconnect()

断开插座

boolean getBroadcast()

如果so_broadcast启用

DatagramChannel getChannel()

返回与此数据报套接字相关的独特的 DatagramChannel对象,如果任何

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()

获取交通类或类型的服务在IP数据报头的DatagramSocket发送的数据包。

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 数据报头中设置流量类别 (traffic class) 或服务类型八位组 (type-of-service octet)。


DatagramPacket(数据报包)

public final class DatagramPacketextends Object


数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。


主要的构造方法


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 偏移量为 offset 的包发送到指定主机上的指定端口号。

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

构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。

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

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。


提供的api方法


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 地址 + 端口号)。


上面引用了javaapi里面的说明。就部分api说明并构建功能。


udp通信

udp发送数据

package internet;
import java.io.IOException;
import java.net.*;
public class Udp_1 {
    public static void main(String[] args) throws IOException {
        //发送数据
        //创建发送端Socket对象
        DatagramSocket ds = new DatagramSocket();
        //创建数据,将数据打包
        byte[] bys = "Hello,udp".getBytes();//将数据转换为字节
        int length = bys.length;//获取到数据长度
        InetAddress address = InetAddress.getByName("兰舟千帆一号");
//        System.out.println(address);
        int port = 10086;//端口
        //相当于数据包
        DatagramPacket dp = new DatagramPacket(bys,length,address,port);
        ds.send(dp);//发送数据包
        ds.close();//关闭发送端
        //接收数据
        //创建接收端Sockec对象(需要指定一个端口)
    }
}


udp接收数据

package internet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class udp_2 {
    public static void main(String[] args) throws IOException {
        //接收数据
        //创建接收端Sockec对象(需要指定一个端口)
        //接收端端口
        DatagramSocket ds1 = new DatagramSocket(10086);
        //创建数据包,用于接收数据
        byte[] bys1 = new byte[1024];
        DatagramPacket dp_1 = new DatagramPacket(bys1, bys1.length);
        int len = dp_1.getLength();
        ds1.receive(dp_1);
        //解析数据包,并在控制台显示
        byte[] data = dp_1.getData();
        String data_s = new String(data,0,len);
        System.out.println(data_s);
        ds1.close();
    }
}


udp数据通信

这样的话,简单的首先可以定义两个类

发送端


package internet;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class Udp_pratice {
    public static void main(String[] args) throws IOException {
            //创建发送端的Socket对象
        DatagramSocket ds = new DatagramSocket();
        //键盘录入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while((line = br.readLine())!=null)
        {
            if("886".equals(line))
            {
                break;
            }
            byte[] bys = line.getBytes();
            DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("兰舟千帆一号"),10086);
            ds.send(dp);
        }
    }
}


接收端


package internet;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class udp_2 {
    public static void main(String[] args) throws IOException {
        //接收数据
        //创建接收端Sockec对象(需要指定一个端口)
        //接收端端口
        DatagramSocket ds1 = new DatagramSocket(10086);
        //创建数据包,用于接收数据
        byte[] bys1 = new byte[1024];
        DatagramPacket dp_1 = new DatagramPacket(bys1, bys1.length);
        int len = dp_1.getLength();
        while(true)
        {
          ds1.receive(dp_1);
           //解析数据包,并在控制台显示
           byte[] data = dp_1.getData();
           String data_s = new String(data,0,len);
           System.out.println(data_s);
        }
       // ds1.close();
    }
}


这个程序怎么运行呢。其实你可以开启多个发送端,然后进行一个接收端。idea默认是不允许这样开启的,但是这样改一下就好啦!



把下面这个前面的对勾去掉。我用的idea版本比较老,可能不一样的版本设置不太一样。



这样运行就有两个发送端,一个接收端。





你这样开启两个终端,分别写数据,然后接收端都可以收到。



加粗样式


相关文章
|
2月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
72 11
|
30天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
101 60
|
2月前
|
JSON Dart 前端开发
鸿蒙应用开发从入门到入行 - 篇7:http网络请求
在本篇文章里,您将掌握鸿蒙开发工具DevEco的基本使用、ArkUI里的基础组件,并通过制作一个简单界面掌握使用
81 8
|
2月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
89 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
机器学习/深度学习 资源调度 算法
图卷积网络入门:数学基础与架构设计
本文系统地阐述了图卷积网络的架构原理。通过简化数学表述并聚焦于矩阵运算的核心概念,详细解析了GCN的工作机制。
148 3
图卷积网络入门:数学基础与架构设计
|
2月前
|
Web App开发 网络协议 安全
网络编程懒人入门(十六):手把手教你使用网络编程抓包神器Wireshark
Wireshark是一款开源和跨平台的抓包工具。它通过调用操作系统底层的API,直接捕获网卡上的数据包,因此捕获的数据包详细、功能强大。但Wireshark本身稍显复杂,本文将以用抓包实例,手把手带你一步步用好Wireshark,并真正理解抓到的数据包的各项含义。
127 2
|
2月前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
2月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
99 3
|
3月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
69 13
|
3月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。