【Server代码】package programming;import java.io.FileInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Arrays;import javax.swing.ImageIcon;public class Server {
private byte[] bytes=new byte[1024];
private ImageIcon img=new ImageIcon("D:\\Java\\javaCompetition\\1.jpg");
public Server(){
try {
DatagramSocket ds_server=new DatagramSocket(8000);
DatagramPacket dp_receive=new DatagramPacket(bytes,bytes.length);
DatagramPacket dp_send=new DatagramPacket(bytes,bytes.length);
while(true){
ds_server.receive(dp_receive);
System.out.println("客户的地址:"+dp_receive.getAddress());
dp_send.setAddress(dp_receive.getAddress());
dp_send.setPort(dp_receive.getPort());
FileInputStream fis=new FileInputStream("D:\\Java\\javaCompetition\\1.jpg");
byte[] ImgData=new byte[fis.available()];
while((fis.read(ImgData,0,ImgData.length))!=-1)
dp_send.setData(ImgData);
ds_server.send(dp_send);
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Server();
}
}
【Client代码】package programming;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;import javax.swing.*;public class Client extends JFrame implements ActionListener{
private byte[] bytes=new byte[1024];
private JButton getImg=new JButton("获取服务器图像");
private ImageIcon img;
private JLabel jl=new JLabel();
private InetAddress address;
private DatagramSocket ds_client;
private DatagramPacket dp_receive;
private DatagramPacket dp_send;
public Client()
{
try{
ds_client=new DatagramSocket();
dp_receive=new DatagramPacket(bytes,bytes.length);
address=InetAddress.getByName("127.0.0.1");
dp_send=new DatagramPacket(bytes,bytes.length,address,8000);
getImg.addActionListener(this);
this.add(getImg,BorderLayout.NORTH);
this.add(jl,BorderLayout.CENTER);
this.setLocationRelativeTo(null);
this.setSize(300, 300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
catch(IOException ie)
{ie.printStackTrace();}
} public void actionPerformed(ActionEvent e)
{
if(e.getSource()==getImg)
{
try{
/*Arrays.fill(bytes, (byte)0);*/
ds_client.send(dp_send);
ds_client.receive(dp_receive);
System.out.println(dp_receive.getLength());
img=new ImageIcon(dp_receive.getData());
jl.setIcon(img);
}catch(IOException ie)
{ie.printStackTrace();}
}
} public static void main(String[] args)
{
new Client();
}
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Arrays;import javax.swing.ImageIcon;public class Server {
private byte[] bytes=new byte[1024];
private ImageIcon img=new ImageIcon("D:\\Java\\javaCompetition\\1.jpg");
public Server(){
try {
DatagramSocket ds_server=new DatagramSocket(8000);
DatagramPacket dp_receive=new DatagramPacket(bytes,bytes.length);
DatagramPacket dp_send=new DatagramPacket(bytes,bytes.length);
while(true){
ds_server.receive(dp_receive);
System.out.println("客户的地址:"+dp_receive.getAddress());
dp_send.setAddress(dp_receive.getAddress());
dp_send.setPort(dp_receive.getPort());
FileInputStream fis=new FileInputStream("D:\\Java\\javaCompetition\\1.jpg");
byte[] ImgData=new byte[fis.available()];
while((fis.read(ImgData,0,ImgData.length))!=-1)
dp_send.setData(ImgData);
ds_server.send(dp_send);
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
new Server();
}
}
【Client代码】package programming;import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;import javax.swing.*;public class Client extends JFrame implements ActionListener{
private byte[] bytes=new byte[1024];
private JButton getImg=new JButton("获取服务器图像");
private ImageIcon img;
private JLabel jl=new JLabel();
private InetAddress address;
private DatagramSocket ds_client;
private DatagramPacket dp_receive;
private DatagramPacket dp_send;
public Client()
{
try{
ds_client=new DatagramSocket();
dp_receive=new DatagramPacket(bytes,bytes.length);
address=InetAddress.getByName("127.0.0.1");
dp_send=new DatagramPacket(bytes,bytes.length,address,8000);
getImg.addActionListener(this);
this.add(getImg,BorderLayout.NORTH);
this.add(jl,BorderLayout.CENTER);
this.setLocationRelativeTo(null);
this.setSize(300, 300);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
catch(IOException ie)
{ie.printStackTrace();}
} public void actionPerformed(ActionEvent e)
{
if(e.getSource()==getImg)
{
try{
/*Arrays.fill(bytes, (byte)0);*/
ds_client.send(dp_send);
ds_client.receive(dp_receive);
System.out.println(dp_receive.getLength());
img=new ImageIcon(dp_receive.getData());
jl.setIcon(img);
}catch(IOException ie)
{ie.printStackTrace();}
}
} public static void main(String[] args)
{
new Client();
}
}
如果不想改缓冲区的话,那就Server根据图像的大小 分多次上传图片,Client处整合,之后显示。
我以前写代码时候总是不敢new对象,总是深怕new出的对象太多会影响性能,并且使用全局对象,操作简单方便。
现在我想说的是:1.相信虚拟机,2.不管用什么佷戳的方法,先把功能做出来,3.程序改进。
所以,
DatagramPacket dp_receive=new DatagramPacket(bytes,bytes.length);
DatagramPacket dp_send=new DatagramPacket(bytes,bytes.length);
这2个对象的缓冲区是在发送和和接受时才能确定的。
所以:
FileInputStream fis=new FileInputStream("D:\\Java\\javaCompetition\\1.jpg");
byte[] bytes=将fis转成字节;
DatagramPacket dp_send=new DatagramPacket(bytes,bytes.length);
ds_server.send(dp_send);