怎么把图片转换为字节数组。 图片是本机上的。 想取出来转换为字节数组 传送出去。 那一端通过接受字节数组 再转换为图片。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用 FileInputStream 打开该文件,读取出来保存到数组就是了。考虑到你的应用场景,建议不用全部转为数组,可以先把Socket通道建立好,然后边读取边发送给对方(比如可以每次读取8K然后发送8K),这样内存占用不会随图片大小而增加。 使用字节流就ok FileInputStream打开,读到的数据就是字节数组 FileOutputStream 写字节数组到文件 是这样的 要求用的是UDP传送。 就是说假如UDP客户端 点击一个获取图片的按钮,然后服务器检测到有请求就马上传送一个图片 显示在客户端这边 UDP是非可靠传输,也就是传递过去的东西可能会缺一块,这个会比较麻烦。抛开传输完整性先不提的话,用UDP传输也没啥差异,你就从FileInputStream中读取 8K,然后把这8K打个UDP数据包,发送;然后再读取下一个8K.... 没啥区别啊 UDP是非可靠传输,说他非可靠,是因为它在传输过程中不校验,其实也是很可靠地。 UDP 会丢包,到时候图片会有差异 UDP传输一样啊, 可以定义协议啊 图片字节数组大小(lengh)+图片字节数组,然后过去解包,解包发现大小不一样,就等待或者丢掉。 说明程序有Bug,先用超小的图片,比如只有 2K 大小的,做做调试,看看问题在哪。 就是说你连续发送 10 个UDP包,对方可能只能收取到 8 个,而且不保证接收到的顺序跟发送的顺序一致。 看代码,服务端 import java.io.File;import java.io.FileInputStream;import java.net.DatagramPacket;import java.net.DatagramSocket;public class UDP1 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(5000); byte[] b = new byte[100]; DatagramPacket receivePacket = new DatagramPacket(b,b.length); socket.receive(receivePacket); // 检测是否有请求发过来。 if(0!=receivePacket.getLength()){ File file = new File("E:/123.png"); FileInputStream in = new FileInputStream (file); byte[] b1 = new byte[(int)file.length()]; in.read(b1,0,b1.length); DatagramPacket sendPacket =new DatagramPacket(b1,b1.length, receivePacket.getAddress(),receivePacket.getPort()); socket.send(sendPacket); } }}客户端import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import javax.imageio.ImageIO;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;public class UDP2 implements ActionListener{ JButton btn; JPanel jp; MyCanvas1 cav = new MyCanvas1(); BufferedImage image; public UDP2(){ JFrame jf= new JFrame("I am a client"); btn = new JButton("获取图像"); jp= new JPanel(); jf.add(btn,BorderLayout.NORTH); btn.setSize(250,30); btn.addActionListener(this); cav.setPreferredSize(new Dimension(250,250)); jp.add(cav); jf.add(jp,BorderLayout.SOUTH); jf.pack(); jf.setVisible(true); } class MyCanvas1 extends Canvas{ public void paint(Graphics g){ g.drawImage(image,0,0,this); } } public void actionPerformed(ActionEvent e) { try{ DatagramSocket socket = new DatagramSocket(); String str="请求图片"; DatagramPacket sendPacket = new DatagramPacket (str.getBytes(),str.length(), InetAddress.getByName("localhost"),5000); socket.send(sendPacket); byte[] image1 = new byte[3000]; DatagramPacket receivePacket =new DatagramPacket(image1,3000); socket.receive(receivePacket); ByteArrayInputStream bais = new ByteArrayInputStream (image1,0,receivePacket.getLength()); BufferedImage img = ImageIO.read(bais); image = img; cav.repaint(); socket.receive(receivePacket); socket.close(); }catch(Exception en){ en.printStackTrace(); } } public static void main(String[] args)throws Exception { new UDP2(); }}跑起来 点击按钮的时候 服务端那边就停止了。 这边没接收到 , 也没报错 不过建议 多提点意见啊~~ UDP传送 貌似 是限制数据大小的~ 万一大了, 分批传, 那数据就不能保证完整啊 看这个http://blog.csdn.net/firecoder/article/details/5702429 sun.misc.BASE64Decodersun.misc.BASE64Encoderbyte[]编码 字符串传输 在解码就OK了 结构化纯p2p编程问题,java语言 JSONStringer是什么?能给介绍一下么? 请英雄赐教,关于"伺候器遇到了阻止它实现这一个请求的一个内在的错误 () 。" ObjectInputStream实现循环读对象的问题..急...!!! 关于javabean的问题 新手问题!!! tomcat如何连oracle呀 为什么AppletViewer不能看继承JApplet的java小程序 JFrame下鼠标指针Cursor的问题!!!!!!! (SOS)为什么得到null值,有什么办法解决 新手求教 菜鸟求助 serversock连不上 纠结了一个晚上了
考虑到你的应用场景,建议不用全部转为数组,可以先把Socket通道建立好,然后边读取边发送给对方(比如可以每次读取8K然后发送8K),这样内存占用不会随图片大小而增加。
FileOutputStream 写字节数组到文件
是这样的 要求用的是UDP传送。
UDP是非可靠传输,也就是传递过去的东西可能会缺一块,这个会比较麻烦。抛开传输完整性先不提的话,用UDP传输也没啥差异,你就从FileInputStream中读取 8K,然后把这8K打个UDP数据包,发送;然后再读取下一个8K.... 没啥区别啊
说明程序有Bug,先用超小的图片,比如只有 2K 大小的,做做调试,看看问题在哪。
就是说你连续发送 10 个UDP包,对方可能只能收取到 8 个,而且不保证接收到的顺序跟发送的顺序一致。
import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class UDP1 {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(5000);
byte[] b = new byte[100];
DatagramPacket receivePacket = new DatagramPacket(b,b.length);
socket.receive(receivePacket);
// 检测是否有请求发过来。
if(0!=receivePacket.getLength()){
File file = new File("E:/123.png");
FileInputStream in = new FileInputStream
(file);
byte[] b1 = new byte[(int)file.length()];
in.read(b1,0,b1.length);
DatagramPacket sendPacket =new DatagramPacket(b1,b1.length,
receivePacket.getAddress(),receivePacket.getPort());
socket.send(sendPacket);
}
}
}
客户端import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;public class UDP2 implements ActionListener{
JButton btn;
JPanel jp;
MyCanvas1 cav = new MyCanvas1();
BufferedImage image;
public UDP2(){
JFrame jf= new JFrame("I am a client");
btn = new JButton("获取图像");
jp= new JPanel();
jf.add(btn,BorderLayout.NORTH);
btn.setSize(250,30);
btn.addActionListener(this);
cav.setPreferredSize(new Dimension(250,250));
jp.add(cav);
jf.add(jp,BorderLayout.SOUTH);
jf.pack();
jf.setVisible(true);
}
class MyCanvas1 extends Canvas{
public void paint(Graphics g){
g.drawImage(image,0,0,this);
}
}
public void actionPerformed(ActionEvent e) {
try{
DatagramSocket socket = new DatagramSocket();
String str="请求图片";
DatagramPacket sendPacket = new DatagramPacket
(str.getBytes(),str.length(),
InetAddress.getByName("localhost"),5000);
socket.send(sendPacket);
byte[] image1 = new byte[3000];
DatagramPacket receivePacket =new DatagramPacket(image1,3000);
socket.receive(receivePacket);
ByteArrayInputStream bais = new ByteArrayInputStream
(image1,0,receivePacket.getLength());
BufferedImage img = ImageIO.read(bais);
image = img;
cav.repaint();
socket.receive(receivePacket);
socket.close();
}catch(Exception en){
en.printStackTrace();
}
}
public static void main(String[] args)throws Exception {
new UDP2();
}
}
跑起来 点击按钮的时候 服务端那边就停止了。 这边没接收到 , 也没报错
sun.misc.BASE64Encoder
byte[]编码 字符串传输 在解码就OK了