Java的TCP/IP编程学习--简单的UDP应用程序和回馈服务器

一、简单的UDP服务器

循环接收数据报文并返回给客户端

package main;

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

/**
 * @ClassName UDPEchoServer
 * @Description TODO
 * @Author Cays
 * @Date 2019/3/15 14:49
 * @Version 1.0
 **/
public class UDPEchoServer {
    private static final int ECHOMAX=255;//maximm size of echo datafram

    public static void main(String[] args) throws IOException {
        //UDP只接受一个参数即服务器端口号
        int servPort=8888;
        //UDP服务器必须显式指定本地端口号
        DatagramSocket socket=new DatagramSocket(servPort);
        DatagramPacket packet=new DatagramPacket(new byte[ECHOMAX],ECHOMAX);
        while (true){
            //receive方法阻塞等待,直到接收到客户端的报文或者超时
            //由于没有连接,每个数据报文都可能发送自不同的客户端
            socket.receive(packet);
            //udp服务器从客户端知道客户端的地址和端口号
            System.out.println("Handling client at "+packet.getAddress()
                .getHostAddress()+" on port "+packet.getPort());
            //发送回馈信息
            socket.send(packet);
            //重置数据报的内部长度
            packet.setLength(ECHOMAX);
        }
    }
}

二、简单的UDP应用程序

  1. 向服务器发送数据报文;2. 接收服务器返回的报文5次;3. 输出
package main;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.*;

/**
 * @ClassName UDPEchoClient
 * @Description TODO
 * @Author Cays
 * @Date 2019/3/15 12:16
 * @Version 1.0
 **/
public class UDPEchoClientTimeout {
    private static final int TIMEOUT=3000;//resend timeout(milliseconds)
    private static final int MAXTRIES=5;//Maximm retransmissions

    public static void main(String[] args) throws IOException {
        //Server Address
        InetAddress serverAddress=InetAddress.getByName("127.0.0.1");
        //Convert the argument string to bytes using the default encoding
        byte []bytesToSend="asasasdad".getBytes();
        int servPort=8888;
        //创建UDP套接字,未指定端口和ip,自动获取
        DatagramSocket socket=new DatagramSocket();
        //设置超时时间
        socket.setSoTimeout(TIMEOUT);
        //创建发送的数据报文,数据、目的地址、端口号
        DatagramPacket sendPacket=new DatagramPacket(bytesToSend,bytesToSend.length,
                serverAddress,servPort);
        //创建接受的数据报文,
        DatagramPacket receivePacket=new DatagramPacket(new byte[bytesToSend.length],
                bytesToSend.length);
        int tries=0;//packet may be lost, so we have to keep trying
        boolean receivedResponse=false;
        do {
            //发送报文
            socket.send(sendPacket);
            try{
                //receive阻塞等待,直到收到报文或者超时
                socket.receive(receivePacket);
                if (!receivePacket.getAddress().equals(serverAddress)){
                    throw new IOException("Received packet from an unknown source");
                }
                receivedResponse=true;
            }catch (InterruptedIOException e){
                //超时计数器加一,尝试重新发送
                tries+=1;
                System.out.println("Time out, "+(MAXTRIES-tries)+" more tries...");
            }
        }while ((!receivedResponse)&&(tries<MAXTRIES));
        if (receivedResponse){
            System.out.println("Received:"+new String(receivePacket.getData()));
        }else {
            System.out.println("No response -- giving up.");
        }
        socket.close();
    }
}

三、结果

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值