【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();
}
}

解决方案 »

  1.   

    你这样传一次,图片数据太大,当然只能传一部分图片,
    如果不想改缓冲区的话,那就Server根据图像的大小 分多次上传图片,Client处整合,之后显示。
      

  2.   

    我也想这样做,不过,Client处该怎么整合呢?把ds_client.receive(dp_receive)放在循环里面吗?。。求解。
      

  3.   

    我是前一阵看到关于大文件上传的问题,他是采取随机文件读取RandomAccessFile,就是把文件的每段标号,传的时候要告诉对方,这段标号,长度,之后接收方根据标号和长度,随机写入文件指定的位置。这个很像最底层TCP/IP的传包机制~传送和接受两方都应该 循环,传送循环传送直到传完,接收方循环接收写入文件
      

  4.   

    干嘛给DatagramPacket用bytes定死死的呢。
    我以前写代码时候总是不敢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);
      

  5.   

    关键是Client处的代码啊,貌似你这几句我的也是这样写的呀,呵呵,Client代码能写出来看看吗。在线等。