Java Tutorial/Network/UDP Client
Содержание
Read and write with DatagramPacket
<source lang="java">
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Main {
public static void main(String[] args) throws Exception { byte[] ary = new byte[128]; DatagramPacket pack = new DatagramPacket(ary, 128); // read DatagramSocket sock = new DatagramSocket(1111); sock.receive(pack); String word = new String(pack.getData()); System.out.println("From: " + pack.getAddress() + " Port: " + pack.getPort()); System.out.println(word); sock.close(); // write sock = new DatagramSocket(); pack.setAddress(InetAddress.getByName(args[1])); pack.setData(args[2].getBytes()); pack.setPort(1111); sock.send(pack); sock.close(); }
}</source>
Receiving a Datagram
<source lang="java">
import java.net.DatagramPacket; import java.net.DatagramSocket; public class Main {
public static void main(String[] argv) throws Exception { byte[] inbuf = new byte[256]; // default size DatagramSocket socket = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(inbuf, inbuf.length); socket.receive(packet); int numBytesReceived = packet.getLength(); System.out.println(numBytesReceived); }
}</source>
Send a Datagram
<source lang="java">
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class Main {
public static void main(String[] argv) throws Exception { } public static void senddatagram(InetAddress target, int port, byte[] outbuf, int len) { try { DatagramPacket request = new DatagramPacket(outbuf, len, target, port); DatagramSocket socket = new DatagramSocket(); socket.send(request); } catch (SocketException e) { } catch (IOException e) { } }
}</source>
Sending a Datagram
<source lang="java">
import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Main {
public static void main(String[] argv) throws Exception { InetAddress dst = InetAddress.getLocalHost(); int port = 8080; byte[] outbuf = new byte[1024]; int len = 1024; DatagramPacket request = new DatagramPacket(outbuf, len, dst, port); DatagramSocket socket = new DatagramSocket(); socket.send(request); }
}</source>
UDP Discard Client
<source lang="java">
import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class MainClass {
public static void main(String[] args) throws Exception { InetAddress server = InetAddress.getByName("localhost"); BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in)); DatagramSocket theSocket = new DatagramSocket(); while (true) { String theLine = userInput.readLine(); if (theLine.equals(".")) break; byte[] data = theLine.getBytes(); DatagramPacket theOutput = new DatagramPacket(data, data.length, server, 99999); theSocket.send(theOutput); } }
}</source>
UDP Echo Client
<source lang="java">
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class MainClass {
public static void main(String[] args) throws Exception { String hostname = "localhost"; InetAddress ia = InetAddress.getByName(hostname); SenderThread sender = new SenderThread(ia, 1919); sender.start(); Thread receiver = new ReceiverThread(sender.getSocket()); receiver.start(); }
} class SenderThread extends Thread {
private InetAddress server; private DatagramSocket socket; private boolean stopped = false; private int port; public SenderThread(InetAddress address, int port) throws SocketException { this.server = address; this.port = port; this.socket = new DatagramSocket(); this.socket.connect(server, port); } public void halt() { this.stopped = true; } public DatagramSocket getSocket() { return this.socket; } public void run() { try { BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in)); while (true) { if (stopped) return; String theLine = userInput.readLine(); if (theLine.equals(".")) break; byte[] data = theLine.getBytes(); DatagramPacket output = new DatagramPacket(data, data.length, server, port); socket.send(output); Thread.yield(); } } catch (IOException ex) { System.err.println(ex); } }
} class ReceiverThread extends Thread {
DatagramSocket socket; private boolean stopped = false; public ReceiverThread(DatagramSocket ds) throws SocketException { this.socket = ds; } public void halt() { this.stopped = true; } public void run() { byte[] buffer = new byte[65507]; while (true) { if (stopped) return; DatagramPacket dp = new DatagramPacket(buffer, buffer.length); try { socket.receive(dp); String s = new String(dp.getData(), 0, dp.getLength()); System.out.println(s); Thread.yield(); } catch (IOException ex) { System.err.println(ex); } } }
}</source>
UDP Time Client
<source lang="java">
import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.channels.DatagramChannel; public class UDPTimeClient {
public static void main(String[] args) throws Exception { DatagramChannel channel = DatagramChannel.open(); // port 0 selects any available port SocketAddress address = new InetSocketAddress(0); DatagramSocket socket = channel.socket(); socket.setSoTimeout(5000); socket.bind(address); SocketAddress server = new InetSocketAddress("time.nist.gov", 37); ByteBuffer buffer = ByteBuffer.allocate(8192); // time protocol always uses big-endian order buffer.order(ByteOrder.BIG_ENDIAN); // Must put at least one byte of data in the buffer; // it doesn"t matter what it is. buffer.put((byte) 65); buffer.flip(); channel.send(buffer, server); buffer.clear(); buffer.put((byte) 0).put((byte) 0).put((byte) 0).put((byte) 0); channel.receive(buffer); buffer.flip(); long secondsSince1970 = buffer.getLong(); System.out.println(secondsSince1970); channel.close(); }
}</source>
User Datagram Protocol Programming
<source lang="java">
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Main {
final private static int DAYTIME_PORT = 13; public static void main(String args[]) throws IOException { String host = args[0]; byte message[] = new byte[256]; InetAddress address = InetAddress.getByName(host); System.out.println("Checking at: " + address); DatagramPacket packet = new DatagramPacket(message, message.length, address, DAYTIME_PORT); DatagramSocket socket = new DatagramSocket(); socket.send(packet); packet = new DatagramPacket(message, message.length); socket.receive(packet); String time = new String(packet.getData()); System.out.println(time); socket.close(); }
}</source>