02 Java Socket InetAddress类 Socket DatagramPacket TCP、UDP示例


java.net :为实现网络应用程序提供类。

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 地址的哈希码。
String toString() : 将此 IP 地址转换为 String。
public class Inet_Address {
    public static void main(String[] args) throws UnknownHostException {
        InetAddress address1 = InetAddress.getByName("www.baidu.com");
        System.out.println(address1.getAddress() + " " + address1.getHostName() + " " + address1.getHostAddress() + " " + address1.getCanonicalHostName());
        System.out.println();
    }
}

执行结果:

[B@1b6d3586 www.baidu.com 182.61.200.7 182.61.200.7

Socket

  • 两个Java应用程序可通过一个双向的网络的网络通信连接实现数据交换,双向链路的一端称为一个Socket。
  • Socket通常用来实现client-server连接。
  • java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接的Client和Server端。
  • 建立连接时所需的寻址信息为远程计算机的IP地址和端口号。

ServerSocket

ServerSocket是阻塞式的,启动后就一直等待客户端连接。

TCP协议 server client示例

Server端

public class TCPServer {
    public static void main(String[] args) throws Exception {
        //通过6666端口监听客户端连接
        ServerSocket ss = new ServerSocket(6666);
        //ServerSocket是阻塞式的,启动后就一直等待客户端连接。
        while (true) {
            //accept()允许(等待)一个客户端连接
            Socket sClient = ss.accept();
            System.out.println("client connect success!");
            //数据输入流允许应用程序以与机器无关方式从基础输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
            DataInputStream dis = new DataInputStream(sClient.getInputStream());
            //readUTF 阻塞式
            System.out.println(dis.readUTF());
            //给客户端发信息
            OutputStream os = sClient.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF("客户端IP地址:"+sClient.getInetAddress()+"端口:"+sClient.getPort());
            dos.flush();
            Thread.sleep(3000);
            dis.close();
            dos.close();
            sClient.close();
        }
    }
}

Client 端

public class TCPClient {
    public static void main(String[] args) throws Exception {
        Socket s = new Socket("127.0.0.1", 6666);
        OutputStream os = s.getOutputStream();
        //数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
        DataOutputStream out = new DataOutputStream(os);
        Thread.sleep(3000);
        out.writeUTF("hello server!");
        //调用flush()方法只是将数据写入操作系统缓存中,并不保证数据会立即发送
        out.flush();
        //接收客户端地址
        InputStream is = s.getInputStream();
        DataInputStream dis = new DataInputStream(is);
        System.out.println(dis.readUTF());
        out.close();
        dis.close();
        s.close();
    }
}

执行结果

先启动服务端,在启动客户端
在这里插入图片描述
在这里插入图片描述

UDP协议 server client示例

UDP协议 严格意义上UDP不存在Server和Client

server端

public class UDPServer {
    public static void main(String[] args) throws Exception{
        byte buf[] = new byte[1024];
        //接受一个数据包存入Buf[]中
        DatagramPacket dp = new DatagramPacket(buf, buf.length);
        //构造数据报套接字 绑定端口 准备接受数据报
        DatagramSocket ds = new DatagramSocket(5555);
        while(true)
        {
            //从此套接字接收数据报包
            ds.receive(dp);
            ByteArrayInputStream ByteArrayInputStream = new ByteArrayInputStream(buf);
            DataInputStream dis = new DataInputStream(ByteArrayInputStream);
            System.out.println(dis.readLong());
            System.out.println(dp.getAddress()+"..."+dp.getPort());

        }

    }
}

client端

public class UDPClient {
    public static void main(String[] args) throws Exception{
        long n = 10000L;
        ByteArrayOutputStream bas = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(bas);
        dos.writeLong(n);

        byte[] buf = bas.toByteArray();
        System.out.println(buf.length);

        DatagramPacket dp = new DatagramPacket(buf, buf.length,
                new InetSocketAddress("127.0.0.1", 5555)
        );
        //Client 使用UDP的6666端口向服务端发数据  如果不指定端口,客户端将随机占用一个端口号
        DatagramSocket ds = new DatagramSocket(6666);
        ds.send(dp);
        ds.close();

    }
}

执行结果

在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EngineerForSoul

你的鼓励是我孜孜不倦的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值