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天前
|
网络协议 网络安全 数据中心
|
3天前
|
存储 安全 Java
Java的基础入门(2)
Java的基础入门(2)
|
3天前
|
Java
|
3天前
|
XML Java 程序员
|
10天前
|
传感器 数据采集 监控
Java串口编程入门
Java串口编程入门
|
10天前
|
网络协议 安全 Java
Java中的网络编程:Socket编程详解
Java中的网络编程:Socket编程详解
|
9天前
|
监控 安全 网络安全
|
9天前
|
安全 Java 网络安全
Java网络编程:高级应用与安全性探讨
Java网络编程:高级应用与安全性探讨
|
11天前
|
缓存 Java 数据库连接
使用Java构建一个高并发的网络服务
使用Java构建一个高并发的网络服务
|
11天前
|
网络协议 Java
深入理解Java中的网络编程模型
深入理解Java中的网络编程模型