方法一,做一个Send和Reserve,在2个窗口输入输出信息
Reserve:
package xyz.main;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Reserve {
public static void main(String[] args) throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(12345);
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024],1024);
while (true) {
datagramSocket.receive(datagramPacket);
//System.out.println(datagramPacket.toString());
byte[] arr = datagramPacket.getData();
String ip = datagramPacket.getAddress().getHostAddress();
int port = datagramPacket.getPort();
System.out.println(ip + ":"+ port + " : "+new String(arr, 0, datagramPacket.getLength()));
}
//datagramSocket.close();
}
}
Send:
package xyz.main;
import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws IOException {
//String s = new String("Bat Date");
Scanner sc = new Scanner(System.in);
DatagramSocket datagramSocket = new DatagramSocket(54321);
while(true) {
String s = sc.nextLine();
if(s.equals("quit"))
break;
DatagramPacket datagramPacket = new DatagramPacket(s.getBytes(), s.length(), InetAddress.getByName("127.0.0.1"), 12345);
datagramSocket.send(datagramPacket);
}
datagramSocket.close();
}
}
这样开2个窗口,一边为输入端,一边为输出端,还可以在同一个局域网内进行信息的传输
方法二,多线程,在一个窗口输入输出
经过优化,上面代码为
package xyz.main;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class ThreadForSR {
public static void main(String[] args) throws InterruptedException {
new ReserveThread().start();
Thread.sleep(20);
new SendThread().start();
}
}
class SendThread extends Thread {
public void run() {
try {
DatagramSocket datagramSocket = new DatagramSocket(51321);
while (true) {
Scanner sc = new Scanner(System.in);
String line = sc.nextLine();
DatagramPacket datagramPacket = new DatagramPacket(line.getBytes(), line.length(),
InetAddress.getByName("255.255.255.255"), 12315);
datagramSocket.send(datagramPacket);
if(sc.equals("quit"))
break;
}
datagramSocket.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
class ReserveThread extends Thread {
public void run() {
try {
DatagramSocket datagramSocket = new DatagramSocket(12315);
while (true) {
DatagramPacket datagramPacket = new DatagramPacket(new byte[1024], 1024);
String lenData;
if ((lenData = new String(datagramPacket.getData(),
0, datagramPacket.getLength())).equals("quit"))
break;
datagramSocket.receive(datagramPacket);
InetAddress inetAddress = datagramPacket.getAddress();
System.out.println(inetAddress.getHostAddress() + ":" + datagramPacket.getPort() + " : " +
lenData);
}
datagramSocket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}