package net; import java.io.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.util.Arrays; /** * 24.编写客户/服务器程序,客户端Client.java使用DatagramSocket对象将数据包发送到服务器, * 请求获取服务器端的图像(考生可自选图像文件)。服务器端Server.java将图像文件包装成数据包, * 并使用DatagramSocket对象将该数据包发送到客户端。首先将服务器端的程序编译通过, * 并运行起来,等待客户的请求。(本题30分) * @since 2010-9-27 * @start 4:57 * @end 2010-9-28 1:47 * */ public class TwentyFout_ImageTransfer { public static void main(String[] args){ ITClient client=new ITClient(); ITServer server=new ITServer(); try{ server.init(); server.start(); Thread.sleep(1000); client.init(); client.start(); } catch(Exception e){ e.printStackTrace(); } } } class ITServer{ Thread t=null; DatagramSocket ds=null; byte[] data=new byte[10240]; DatagramPacket dp=null; File file=null; FileInputStream fis=null; public void init()throws Exception{ ds=new DatagramSocket(5678); dp=new DatagramPacket(data,data.length); file=new File("src/net/t50.jpg"); fis=new FileInputStream(file); } public void start(){ t=new Thread(){ public void run(){ System.out.println("Sever start:"); while(true){ try{ ds.receive(dp); String ip=new String("127.0.0.1"); { System.out.println("connection:"+ip); fis=new FileInputStream(file); try{ while(fis.read(data)!=-1){ System.out.println("data"+Arrays.toString(data)); Thread.sleep(100); System.out.println("wake and send"); dp=new DatagramPacket(data,data.length,InetAddress.getByName(ip),5679); ds.send(dp); } fis.close(); Thread.sleep(200000); String end="end"; dp=new DatagramPacket(end.getBytes(),end.length(),InetAddress.getByName(ip),5679); ds.send(dp); System.out.println("send end!"); } catch(Exception e){ e.printStackTrace(); } System.out.println("wating..."); } } catch(SocketTimeoutException out){ } catch(Exception e){ e.printStackTrace(); } } } }; t.start(); } } class ITClient extends JFrame{ JPanel panel=new JPanel(); JLabel label=new JLabel(); Icon icon=null; JButton btn=null; DatagramSocket ds=null; DatagramPacket dp=null; byte[] data=new byte[10240]; FileOutputStream fos=null; File temp=null; Icon image=null; public void init()throws Exception{ this.setBounds(111, 111, 800, 600); this.setLayout(new GridLayout(1,2)); btn=new JButton(); btn.setText("Get Image!"); this.add(label); this.add(btn); ds=new DatagramSocket(5679); ds.setSoTimeout(5000); dp=new DatagramPacket(data,data.length); temp=new File("src/net/temp.jpg"); this.setVisible(true); this.validate(); } public void start(){ btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ try{ fos=new FileOutputStream(temp); if(ds.isClosed()){ ds=new DatagramSocket(5679); } //ds.connect(InetAddress.getLocalHost(), 5678); String ip="127.0.0.1"; DatagramPacket head=new DatagramPacket(ip.getBytes(),ip.length(),InetAddress.getByName("127.0.0.1"),5678); ds.send(head); ds.receive(dp); while(dp!=null&&dp.getData().length>1){ String str=new String(data); if(str.startsWith("end")){ break; } System.out.println("received"); data=dp.getData(); fos.write(data); ds.receive(dp); } } catch(SocketTimeoutException e){ System.out.println("Time out auto show recived image data !!"); } catch(Exception ee){} finally{ try{ fos.close(); ds.close(); System.out.println("``````````````end of receive!"); image=new ImageIcon(temp.getAbsolutePath()); label.setIcon(image); label.validate(); } catch(Exception e){} } } }); } }