UDP進(jìn)行基本數(shù)據(jù)類型,對(duì)象,文件的代碼
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/*
?* 發(fā)送端
?* 1.使用DatagramSocket? 指定端口 創(chuàng)建發(fā)送端
?* 2.準(zhǔn)備將基本類型轉(zhuǎn)成字節(jié)數(shù)組
?* 3.封裝成DatagramPacket包裹,需要指定目的地
?* 4.發(fā)送包裹send(DatagramPacket p)
?* 5.釋放資源
?*/
public class UdpTypeClient {
?? ??? ?public static void main(String[] args) throws Exception {
?? ??? ??? ?System.out.println("發(fā)送方啟動(dòng)中");
?? ??? ??? ?//1.使用DatagramSocket? 指定端口 創(chuàng)建發(fā)送端
?? ??? ??? ?DatagramSocket client=new DatagramSocket(8888);
?? ??? ??? ?//2.準(zhǔn)備數(shù)據(jù)一定要轉(zhuǎn)成字節(jié)數(shù)組
?? ??? ??? ?//字節(jié)數(shù)組流
?? ??? ??? ?ByteArrayOutputStream? baos=new ByteArrayOutputStream();
?? ??? ??? ? //先寫出再讀取,因?yàn)槟悴粚懩阕x什么內(nèi)容,所以你先寫一個(gè)內(nèi)容讓人家讀
?? ??? ??? ?DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(baos));
?? ??? ??? ?//接下來就是怎么寫入到字節(jié)數(shù)組里面了??? 操作數(shù)據(jù)類型+數(shù)據(jù)
?? ??? ??? ?dos.writeUTF("我太難了");
?? ??? ??? ?dos.writeInt(18);
?? ??? ??? ?dos.writeBoolean(false);
?? ??? ??? ?dos.flush();
?? ??? ??? ?byte[]? datas=baos.toByteArray();?? //將字節(jié)流轉(zhuǎn)為字節(jié)數(shù)組
?? ??? ??? ?
?? ??? ??? ?//3.封裝成DatagramPacket包裹,需要指定目的地
?? ??? ??? ?DatagramPacket packet
?? ??? ??? ??? ??? ??? ??? ?=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
?? ??? ??? ?//4.發(fā)送包裹send(DatagramPacket p)
?? ??? ??? ?client.send(packet);
?? ??? ??? ?//5.釋放資源
?? ??? ??? ?client.close();
?? ??? ?
?? ??? ?}
?? ?
}
package cn.jd.udp;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
?* 同一個(gè)協(xié)議下端口不允許沖突
?* 基本類型:接收端
?* 1.使用DatagramSocket? 指定端口 創(chuàng)建接收端
?* 2.準(zhǔn)備容器 封裝成DatagramPacket包裹
?* 3.阻塞式接收包裹receive(DatagramPacket p)
?* 4.分析數(shù)據(jù)??? 將字節(jié)數(shù)組還原成對(duì)應(yīng)的類型
?*??? byte[]? getData()
?*????????????? getLength()
?*? 5.釋放資源
?*/
public class UdpTypeServer {
?? ?public static void main(String[] args) throws Exception {
?? ??? ?System.out.println("接收方啟動(dòng)中");
?? ??? ?//1.使用DatagramSocket? 指定端口 創(chuàng)建接收端
?? ??? ?DatagramSocket server=new DatagramSocket(9999);
?? ??? ?//2.準(zhǔn)備容器 封裝成DatagramPacket包裹
?? ??? ?byte[]? container=new byte[1024*60];//最多接收60K
?? ??? ?DatagramPacket packet=new DatagramPacket(container, 0,container.length);
?? ??? ?//3.阻塞式接收包裹receive(DatagramPacket p)
?? ??? ?server.receive(packet);
?? ??? ?//4.分析數(shù)據(jù)?? 將字節(jié)數(shù)組還原成對(duì)應(yīng)的類型
?? ??? ?//byte[]?? getData()
?? ??? ?//getLength()
?? ??? ?byte[] datas=packet.getData();
?? ??? ?int len=packet.getLength();
?? ??? ?//讀取
?? ??? ?DataInputStream dis=new DataInputStream(new BufferedInputStream(new ByteArrayInputStream(datas)));
?? ??? ?//接下來就是從程序里面讀取內(nèi)容,順序要和寫出的一致
?? ??? ? String msg=dis.readUTF();
?? ??? ? int age=dis.readInt();
?? ??? ? boolean flag=dis.readBoolean();
?? ??? ? System.out.println(msg);
?? ??? ?//5.釋放資源
?? ??? ?server.close();
?? ?}
}
package cn.jd.udp;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.Date;
/*
?* 引用類型:發(fā)送端
?* 1.使用DatagramSocket? 指定端口 創(chuàng)建發(fā)送端
?* 2.準(zhǔn)備數(shù)據(jù)一定要轉(zhuǎn)成字節(jié)數(shù)組
?* 3.封裝成DatagramPacket包裹,需要指定目的地
?* 4.發(fā)送包裹send(DatagramPacket p)
?* 5.釋放資源
?*/
public class UdpObjClient {
?? ??? ?public static void main(String[] args) throws Exception {
?? ??? ??? ?System.out.println("發(fā)送方啟動(dòng)中");
?? ??? ??? ?//1.使用DatagramSocket? 指定端口 創(chuàng)建發(fā)送端
?? ??? ??? ?DatagramSocket client=new DatagramSocket(8888);
?? ??? ??? ?//2.準(zhǔn)備數(shù)據(jù)一定要轉(zhuǎn)成字節(jié)數(shù)組
?? ??? ??? ?ByteArrayOutputStream? baos=new ByteArrayOutputStream();
?? ??? ??? ?ObjectOutputStream oos=new ObjectOutputStream(new BufferedOutputStream(baos));
?? ??? ??? ?oos.writeUTF("我太難了");
?? ??? ??? ?oos.writeInt(18);
?? ??? ??? ?oos.writeBoolean(false);
?? ??? ??? ?//加入對(duì)象
?? ??? ??? ?oos.writeObject("希望世界和平");
?? ??? ??? ?oos.writeObject(new Date());
?? ??? ??? ?Employee emp=new Employee("小二",400);
?? ??? ??? ?oos.writeObject(emp);
?? ??? ??? ?oos.flush();
?? ??? ??? ?byte[]? datas=baos.toByteArray();? ?
?? ??? ??? ?//3.封裝成DatagramPacket包裹,需要指定目的地
?? ??? ??? ?DatagramPacket packet
?? ??? ??? ??? ??? ??? ??? ?=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
?? ??? ??? ?//4.發(fā)送包裹send(DatagramPacket p)
?? ??? ??? ?client.send(packet);
?? ??? ??? ?//5.釋放資源
?? ??? ??? ?client.close();
?? ??? ?
?? ??? ?}
?? ?
}
package cn.jd.udp;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Date;
/*
?* 同一個(gè)協(xié)議下端口不允許沖突
?* 引用類型:接收端
?* 1.使用DatagramSocket? 指定端口 創(chuàng)建接收端
?* 2.準(zhǔn)備容器 封裝成DatagramPacket包裹
?* 3.阻塞式接收包裹receive(DatagramPacket p)
?* 4.分析數(shù)據(jù)
?*??? byte[]? getData()
?*????????????? getLength()
?*? 5.釋放資源
?*/
public class UdpObjServer {
?? ?public static void main(String[] args) throws Exception {
?? ??? ?System.out.println("接收方啟動(dòng)中");
?? ??? ?//1.使用DatagramSocket? 指定端口 創(chuàng)建接收端
?? ??? ?DatagramSocket server=new DatagramSocket(9999);
?? ??? ?//2.準(zhǔn)備容器 封裝成DatagramPacket包裹
?? ??? ?byte[]? container=new byte[1024*60];//最多接收60K
?? ??? ?DatagramPacket packet=new DatagramPacket(container, 0,container.length);
?? ??? ?//3.阻塞式接收包裹receive(DatagramPacket p)
?? ??? ?server.receive(packet);
?? ??? ?//4.分析數(shù)據(jù)
?? ??? ?//byte[]?? getData()
?? ??? ?//getLength()
?? ??? ?byte[] datas=packet.getData();
?? ??? ?int len=packet.getLength();
?? ??? ?ObjectInputStream ois=new ObjectInputStream(new BufferedInputStream(new ByteArrayInputStream(datas)));
?? ??? ? String msg=ois.readUTF();
?? ??? ? int age=ois.readInt();
?? ??? ? boolean flag=ois.readBoolean();
?? ??? ? Object str=ois.readObject();
?? ??? ? Object date=ois.readObject();
?? ??? ? Object employee=ois.readObject();
?? ??? ? //接下來我們就將類型還原,這里我們必須加上類型轉(zhuǎn)換
?? ??? ? if(str instanceof String) {
?? ??? ??? ? String strObj=(String)str;
//?? ??? ??? ? System.out.println(strObj);
?? ??? ? }
?? ??? ? if(date instanceof Date) {
?? ??? ??? ? Date dateObj=(Date)date;
//?? ??? ??? ? System.out.println(dateObj);
?? ??? ? }
?? ??? ? if(employee instanceof Employee) {
?? ??? ??? ?Employee empObj=(Employee)employee;
?? ??? ??? ? System.out.println(empObj.getName()+"-->"+empObj.getSalary());
?? ??? ? }
//?? ??? ? System.out.println(msg);
?? ??? ?//5.釋放資源
?? ??? ?server.close();
?? ?}
}
package cn.jd.udp;
//寫了一個(gè)javabean類?? 后期用來封裝數(shù)據(jù)?? transient
public class Employee? implements java.io.Serializable{
?? ?private transient String name;
?? ?private double? salary;
?? ?public Employee() {
?? ??? ?
?? ?}
?? ?public Employee(String name, double salary) {
?? ??? ?this.name = name;
?? ??? ?this.salary = salary;
?? ?}
?? ?public String getName() {
?? ??? ?return name;
?? ?}
?? ?public void setName(String name) {
?? ??? ?this.name = name;
?? ?}
?? ?public double getSalary() {
?? ??? ?return salary;
?? ?}
?? ?public void setSalary(double salary) {
?? ??? ?this.salary = salary;
?? ?}
?? ?
?? ?
}
package cn.jd.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/*
?* 文件上傳:發(fā)送端
?* 1.使用DatagramSocket? 指定端口 創(chuàng)建發(fā)送端
?* 2.準(zhǔn)備數(shù)據(jù)一定要轉(zhuǎn)成字節(jié)數(shù)組
?* 3.封裝成DatagramPacket包裹,需要指定目的地
?* 4.發(fā)送包裹send(DatagramPacket p)
?* 5.釋放資源
?*/
public class UdpFileClient {
?? ??? ?public static void main(String[] args) throws Exception {
?? ??? ??? ?System.out.println("發(fā)送方啟動(dòng)中");
?? ??? ??? ?//1.使用DatagramSocket? 指定端口 創(chuàng)建發(fā)送端
?? ??? ??? ?DatagramSocket client=new DatagramSocket(8888);
?? ??? ??? ?//2.準(zhǔn)備數(shù)據(jù)一定要轉(zhuǎn)成字節(jié)數(shù)組
?? ??? ??? ?byte[] datas=IOUtils.fileToByteArray("src/OIP.jpg");
?? ??? ??? ?//3.封裝成DatagramPacket包裹,需要指定目的地
?? ??? ??? ?DatagramPacket packet
?? ??? ??? ??? ??? ??? ??? ?=new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",9999));
?? ??? ??? ?//4.發(fā)送包裹send(DatagramPacket p)
?? ??? ??? ?client.send(packet);
?? ??? ??? ?//5.釋放資源
?? ??? ??? ?client.close();
?? ??? ?
?? ??? ?}
?? ?
}
package cn.jd.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/*
?* 同一個(gè)協(xié)議下端口不允許沖突
?* 文件存儲(chǔ):接收端
?* 1.使用DatagramSocket? 指定端口 創(chuàng)建接收端
?* 2.準(zhǔn)備容器 封裝成DatagramPacket包裹
?* 3.阻塞式接收包裹receive(DatagramPacket p)
?* 4.分析數(shù)據(jù)
?*??? byte[]? getData()
?*????????????? getLength()
?*? 5.釋放資源
?*/
public class UdpFileServer {
?? ?public static void main(String[] args) throws Exception {
?? ??? ?System.out.println("接收方啟動(dòng)中");
?? ??? ?//1.使用DatagramSocket? 指定端口 創(chuàng)建接收端
?? ??? ?DatagramSocket server=new DatagramSocket(9999);
?? ??? ?//2.準(zhǔn)備容器 封裝成DatagramPacket包裹
?? ??? ?byte[]? container=new byte[1024*60];//最多接收60K
?? ??? ?DatagramPacket packet=new DatagramPacket(container, 0,container.length);
?? ??? ?//3.阻塞式接收包裹receive(DatagramPacket p)
?? ??? ?server.receive(packet);
?? ??? ?//4.分析數(shù)據(jù)
?? ??? ?//byte[]?? getData()
?? ??? ?//getLength()
?? ??? ?byte[] datas=packet.getData();
?? ??? ?int len=packet.getLength();
?? ??? ?IOUtils.byteArrayToFile(datas, "src/copy.jpg");
?? ??? ?//5.釋放資源
?? ??? ?server.close();
?? ?}
}
package cn.jd.udp;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
/*
?* 1.圖片讀取到字節(jié)數(shù)組
?* 2.字節(jié)數(shù)組寫出到文件
?* 先說第一個(gè),我們開始講第二個(gè)
?*/
public class IOUtils {
?? ?
?? ?// 圖片讀取到字節(jié)數(shù)組寫一個(gè)方法,字節(jié)數(shù)組的目的地可以不用管
?? ?// 1.圖片到程序 FileInputStream 2.程序到字節(jié)數(shù)組 ByteArrayOutputStream
?? ?public static byte[] fileToByteArray(String filePath)? {
?? ??? ?//先將圖片以字節(jié)流的方式輸入到程序中
?? ??? ?File src = new File(filePath);
?? ??? ?byte[] dest = null; //這個(gè)目的地可有可無
?? ??? ?InputStream is=null;
?? ??? ?try {
?? ??? ??? ?is = new FileInputStream(src);
?? ??? ?} catch (FileNotFoundException e1) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e1.printStackTrace();
?? ??? ?}
?? ??? ?ByteArrayOutputStream baos = new ByteArrayOutputStream();// 有新增方法不能發(fā)生多態(tài)
?? ??? ?byte[] flush = new byte[1024 * 10];//定義了一個(gè)字節(jié)數(shù)組
?? ??? ?int len = -1;
?? ??? ?try {
?? ??? ??? ?while ((len = is.read(flush)) != -1) {//把文件寫入到程序中了(這里是通過)
//?? ??? ??? ??? ??? ??? ?String str=new String(flush,0,len);
//?? ??? ??? ??? ??? ??? ?System.out.println(str);
?? ??? ??? ??? ?baos.write(flush, 0, len);? //從程序?qū)懗龅阶止?jié)數(shù)組中
?? ??? ??? ?}
?? ??? ??? ?baos.flush();
?? ??? ??? ?return baos.toByteArray();????? //返回baos的字節(jié)數(shù)組
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ?e.printStackTrace();
?? ??? ?} finally {
?? ??? ??? ?try {
?? ??? ??? ??? ?if (is != null) {
?? ??? ??? ??? ??? ?is.close();
?? ??? ??? ??? ?}
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ?}
?? ??? ?return null;? //這里記得寫
?? ?}
?? ?// 字節(jié)數(shù)組寫出到圖片 需要字節(jié)數(shù)組的數(shù)據(jù)源,以及文件的路徑
?? ?//1.字節(jié)數(shù)組讀取到程序中(ByteArrayInputStream)2.程序?qū)懗龅轿募?FileOutputStream)
?? ?public static void byteArrayToFile(byte[] src, String filePath) {
?? ??? ??? ?File dest=new File(filePath);//輸出圖片的目的地,這里是文件寫出的路徑
?? ??? ??? ?ByteArrayInputStream? is=new ByteArrayInputStream(src);?? //字節(jié)數(shù)組的流,先讓它寫到程序?? src是數(shù)據(jù)源
?? ??? ??? ?OutputStream os=null;
?? ??? ??? ?try {
?? ??? ??? ??? ?os=new FileOutputStream(dest);
?? ??? ??? ??? ?byte[] flush=new byte[5];
?? ??? ??? ??? ?int len=-1;
?? ??? ??? ??? ?while((len=is.read(flush))!=-1){//這里是寫入程序
?? ??? ??? ??? ??? ?os.write(flush,0,len);//這一步是將程序?qū)懭氲轿募??? 這里一定要記住文件流一定要釋放
?? ??? ??? ??? ?}
?? ??? ??? ??? ?os.flush();
?? ??? ??? ?} catch (FileNotFoundException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}finally {
?? ??? ??? ??? ?try {
?? ??? ??? ??? ??? ?if(os!=null) {
?? ??? ??? ??? ??? ??? ?os.close();
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ??? ?
?? ?}
}