Socket UDP上报读取对象

以下用UDP发送对象展示用户登录逻辑,代码如下:

服务端代码:

public class UDPServiceObject {

    public static void main(String[] args) throws ClassNotFoundException {

        try {
            //创建服务端DatagramSocket并指定接口
            DatagramSocket socket = new DatagramSocket(8888);

            //创建数据报,用于接收从客户端发送过来的数据
            byte[] data = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
            System.out.println("******I am is Service, wait Client input.******");

            //接收客户端发送的数据
            socket.receive(datagramPacket);

            //System.out.println("=====" + new String(datagramPacket.getData()));
            ByteArrayInputStream bInputStream = new ByteArrayInputStream(data);

            ObjectInputStream oStream =new ObjectInputStream(bInputStream);
            User user =  (User) oStream.readObject();
            System.out.println("client say username:"+user.getUsername()+", password:"+user.getPassword());

            //回复客户端对象
            //组装回复的数据
            ByteArrayOutputStream bOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream outputStream = new ObjectOutputStream(bOutputStream);
            Result result = new Result(1, "login sucess.");

            outputStream.writeObject(result);

            byte[] outputData = new byte[1024];
            outputData = bOutputStream.toByteArray();
            outputStream.close();
            bOutputStream.close();

            //回复客户端消息
            //System.out.println("hostAddress:"+socket.getInetAddress());
            InetAddress address = datagramPacket.getAddress();
            int port = datagramPacket.getPort();
            System.out.println("address:"+address.getHostName()+",port:"+port);
            DatagramPacket packet = new DatagramPacket(outputData, outputData.length, address, port);

            //发送回复内容
            socket.send(packet);
            System.out.println("reply Client success.");            

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

客户端代码:

public class UDPClientObject {

    public static void main(String[] args) throws ClassNotFoundException {

        try {

            User user = new User("admin","123456");
            //此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。
            //可使用 toByteArray() 和 toString() 获取数据
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream);
            stream.writeObject(user);
            stream.flush();
            stream.close();

            byte[] data = new byte[1024];
            data = byteArrayOutputStream.toByteArray();
            byteArrayOutputStream.close();

            //创建DatagramPacket,饮食将要发送的信息,包含发送的ip地址和端口号
            InetAddress address = InetAddress.getByName("localhost");
            int prot = 8888;
            DatagramPacket packet = new DatagramPacket(data,data.length,address,prot);

            //创建DatagramSocket
            DatagramSocket socket = new DatagramSocket();

            //发送报文内容
            socket.send(packet);
            System.out.println("*******I am is Client, send success.*******");

            //接收服务端返回的响应内容
            //System.out.println("port1:"+packet.getPort()+", port2:"+socket.getPort()+",port3:"+socket.getLocalPort());
            //创建接收的pcket
            byte[] replyData = new byte[1024];  
            DatagramPacket packet2 = new DatagramPacket(replyData,replyData.length);

            socket.receive(packet2);
            //System.out.println("=====" + new String(packet2.getData()));

            ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(replyData);
            ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
            Result result = (Result)objectInputStream.readObject();
            System.out.println("Service say code:"+result.getCode()+",message:"+result.getMessage());

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }       
    }
}

两个实体类:

user.java

public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    private String username;

    private String password;

    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

}

result.java

public class Result implements Serializable {

    private int code;

    private String message;

    public Result(int code, String message) {
        super();
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

执行效果:

这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值