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月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
316 0
|
3月前
|
Java
java入门代码示例
本文介绍Java入门基础,包含Hello World、变量类型、条件判断、循环及方法定义等核心语法示例,帮助初学者快速掌握Java编程基本结构与逻辑。
424 0
|
4月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
|
4月前
|
安全 Java 数据库连接
2025 年最新 Java 学习路线图含实操指南助你高效入门 Java 编程掌握核心技能
2025年最新Java学习路线图,涵盖基础环境搭建、核心特性(如密封类、虚拟线程)、模块化开发、响应式编程、主流框架(Spring Boot 3、Spring Security 6)、数据库操作(JPA + Hibernate 6)及微服务实战,助你掌握企业级开发技能。
670 3
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
196 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
221 1
|
2月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
365 0
|
3月前
|
前端开发 Java 数据库连接
帮助新手快速上手的 JAVA 学习路线最详细版涵盖从入门到进阶的 JAVA 学习路线
本Java学习路线涵盖从基础语法、面向对象、异常处理到高级框架、微服务、JVM调优等内容,适合新手入门到进阶,助力掌握企业级开发技能,快速成为合格Java开发者。
573 3
|
4月前
|
NoSQL Java 关系型数据库
Java 从入门到进阶完整学习路线图规划与实战开发最佳实践指南
本文为Java开发者提供从入门到进阶的完整学习路线图,涵盖基础语法、面向对象、数据结构与算法、并发编程、JVM调优、主流框架(如Spring Boot)、数据库操作(MySQL、Redis)、微服务架构及云原生开发等内容,并结合实战案例与最佳实践,助力高效掌握Java核心技术。
447 1
|
4月前
|
Java 测试技术 API
Java IO流(二):文件操作与NIO入门
本文详解Java NIO与传统IO的区别与优势,涵盖Path、Files类、Channel、Buffer、Selector等核心概念,深入讲解文件操作、目录遍历、NIO实战及性能优化技巧,适合处理大文件与高并发场景,助力高效IO编程与面试准备。

热门文章

最新文章