当前位置:   article > 正文

JavaSE -网络编程

JavaSE -网络编程

什么是网络编程?

在网络通信协议下,不同计算机上运行的程序,进行的数据传输。

常见的软件架构

C/S : 客户端/服务器
B/S : 浏览器/服务器

网络编程三要素

IP、端口号、协议
IP :设备在网络中的地址,是唯一的标识
端口号 :应用程序在设备中的唯一标识
协议 : 数据在网络中的传输规则,常见的协议有 UDP ,TCP , http 等

UDP 通信程序

发送方

  1. 创建发送方 DatagramSocket 对象
  2. 数据打包(DatagramPacket)
  3. 发送数据
  4. 释放资源

接收方

  1. 创建接收端的 DatagramSocket 对象
  2. 接收打包好的数据
  3. 解析数据包
  4. 释放资源

UDP 代码示例 (聊天室)

要求:

  1. UDP发送数据,数据来自键盘录入,直到输入的数据是886, 发送数据结束
  2. UDP接收数据,因为接收端不知道发送端什么时候停止发送,故采用死循环接受数据

Send代码块:

public class Send {
    public static void main(String[] args) throws IOException {
        // 1.创建DatagramSocket发送对象
        DatagramSocket ds = new DatagramSocket();

        // 2.打包数据
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("please input your message");
            String str = sc.nextLine();
            if("886".equals(str)){
                break;
            }
            byte[] bytes = str.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");

            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

            // 3.发送数据
            ds.send(dp);
        }

        // 4.释放资源
        ds.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Receive代码块:

public class Receive {
    public static void main(String[] args) throws IOException {
        // 1. 创建 DatagramSocket 对象
        DatagramSocket ds = new DatagramSocket(10086);

        // 2. 接受数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        while (true) {
            ds.receive(dp);

            // 3. 解析数据包
            byte[] data = dp.getData();
            int len = dp.getLength();

            String ip = dp.getAddress().getHostName();
            String name = dp.getAddress().getHostAddress();

            System.out.println("ip 为 :" + ip + "主机名为 : " + name + "的人发送了数据 :" + new String(data, 0, len));
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

注意

  1. DatagramSocket 类用于创建用于发送和接收数据报(datagram)的套接字(socket)。DatagramSocket 类提供了发送和接收数据报的机制。
  2. DatagramPacket 类表示数据报包,它是一个容器,用于保存要发送或接收的数据。数据报包包括数据、目的地址和端口号。

UDP的三种通信方式

  1. 单播:向指定的IP地址传输数据
  2. 组播:向一组IP地址传输数据,组播地址:224.0.0.0 - 239.255.255.255
  3. 广播:广播地址:255.255.255.255

TCP通信协议

TCP通信协议是一种可靠的网络协议,它在通信两端各建立一个Socket对象,通信之前要确保连接已经建立,通过Socket 产生 IO 流 来进行网络通信

客户端

  1. 创建客户端的Socket对象与指定服务器连接 Socket(String host, int port)
  2. 获取输出流,写数据 OutputStream getOutputStream()
  3. 释放资源 void close()

服务器

  1. 创建服务器端的Socket对象(ServerSocket) ServerSocket(int port)
  2. 监听客户端连接,返回一个Socket 对象 Socket accept()
  3. 获取输出流,读数据,并把数据显示在控制台上 InputStream getInputStream()
  4. 释放资源 void close()

TCP 代码示例

服务器端(Server):

public class Server {
    public static void main(String[] args) throws IOException {
        // TCP 协议 : 接受对象

        // 1. 创建对象 ServerSocket
        ServerSocket ss = new ServerSocket(50000);

        // 2. 监听客户端的连接
        Socket socket = ss.accept();

        // 3. 从连接通道中获取输入流读取数据
        InputStream is = socket.getInputStream();
        // 字节流转化为字符流
        InputStreamReader isr = new InputStreamReader(is);
        // 字符流转化为缓冲流
        BufferedReader br = new BufferedReader(isr);
        int b;
        while ((b = br.read()) != -1){
            System.out.println((char)b);
        }

        // 4. 释放资源
        socket.close();
        ss.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

客户端(Client) :

public class Client {
    public static void main(String[] args) throws IOException {
        // TCP 协议 :发送数据

        // 1. 创建 Socket 对象
        // 细节:在创建对象的同时会连接服务器,如果连不上,则会报错
        Socket socket = new Socket("127.0.0.1",50000);

        // 2. 可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        // 写出数据
        os.write("你好你好".getBytes());

        // 3. 释放资源
        os.close();
        socket.close();

    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/745171
推荐阅读
相关标签
  

闽ICP备14008679号