廖雪峰Java13网络编程-1Socket编程-5UDP编程

1. UDP编程:

  • 不需要建立连接
  • 可以直接发送和接收数据

1.1 客户端

    DatagramSocket sock = new DatagramSocket(){}
    sock.connect(addr,9090);//并不建立连接
    //接收
    byte[] data=...;
    DatagramPacket packet = new DatagramPacket(data, data.length);
    sock.send(packet);
    //发送
    byte[] buffer = new byte[1024];
    DatagramPacket resp = new DatagramPacket(buffer, buffer.length);
    sock.receive(resp);
    //接收和发送都是通过DatagramPacket实现的

1.2 服务端:

    DatagramSocket ds = new DatagramSocket(9090);
    for( ; ; ){
        //接收
        byte[] buffer = new buffer[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        ds.receive(packet);
        //发送
        byte[] data = ...;
        packet.setData(data);
        ds.send(packet);
    }

1.3 实例

TCPClient.java

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

public class UDPClient {
    public static void main(String[] args) throws Exception{
        InetAddress addr = InetAddress.getLoopbackAddress();
        try(DatagramSocket sock = new DatagramSocket()){
            sock.connect(addr,9090);
            byte[] data = "time".getBytes(StandardCharsets.UTF_8);
            DatagramPacket packet = new DatagramPacket(data,data.length);
            sock.send(packet);
            System.out.println("Data was sent");
            Thread.sleep(1000);
            byte[] buffer = new byte[1024];
            DatagramPacket resp = new DatagramPacket(buffer,buffer.length);
            sock.receive(resp);
            byte[] respData = resp.getData();
            String respText = new String(respData,0,resp.getLength());
            System.out.println("Response:"+respText);
        }
    }
}

TCPServer.java

package com.crazy;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;

public class UDPServer {
    public LocalDateTime currentTime(){
        return LocalDateTime.now();
    }
    public static void main(String[] args) throws Exception{
        DatagramSocket ds = new DatagramSocket(9090);
        System.out.println("UDP server ready");
        for(;;){
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
            ds.receive(packet);
            byte[] data = packet.getData();
            String s = new String(data, StandardCharsets.UTF_8);
            System.out.println("Pack received from : "+packet.getSocketAddress());
            String resp = LocalDateTime.now().toString();
            packet.setData(resp.getBytes(StandardCharsets.UTF_8));
            ds.send(packet);
        }
    }
}

先运行server
1418970-20190707134830942-1291236308.png
再运行client
1418970-20190707134920165-844565589.png

2. 总结:

UDP编程模型:

  • 客户端使用DatagramSocket.connect()指定远程地址和端口
  • 服务器端用DatagramSocket(port)监听端口
  • 双方通过receive/send读写数据
  • 没有IO流接口

转载于:https://www.cnblogs.com/csj2018/p/11146148.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值