Java网络编程知识整理

一、网络协议

java.net 包中提供了两种常见的网络协议的支持:

TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

UDP:UDP 是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

二、InetAddress类

该类的实例包含IP地址,还可能包含相应的主机名称。以下是其中的一些常用方法的学习。

//static InetAddress getLocalHost() 返回本地主机
@Test
public void test_01() throws  Exception{
    InetAddress localHost = InetAddress.getLocalHost();
    //打印结果为 计算机全名/IP地址
    System.out.println(localHost);
}
//获取主机IP地址、获取主机名
@Test
public void test_02() throws  Exception{
    InetAddress localHost = InetAddress.getLocalHost();
    //获取IP地址
    String hostAddress = localHost.getHostAddress();
    System.out.println(hostAddress);
    //获取主机名
    String hostName = localHost.getHostName();
    System.out.println(hostName);
}
//static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
@Test
public void test_03() throws Exception{
    //这里填的是我自己的计算机名称
    InetAddress inetAddress = InetAddress.getByName("91BYBAQ2869O8A9");
    System.out.println(inetAddress);
}

三、UDP通信

在Java中提供了类DatagramPacket与类DatagramScoket收发数据包。(要先运行接收端,在运行发送端)

//UDP发送端
public class UDPSendDemo {

    public static void main(String[] args) throws Exception{
        //创建InetAddress对象,封装IP(让自己的电脑即作为发送端又作为接收端)
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        //准备发送数据
        byte[] data = "Hello UDP!".getBytes();
        //创建DatagramPacket对象,封装数据与接收端的地址与端口号
        //构造方法DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
        DatagramPacket dp = new DatagramPacket(data, data.length, inet, 6100);
        //创建DatagramSocket,此类对象既能接收数据,也能发送数据包,这里是有它发送数据包
        DatagramSocket socket = new DatagramSocket();
        //发送数据包
        socket.send(dp);
        //关闭资源
        socket.close();
    }
}


//UDP接收端
public class UDPReceiveDemo {
    public static void main(String[] args) throws Exception{
        //创建DatagramSocket对象,绑定发送端所发送的端口号
        DatagramSocket socket = new DatagramSocket(6100);
        //创建接收数据的字节数据
        byte[] data = new byte[1024];
        //创建DatagramPacket对象
        DatagramPacket dp = new DatagramPacket(data, data.length);
        //调用DatagramSocket对象的方法receive(DatagramPacket dp)将数据放入数据包中
        socket.receive(dp);

        //获取发送端数据的字节个数
        int length = dp.getLength();
        //打印接收的数据
        System.out.println(new String(data,0,length));

        //获取发送端的IP地址
        String hostAddress = dp.getAddress().getHostAddress();
        System.out.println(hostAddress);

        //获取发送端的端口号
        int port = dp.getPort();
        System.out.println(port);

        //关闭资源
        socket.close();
    }
}

四、TCP通信

在Java中提供了ServerSocket类,表示服务器端套接字,Socket类,表示客户端套接字。

以下步骤在两台计算机之间使用套接字建立TCP连接时会出现:

1.服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

2.服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

3.服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

4.Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

5.在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/O 流进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

例:(服务器端要先启动,等待客户端连接)

//TCP服务器
public class TCPServer {

    public static void main(String[] args) throws Exception{
        //创建ServerSocket对象,构造方法 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
        ServerSocket serverSocket = new ServerSocket(6100);
        //调用  accept()方法,获取客户端Socket对象
        Socket socket = serverSocket.accept();
        //通过Socket对象 获取字节输入流,读取客户端发送的数据
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));

        //服务器向客户端发送数据,通过Socket套接字对象获取字节输出流
        OutputStream out = socket.getOutputStream();
        out.write("你好 客户端!".getBytes());

        //关闭资源
        socket.close();
        serverSocket.close();
    }
}


//TCP客户端
public class TCPClient {

    public static void main(String[] args) throws Exception{
        //Socket类的构造方法  Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
        //此构造方法只要运行,就会与服务器建立连接,如果连接失败,就会抛出异常
        Socket socket = new Socket("127.0.0.1", 6100);
        //获取套接字的输出流,将数据输出到服务器
        OutputStream out = socket.getOutputStream();
        out.write("你好 服务器!".getBytes());

        //获取服务器发送的数据,通过Socket对象获得字节输入流
        InputStream in = socket.getInputStream();
        byte[] data = new byte[1024];
        int len = in.read(data);
        System.out.println(new String(data,0,len));
        //关闭资源
        socket.close();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值