问题描述

在网络编程UDP中多开客户端出现异常

Exception in thread "main" java.net.BindException: Address already in use: bind

问题分析

客户端代码

package com.itheima.d3_udp2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 目标:完成UDP通信快速入门:实现1发1收。
 */
public class Client {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象
        DatagramSocket client = new DatagramSocket(7777);
        // 2.封装要发送的数据
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入需要发送的数据:");
            String str = sc.nextLine();
            if ("exit".equals(str)) {
                client.close();
                break;
            }
            byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(""), 6666);
            client.send(datagramPacket);
            System.out.println("发送完毕");
        }
    }
}

服务端代码

package com.itheima.d3_udp2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * 目标:完成UDP通信快速入门-服务端开发
 */
public class Server {
    public static void main(String[] args) throws Exception {
        //1.创建服务对象
        DatagramSocket server = new DatagramSocket(6666);
        byte[] bytes = new byte[64*1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
        //接收数据
        while (true) {
            server.receive(datagramPacket);
            int length = datagramPacket.getLength();//获取数据长度
            System.out.println(new String(bytes,0,length));
            System.out.println("ip地址:"+datagramPacket.getAddress().getHostAddress());
            System.out.println("客户端使用端口:"+datagramPacket.getPort());
            // String s = new String(bytes);
            // System.out.println(s.trim());
            //释放资源
            // server.close();
        }
    }
}

因为上边代码客户端指定了端口,多开客户端口己经被占用所以报错

解决方案

将客户端代码修改

package com.itheima.d3_udp2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * 目标:完成UDP通信快速入门:实现1发1收。
 */
public class Client {
    public static void main(String[] args) throws Exception {
        //1. 创建DatagramSocket对象
        DatagramSocket client = new DatagramSocket();
        // 2.封装要发送的数据
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入需要发送的数据:");
            String str = sc.nextLine();
            if ("exit".equals(str)) {
                client.close();
                break;
            }
            byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName(""), 6666);
            client.send(datagramPacket);
            System.out.println("发送完毕");
        }
    }
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐