会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132454个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 1622楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 1623楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 1624楼

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpReceiver extends Thread {
//接收客户端消息的线程
    private DatagramSocket datagramSocket;
    private int port;
    public UdpReceiver(DatagramSocket datagramSocket,int  port){
        this.datagramSocket = datagramSocket;
        this.port = port;
    }
    @Override
    public void run() {
        this.udpReceive();
    }
    //实现接收信息
    public void udpReceive(){
        //创建服务端接收数据的DatagramSocket 对象
        try {
            datagramSocket = new DatagramSocket(this.port);
            //创建数据缓存区
            byte [] bytes = new byte[1024];
            //创建数据报包对象
            UdpChatRoom.dp = new DatagramPacket(bytes,bytes.length);
            //等待接收客户端所发送的数据
            try {
                synchronized (UdpChatRoom.dp){
                    datagramSocket.receive(UdpChatRoom.dp);
                    //唤醒线程
                    UdpChatRoom.dp.notifyAll();
                    String str = new String(UdpChatRoom.dp.getData(),0,UdpChatRoom.dp.getLength());
                    System.out.println(str);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
}

public class UdpSend extends Thread {
    //向客户端发送消息的线程
    private DatagramPacket datagramPacket;
    private DatagramSocket datagramSocket;
    private String destIp;//目标IP地址
    private int desPort;//目标端口
    private Scanner scanner;

    public UdpSend(DatagramSocket datagramSocket, DatagramPacket datagramPacket, String destIp, int desPort, Scanner scanner) {
        this.datagramSocket = datagramSocket;
        this.datagramPacket = datagramPacket;
        this.destIp = destIp;
        this.desPort = desPort;
        this.scanner = scanner;
    }

    @Override
    public void run() {
        this.sendMsg();
    }

    //向客户端发送消息
    public void sendMsg() {
        while (true) {
            //消息需要进行转换转换成字符数组
            scanner = new Scanner(System.in);
            String sendMsg = scanner.nextLine();
            byte[] bytes = sendMsg.getBytes();
            //创建数据报包装对象DatagramPacket
            this.datagramPacket = new DatagramPacket(bytes, bytes.length, new InetSocketAddress(this.destIp, this.desPort));
            //将数据包放入公共数据区
            UdpChatRoom.dp = datagramPacket;
            //创建数据发送对象DatagramSocket,需要指定消息的发送端口
            try {
                this.datagramSocket = new DatagramSocket(8888);
                synchronized (datagramPacket){
                     //让发送消息的线程处于等待状态
                    datagramPacket.wait();
                    //从公共数据区取出包发送给客户端
                    this.datagramSocket.send(UdpChatRoom.dp);
                }

            } catch (SocketException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                try {
                    if (datagramSocket != null) {
                        datagramSocket.close();
                    }
                    if (datagramPacket != null) {
                        datagramSocket.close();
                    }
                    if (scanner != null) {
                        scanner.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Scanner;

public class UdpChatRoom {
    //udp一对多聊天室
    //存放公共的信息
    public static DatagramPacket dp;

    public static void main(String[] args) {
        try {

            DatagramSocket datagramSocket = new DatagramSocket(8888);
            new UdpReceiver(datagramSocket,9999).start();
            new UdpSend(datagramSocket,UdpChatRoom.dp,"127.0.0.1",8888,new Scanner(System.in)).start();
        } catch (SocketException e) {
            e.printStackTrace();
        }

    }
}

老师这是我用udp写的哪个多人聊天,看看哪里有错误

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 1626楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1627楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程技术(旧) 1629楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1631楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/IO 流技术(旧) 1633楼

User 类:

public class User {

    private String userName;
    private int userAge;
    public String location;

    public User() {
    }

    public User(String userName, int userAge, String location) {
        this.userName = userName;
        this.userAge = userAge;
        this.location = location;
    }

    // private modifier
    private User(int userAge) {
        this.userAge = userAge;
    }

     /*only the name is different, can not constitute an overload,
     so it can not add the constructor that only have a location parameter.*/
    public  User(String userName) {
        this.userName = userName;
    }

    public User(String userName, String location) {
        this.userName = userName;
        this.location = location;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public void testMethod () {
        System.out.println("hello!");
    }

    private void testWay () {
        System.out.println("overload");
    }

    public void testWay (int id) {
        System.out.println(id);
    }

    @Override
    public String toString() {
        /* Considering code writing from the bottom level, in order to cope with different functional requirements */
        return "User{" +
                "userName='" + this.getUserName()+ '\'' +
                ", userAge=" + this.getUserAge()+
                ", location='" + this.getLocation() + '\'' +
                '}';
    }
}

通过反射调用方法测试类:

public class GetMethodTest02 {

    public static void main(String[] args) {
        User user01 = new User();
        Class classObject01 = user01.getClass();

        Class classObject02 = User.class;

        Class classObject03 = null;
        try {
            classObject03 = Class.forName("com.bjsxt.demo.User");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        /* call the public method */
        Method method01 = null;
        try {
            method01 = classObject03.getDeclaredMethod("testWay",int.class);   // get designed method object.
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        Object user02 = null;
        try {
            user02 = classObject03.newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        try {
            method01.invoke(user02,3);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }

        // how call the private method?

    }
}

老师,在调用方法的测试类中,如何调用自定义的用 private 修饰的 testWay() 方法?还是说通过反射只能调用类的 public 方法,不能调用 pirvate 的方法.

JAVA 全系列/第二阶段:JAVA 基础深化和提高/反射技术(旧) 1634楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/XML 技术(旧) 1635楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637