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版本比较老,可能不一样的版本设置不太一样。



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





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



加粗样式


相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
1月前
|
监控 安全 数据安全/隐私保护
智能家居安全入门:保护你的网络家园
本文旨在为初学者提供一份简明扼要的指南,介绍如何保护自己的智能家居设备免受网络攻击。通过分析智能家居系统常见的安全漏洞,并提供实用的防御策略,帮助读者建立起一道坚固的数字防线。
|
16天前
|
弹性计算 人工智能 运维
Terraform从入门到实践:快速构建你的第一张业务网络(上)
本次分享主题为《Terraform从入门到实践:快速构建你的第一张业务网络》。首先介绍如何入门和实践Terraform,随后演示如何使用Terraform快速构建业务网络。内容涵盖云上运维挑战及IaC解决方案,并重磅发布Terraform Explorer产品,旨在降低使用门槛并提升用户体验。此外,还将分享Terraform在实际生产中的最佳实践,帮助解决云上运维难题。
83 1
Terraform从入门到实践:快速构建你的第一张业务网络(上)
|
17天前
|
开发框架 IDE Java
java制作游戏,如何使用libgdx,入门级别教学
本文是一篇入门级教程,介绍了如何使用libgdx游戏开发框架创建一个简单的游戏项目,包括访问libgdx官网、设置项目、下载项目生成工具,并在IDE中运行生成的项目。
34 1
java制作游戏,如何使用libgdx,入门级别教学
|
8天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
13 2
|
1月前
|
域名解析 网络协议 应用服务中间件
网络编程入门如此简单(四):一文搞懂localhost和127.0.0.1
本文将以网络编程入门者视角,言简意赅地为你请清楚localhost和127.0.0.1的关系及区别等。
52 2
网络编程入门如此简单(四):一文搞懂localhost和127.0.0.1
|
19天前
|
安全 网络协议 Java
Java 网络编程详解
《Java网络编程详解》深入浅出地讲解了使用Java进行网络编程的技术和方法。从基础的网络协议介绍到核心的Socket编程,以及高级的NIO与多线程应用,帮助读者全面掌握Java网络编程技能,是Java开发者不可或缺的学习指南。
|
17天前
|
机器学习/深度学习 PyTorch 算法框架/工具
深度学习入门案例:运用神经网络实现价格分类
深度学习入门案例:运用神经网络实现价格分类
|
26天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门与实践
【8月更文挑战第62天】本文以浅显易懂的方式介绍了深度学习领域中的核心技术之一——卷积神经网络(CNN)。文章通过生动的比喻和直观的图示,逐步揭示了CNN的工作原理和应用场景。同时,结合具体的代码示例,引导读者从零开始构建一个简单的CNN模型,实现对图像数据的分类任务。无论你是深度学习的初学者还是希望巩固理解的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
1月前
|
Java 程序员 UED
Java中的异常处理:从入门到精通
【9月更文挑战第23天】在Java编程的世界中,异常是程序执行过程中不可避免的事件,它们可能会中断正常的流程并导致程序崩溃。本文将通过浅显易懂的方式,引导你理解Java异常处理的基本概念和高级技巧,帮助你编写更健壮、更可靠的代码。我们将一起探索如何捕获和处理异常,以及如何使用自定义异常来增强程序的逻辑和用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供有价值的见解和实用的技巧。
35 4