1, demo
发送方代码
package networkCoding;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 发送端
* 1,使用 DatagramSocket指定端口 创建服务端
* 2, 准备数据 转换成字节数组
* 3,准备容器 封装称Datagrampacket包裹, 需要指定目的地
* 4,准备发送包裹 send(Datagrampacket p)
* 5,释放资源
*
* **/
public class UdpSend {
public static void main(String[] args) throws IOException {
System.out.println("发送方启动中");
// 1,使用 DatagramSocket指定端口 创建服务端
DatagramSocket client=new DatagramSocket(9999);
// 2,准备数据 转换成字节数组
String string= "123";
byte[] bs= string.getBytes();
// 3. 准备容器 封装称Datagrampacket包裹, 需要指定目的地
DatagramPacket dp = new DatagramPacket(bs, 0,bs.length,new InetSocketAddress("localhost",8888));
// 4,准备发送包裹 send(Datagrampacket p)
client.send(dp);
// 5,释放资源
client.close();
}
}
2,接收方
package networkCoding;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
*
* 1,一切以包裹为中心-数据包
* 2,数据包操作字节数组
* 两个api
* DatagramSocket 插座-套接字 开启一个端,有 send 和recive方法
* DatagramPacket 数据包裹 信封
*
* */
/**
* 接收端
* 1,使用 DatagramSocket指定端口 创建服务端
* 2,准备容器 封装称Datagrampacket包裹
* 3. 阻塞失接受包裹receive(Datagrampacket p)
* 4,分析数据
* date[] getData();
* getLength();
* 5,释放资源
*
* **/
public class Udp {
public static void main(String[] args) throws IOException {
System.out.println("接收方启动中");
// 1,使用 DatagramSocket指定端口 创建服务端
DatagramSocket server=new DatagramSocket(8888);
// 2,准备容器 封装称Datagrampacket包裹, 需要指定目的地
byte[] container =new byte[60*1024];
DatagramPacket dpDatagramPacket= new DatagramPacket(container, 0,container.length);
// DatagramPacket
// 3. 阻塞失接受包裹receive(Datagrampacket p)
server.receive(dpDatagramPacket);
// 4,分析数据
// date[] getData();
// getLength();
byte[] datas= dpDatagramPacket.getData();
int len =dpDatagramPacket.getLength();
System.out.println(new String(datas,0,datas.length));
// 5,释放资源
server.close();
}
}
******************************
加上while 循环 多次发送
发送方
package networkCoding;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 发送端
* 1,使用 DatagramSocket指定端口 创建服务端
* 2, 准备数据 转换成字节数组
* 3,准备容器 封装称Datagrampacket包裹, 需要指定目的地
* 4,准备发送包裹 send(Datagrampacket p)
* 5,释放资源
*
* **/
public class UdpSend {
public static void main(String[] args) throws IOException {
System.out.println("发送方启动中");
// 1,使用 DatagramSocket指定端口 创建服务端
DatagramSocket client=new DatagramSocket(9999);
// 2,准备数据 转换成字节数组
BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(System.in));
while (true) {
String string= bufferedReader.readLine();
byte[] bs= string.getBytes();
// 3. 准备容器 封装称Datagrampacket包裹, 需要指定目的地
DatagramPacket dp = new DatagramPacket(bs, 0,bs.length,new InetSocketAddress("localhost",8888));
// 4,准备发送包裹 send(Datagrampacket p)
client.send(dp);
if(bufferedReader.equals("bye")) {
break;
}
}
// 5,释放资源
client.close();
}
}
接收方
package networkCoding;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
*
* 1,一切以包裹为中心-数据包
* 2,数据包操作字节数组
* 两个api
* DatagramSocket 插座-套接字 开启一个端,有 send 和recive方法
* DatagramPacket 数据包裹 信封
*
* */
/**
* 接收端
* 1,使用 DatagramSocket指定端口 创建服务端
* 2,准备容器 封装称Datagrampacket包裹
* 3. 阻塞失接受包裹receive(Datagrampacket p)
* 4,分析数据
* date[] getData();
* getLength();
* 5,释放资源
*
* **/
public class Udp {
public static void main(String[] args) throws IOException {
System.out.println("接收方启动中");
// 1,使用 DatagramSocket指定端口 创建服务端
DatagramSocket server=new DatagramSocket(8888);
// 2,准备容器 封装称Datagrampacket包裹, 需要指定目的地
while (true) {
byte[] container =new byte[60*1024];
DatagramPacket dpDatagramPacket= new DatagramPacket(container, 0,container.length);
// DatagramPacket
// 3. 阻塞失接受包裹receive(Datagrampacket p)
server.receive(dpDatagramPacket);
// 4,分析数据
// date[] getData();
// getLength();
byte[] datas= dpDatagramPacket.getData();
int len =dpDatagramPacket.getLength();
String dataString = new String(datas,0,datas.length);
System.out.println(dataString);
if(dataString.equals("bye")) {
break;
}
}
// 5,释放资源
server.close();
}
}
**********************
面向对象写法实现 双向聊天
封装两个类
扫描二维码关注公众号,回复:
8936080 查看本文章
1,聊天发送类
package networkCoding;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class TalkClient implements Runnable {
private DatagramSocket client;
private String toAddress;
private int toPort;
public TalkClient(int port, String toAddress,int toPort) throws SocketException {
// 1,使用 DatagramSocket指定端口 创建服务端
this.client = new DatagramSocket(port);
this.toAddress = toAddress;
this.toPort = toPort;
}
public static void main(String[] args) throws IOException {
}
@Override
public void run () {
// 2,准备数据 转换成字节数组
BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(System.in));
while (true) {
String string;
try {
string = bufferedReader.readLine();
byte[] bs= string.getBytes();
// 3. 准备容器 封装称Datagrampacket包裹, 需要指定目的地
DatagramPacket dp = new DatagramPacket(bs, 0,bs.length,new InetSocketAddress(this.toAddress,this.toPort));
// 4,准备发送包裹 send(Datagrampacket p)
this.client.send(dp);
if(string.equals("bye")) {
break;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 5,释放资源
this.client.close();
}
}
2,聊天接收类
package networkCoding;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class ReceiveClient implements Runnable {
private DatagramSocket server;
private String name;
public ReceiveClient(int port,String name) throws SocketException {
// 1,使用 DatagramSocket指定端口 创建服务端
this.server = new DatagramSocket(port);
this.name= name;
}
public static void main(String[] args) throws IOException {
}
@Override
public void run() {
// TODO Auto-generated method stub
// 2,准备容器 封装称Datagrampacket包裹, 需要指定目的地
while (true) {
byte[] container =new byte[60*1024];
DatagramPacket dpDatagramPacket= new DatagramPacket(container, 0,container.length);
// DatagramPacket
// 3. 阻塞失接受包裹receive(Datagrampacket p)
try {
this.server.receive(dpDatagramPacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 4,分析数据
// date[] getData();
// getLength();
byte[] datas= dpDatagramPacket.getData();
int len =dpDatagramPacket.getLength();
String dataString = new String(datas,0,len);
System.out.println(this.name+":"+dataString);
if(dataString.equals("bye")) {
break;
}
}
// 5,释放资源
this.server.close();
}
}
然后 角色上场
杨子荣
package networkCoding;
import java.net.SocketException;
public class ZiRongYang {
public static void main(String[] args) throws SocketException {
new Thread(new ReceiveClient(8888,"座山雕")).start();
new Thread(new TalkClient(5555, "localhost", 6666)) .start();
}
}
座山雕
package networkCoding;
import java.net.SocketException;
public class ZuoShanDiao {
public static void main(String[] args) throws SocketException {
new Thread(new TalkClient(9999, "localhost", 8888)) .start();
new Thread(new ReceiveClient(6666,"杨子荣")).start();
}
}