说明
https://blog.csdn.net/liu_yanzhao/article/details/79796671
单播
package udp;
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;
/**
*
*
* 编写一个聊天的工具
* 有收数据部分,和发数据部分
* 这两个不部分同时执行
* 就需要多线程技术
* 一个线程控制收,一个线程控制发
*
* 因为收和发动作是不一致的,所以要定义两个方法
* 而且这两个方法要封装到不同的类中
*
* @author 言曌
* @date 2017/12/6 下午8:25
*/
class Send implements Runnable {
private DatagramSocket socket;
public Send(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufferedReader.readLine()) != null) {
byte[] buff = line.getBytes();
DatagramPacket packet = new DatagramPacket(buff,buff.length, InetAddress.getByName("192.168.168.106"),10001);
socket.send(packet);
if("bye".equals(line)) {
break;
}
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Rece implements Runnable {
private DatagramSocket socket;
public Rece(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
while(true) {
byte[] buff = new byte[1024];
DatagramPacket packet = new DatagramPacket(buff,buff.length);
socket.receive(packet);
String ip = packet.getAddress().getHostAddress();
String data = new String(packet.getData(),0,packet.getLength());
if("bye".equals(data)) {
System.out.println(ip+"已经离开了");
continue;
}
System.out.println(ip+"说"+data);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class ChatDemo {
/**
* 可以持续发送到 192.168.168.106:10001
* 发送到接受者的10001端口,接受者需要在10001端口接受
*/
public static void main(String args[]) throws SocketException {
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket reveSocket = new DatagramSocket(10001);
new Thread(new Send(sendSocket)).start();
new Thread(new Rece(reveSocket)).start();
}
}