您的位置:首页 > 理论基础 > 计算机网络

网络编程_UDP案例_在线咨询

2019-02-24 18:01 225 查看


不管什么数据类型:基本数据类型、引用数据类型、文件,只要能够转成字节数组,都能够通过UDP发送出去、接收过来。当然,这里内容不能太大【60k】,太大了还是接不了。

(1)、

package com.sxt.udp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

/**
* 多次交流: 发送端
* 1、使用DatagramSocket  指定端口 创建发送端
* 2、准备数据 一定转成字节数组
* 3、 封装成DatagramPacket 包裹,需要指定目的地
* 4、发送包裹send​(DatagramPacket p) *
* 5、释放资源
* @author
*
*/
public class UdpTalkClient {

public static void main(String[] args) throws Exception {
System.out.println("发送方启动中.....");
// 1、使用DatagramSocket  指定端口 创建发送端
DatagramSocket client =new DatagramSocket(8888);
//2、准备数据 一定转成字节数组
BufferedReader reader =new BufferedReader(new InputStreamReader(System.in));
while(true) {
String data = reader.readLine();
byte[] datas = data.getBytes();
//3、 封装成DatagramPacket 包裹,需要指定目的地
DatagramPacket packet =new DatagramPacket(datas,0,datas.length,
new InetSocketAddress("localhost",6666));
//4、发送包裹send​(DatagramPacket p) *
client.send(packet);
if(data.equals("bye")) {
break;
}
}
// 5、释放资源
client.close();
}
}

package com.sxt.udp;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
* 多次交流: 接收端
* Address already in use: Cannot bind  同一个协议下端口不允许冲突
* 1、使用DatagramSocket  指定端口 创建接收端
* 2、准备容器 封装成DatagramPacket 包裹
* 3、阻塞式接收包裹receive​(DatagramPacket p)
* 4、分析数据
*    byte[]  getData​()
*                getLength​()
* 5、释放资源
* @author
*
*/
public class UdpTalkServer {

public static void main(String[] args) throws Exception {
System.out.println("接收方启动中.....");
// 1、使用DatagramSocket  指定端口 创建接收端
DatagramSocket server =new DatagramSocket(6666);

while(true) {
// 2、准备容器 封装成DatagramPacket 包裹
byte[] container =new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
// 3、阻塞式接收包裹receive​(DatagramPacket p)
server.receive(packet); //阻塞式
// 4、分析数据
//    byte[]  getData​()
//                getLength​()
byte[]  datas =packet.getData();
int len = packet.getLength();
String data=new String(datas,0,len);
System.out.println(data);
if(data.equals("bye")) {
break;
}
}
// 5、释放资源
server.close();
}
}

(2)、

package com.sxt.udp;

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;

/**
* 发送端: 使用面向对象封装(所谓的使用面向对象封装,无非就是加入属性,加入方法,加入构造器,
* 然后再玩类跟类的关系,接口、继承,最后再玩设计模式)
*
* @author
*
*/
public class TalkSend implements Runnable {
private DatagramSocket client ;
private BufferedReader reader;
private String toIP ;
private int toPort ;
public TalkSend(int port,String toIP,int toPort) {
this.toIP = toIP;
this.toPort=toPort;
try {
client=new DatagramSocket(port);
reader =new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
String data;
try {
data = reader.readLine();
byte[] datas = data.getBytes();
//3、 封装成DatagramPacket 包裹,需要指定目的地
DatagramPacket packet =new DatagramPacket(datas,0,datas.length,
new InetSocketAddress(this.toIP,this.toPort));
//4、发送包裹send​(DatagramPacket p) *
client.send(packet);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}

}
// 5、释放资源
client.close();
}
}

package com.sxt.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
* 接收端: 使用面向对象封装(所谓的使用面向对象封装,无非就是加入属性,加入方法,加入构造器,
* 然后再玩类跟类的关系,接口、继承,最后再玩设计模式)
*
* @author
*
*/
public class TalkReceive implements Runnable {
private DatagramSocket server ;
private String from ;
public TalkReceive(int port,String from) {
this.from = from ;
try {
server=new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true) {
// 2、准备容器 封装成DatagramPacket 包裹
byte[] container =new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
// 3、阻塞式接收包裹receive​(DatagramPacket p)
try {
server.receive(packet);//阻塞式
// 4、分析数据
byte[]  datas =packet.getData();
int len = packet.getLength();
String data=new String(datas,0,len);
System.out.println(from+":"+data);
if(data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 5、释放资源
server.close();
}
}

(3)、

package com.sxt.udp;
/**
* 加入多线程,实现双向交流 模拟在线咨询
*
* @author
*
*/
public class TalkStudent {
public static void main(String[] args) {
new Thread(new TalkSend(7777,"localhost",9999)).start(); //发送
new Thread(new TalkReceive(8888,"老师")).start(); //接收
}
}

package com.sxt.udp;
/**
* 加入多线程,实现双向交流 模拟在线咨询
*
* @author
*
*/
public class TalkTeacher {
public static void main(String[] args) {
new Thread(new TalkReceive(9999,"学生")).start(); //接收
new Thread(new TalkSend(5555,"localhost",8888)).start(); //发送
}
}

再次强调UDP编程在后期的开发中属于底层开发,叫网络编程不叫网页编程,

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: