java socket udp编程实例_Java Socket编程实例(二)- UDP基本使用

一.服务端代码:

import java.io.*;

import java.net.*;

public class UDPEchoServer {

private static final int ECHOMAX = 255; // Maximum size of echo datagram

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

int servPort = 5500; // Server port

DatagramSocket socket = new DatagramSocket(servPort);

DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX);

while (true) { // Run forever, receiving and echoing datagrams

socket.receive(packet); // Receive packet from client

System.out.println("Handling client at " + packet.getAddress().getHostAddress() + " on port " + packet.getPort());

socket.send(packet); // Send the same packet back to client

packet.setLength(ECHOMAX); // Reset length to avoid shrinking buffer

}

/* NOT REACHED */

}

}

二.客户端代码:

import java.net.*;

import java.io.*;

public class UDPEchoClientTimeout {

private static final int TIMEOUT = 3000; // Resend timeout (milliseconds)

private static final int MAXTRIES = 5; // Maximum retransmissions

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

InetAddress serverAddress = InetAddress.getByName("127.0.0.1"); // Server address

int servPort = 5500; // Server port

// Convert the argument String to bytes using the default encoding

byte[] bytesToSend = "Hi, World".getBytes();

DatagramSocket socket = new DatagramSocket();

socket.setSoTimeout(TIMEOUT); // Maximum receive blocking time(milliseconds)

// Sending packet

DatagramPacket sendPacket = new DatagramPacket(bytesToSend, bytesToSend.length, serverAddress, servPort);

DatagramPacket receivePacket = // Receiving packet

new DatagramPacket(new byte[bytesToSend.length], bytesToSend.length);

int tries = 0; // Packets may be lost, so we have to keep trying

boolean receivedResponse = false;

do {

socket.send(sendPacket); // Send the echo string

try {

socket.receive(receivePacket); // Attempt echo reply reception

if (!receivePacket.getAddress().equals(serverAddress)) {// Check

// source

throw new IOException("Received packet from an unknown source");

}

receivedResponse = true;

} catch (InterruptedIOException e) { // We did not get anything

tries += 1;

System.out.println("Timed 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();

}

}

上述代码的UDP服务端是单线程,一次只能服务一个客户端。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值