package 网络编程.通过多线程改进;
import javax.sound.midi.Receiver;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Maidemo {
public static void main(String[] args) throws SocketException {
DatagramSocket ds = new DatagramSocket();//发送
DatagramSocket dst = new DatagramSocket(12306);//接受
SendThread st = new SendThread(ds);
ReceiverThread rt = new ReceiverThread(dst);
Thread t1 =new Thread(st);
Thread t2 = new Thread(rt);
t1.start();
t2.start();
}
}
接收
package 网络编程.通过多线程改进;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ReceiverThread implements Runnable{
private DatagramSocket ds;
public ReceiverThread (DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
try {
while (true){
byte[]bys = new byte[1024];
DatagramPacket dp =new DatagramPacket(bys,bys.length);
ds.receive(dp);
String s1 = new String(dp.getData(),0,dp.getLength());
System.out.println(s1+"---"+dp.getAddress().getHostAddress());
}
}catch (IOException e){
e.printStackTrace();
}
}
}
发送
package 网络编程.通过多线程改进;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class SendThread implements Runnable{
private DatagramSocket ds;
public SendThread (DatagramSocket ds){
this.ds=ds;
}
@Override
public void run() {
try {
Scanner scan = new Scanner(System.in);
while (true){
byte[] bys=scan.nextLine().getBytes();
DatagramPacket dp = new DatagramPacket(bys,bys.length,
InetAddress.getByName("192.168.0.102"),12306);
ds.send(dp);
}
}catch (IOException e){
e.printStackTrace();
}
}
}
未优化版
接受
package 网络编程;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
/*
A.创建接收端Scoket对象
B.创建数据包接受容器
C.调用Socket对象接受方法接受数据
D.解析数据包显示到控制台
E.释放控制台
*/
public class Bec接受 {
public static void main(String[] args) throws IOException {
//接受数据du'she
DatagramSocket ds = new DatagramSocket(10086);
byte[]bys = new byte[1024];
int length = bys.length;
//造接受的容器
DatagramPacket dp = new DatagramPacket(bys,length);
//接受数据包
ds.receive(dp);//阻塞方法
//获取对方的ip
InetAddress address = dp.getAddress();
String ip = address.getHostAddress();
//解析数据包
//用getDate获取数据缓冲区
//getlength 获取数据的实际长度
byte[] bys2 =dp.getData();
int len = dp.getLength();
//把缓冲区数据转为字符串
String s = new String(bys2,0,len);
System.out.println(ip+":"+s);
ds.close();
}
}
发送
package 网络编程;
import jdk.nashorn.internal.objects.DataPropertyDescriptor;
import java.io.IOException;
import java.net.*;
import java.nio.channels.DatagramChannel;
import java.util.Scanner;
/*
A.创建接收端Scoket对象
B.创建数据,并把数据打包
C.调用Socket对象发送方法到数据包
D.释放资源
*/
public class Maindemo {
public static void main(String[] args) throws IOException {
Scanner scan = new Scanner(System.in);
//创建发送端Sco'ket对象
DatagramSocket ds = new DatagramSocket();
//创建数据
byte[] bys=scan.next().getBytes();
int length = bys.length;
//ip地址对象
InetAddress address =InetAddress.getByName("192.168.0.102");
//端口
int port = 10086;
//包含主机端口
DatagramPacket dp =new DatagramPacket(bys,length,address,port);
//发送数据包
ds.send(dp);
ds.close();//释放资源
}
}