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



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





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



加粗样式


相关文章
|
18天前
|
监控 安全 数据安全/隐私保护
智能家居安全入门:保护你的网络家园
本文旨在为初学者提供一份简明扼要的指南,介绍如何保护自己的智能家居设备免受网络攻击。通过分析智能家居系统常见的安全漏洞,并提供实用的防御策略,帮助读者建立起一道坚固的数字防线。
|
5天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习入门:理解卷积神经网络(CNN)
【9月更文挑战第14天】本文旨在为初学者提供一个关于卷积神经网络(CNN)的直观理解,通过简单的语言和比喻来揭示这一深度学习模型如何识别图像。我们将一起探索CNN的基本组成,包括卷积层、激活函数、池化层和全连接层,并了解它们如何协同工作以实现图像分类任务。文章末尾将给出一个简单的代码示例,帮助读者更好地理解CNN的工作原理。
21 7
|
19天前
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
62 6
|
19天前
|
算法 Java 开发者
Java 编程入门:从零到一的旅程
本文将带领读者开启Java编程之旅,从最基础的语法入手,逐步深入到面向对象的核心概念。通过实例代码演示,我们将一起探索如何定义类和对象、实现继承与多态,并解决常见的编程挑战。无论你是编程新手还是希望巩固基础的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
8天前
|
Java 程序员
Java中的异常处理:从入门到精通
在Java编程的世界中,异常处理是保持程序稳定性和可靠性的关键。本文将通过一个独特的视角—把异常处理比作一场“捉迷藏”游戏—来探讨如何在Java中有效管理异常。我们将一起学习如何识别、捕捉以及处理可能出现的异常,确保你的程序即使在面对不可预见的错误时也能优雅地运行。准备好了吗?让我们开始这场寻找并解决Java异常的冒险吧!
|
10天前
|
机器学习/深度学习 人工智能 TensorFlow
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
11 0
|
19天前
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
42 0
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将引导你走进深度学习的核心组件之一——卷积神经网络(CNN),并带你一探其背后的奥秘。通过简明的语言和直观的代码示例,我们将一起构建一个简易的CNN模型,理解它在图像处理领域的应用,并探索如何利用Python和TensorFlow实现它。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
19天前
|
Java 程序员 UED
Java 中的异常处理:从入门到精通
【8月更文挑战第31天】在Java编程的世界中,异常处理是保持应用稳定性的重要机制。本文将引导你理解异常的本质,学会如何使用try-catch语句来捕获和处理异常,并探索自定义异常类的魅力。我们将一起深入异常的世界,让你的代码更加健壮和用户友好。
|
19天前
|
Java 前端开发 Apache
Apache Wicket与Spring MVC等Java Web框架大PK,究竟谁才是你的最佳拍档?点击揭秘!
【8月更文挑战第31天】在Java Web开发领域,众多框架各具特色。Apache Wicket以组件化开发和易用性脱颖而出,提高了代码的可维护性和可读性。相比之下,Spring MVC拥有强大的生态系统,但学习曲线较陡;JSF与Java EE紧密集成,但在性能和灵活性上略逊一筹;Struts2虽成熟,但在RESTful API支持上不足。选择框架时还需考虑社区支持和文档完善程度。希望本文能帮助开发者找到最适合自己的框架。
27 0