[导入]利用DataGramPacket和DtaGramSocket编写的从服务端获取图片

[导入]利用DataGramPacket和DtaGramSocket编写的从服务端获取图片

Itat,复赛有道题就是如题的要求。借鉴了别人的代码,自己做了一下。现在将我的

代码贴出,试试。这是我在javaeye的第二篇博客。呵呵……

服务端代码:

package net.udp.myudp;

import java.io.File;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import javax.imageio.stream.FileImageInputStream;

public class Server extends Thread
{

	DatagramSocket ds = null;
	final int len = 128;
	byte [] data = new byte[len];

	public Server()
	{
		try
		{
			ds = new DatagramSocket(1987);
		}
		catch (SocketException e)
		{
//			e.printStackTrace();
		}
	}

	public void getImgae(String path)
	{
		try
		{
			data = null;
			data = new byte[len];
//			System.out.println(new File(path).exists());
			FileImageInputStream fileImg = new FileImageInputStream(new File(
			        path));
			data = new byte[(int) fileImg.length()];
			fileImg.read(data, 0, (int) fileImg.length());
		}
		catch (Exception e)
		{
//			e.printStackTrace();
		}
	}

	public void run()

	{
		while (true)
		{

			DatagramPacket dp = new DatagramPacket(data, data.length);
			try
			{
				System.out.println("-----------------------------------");
				ds.receive(dp);
				String path = new String(dp.getData()).trim();
				System.out.println("已经接收到客户端信息:" + path+"  ["+dp.getAddress()+":"+dp.getPort()+"]");		
				getImgae(path);				
//				System.out.println("图片长度:"+data.length);
				DatagramPacket willsend = new DatagramPacket(data, data.length,
				        dp.getAddress(), dp.getPort());
				ds.send(willsend);
//				System.out.println("已将图片发送至客户端");
				System.out.println("-----------------------------------\n\n\n");
			}
			catch (IOException e)
			{
//				e.printStackTrace();
			}

		}
	}

	public static void main(String [] args)
	{
		new Server().start();
	}
}

客户端代码:

package net.udp.myudp;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Client extends JFrame
{
	DatagramSocket ds = null;
	final int len = 512;
	BufferedImage buImg = null;

	TextField txtpath = new TextField(20);
	

	byte [] data = null;
	JPanel up, down;

	public Client()
	{
		super("获取图片_客户端");
		txtpath.setText("c:\\a.jpg");
		JButton btn = new JButton("点击获取图片");
		btn.addActionListener(new ActionListener()
		{

			public void actionPerformed(ActionEvent arg0)
			{
				send();

			}
		});
		up = new JPanel();

		this.add(up, BorderLayout.CENTER);
		down = new JPanel();
		this.add(down, BorderLayout.SOUTH);
		down.add(txtpath);
		down.add(btn);
		this.setSize(650, 550);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		this.getRootPane().setDefaultButton(btn);
		try
		{
			ds = new DatagramSocket(1012);
		}
		catch (SocketException e)
		{
			e.printStackTrace();
		}
	}

	public void paint(Graphics g)
	{
		super.paint(g);
		if (buImg != null)
		{
//			buImg.setRGB(280,190,200);
//			System.out.println("正在绘制啊");
//			g.setColor(Color.BLUE);
			g.drawImage(buImg, 20, 30, up);
			
//			g.drawString("This is the String",200,160);
		}
		System.out.println("绘制完成");
	}

	public void send()
	{
		data = txtpath.getText().trim().getBytes();
		try
		{
			DatagramPacket dp = new DatagramPacket(data, data.length,
			        InetAddress.getByName("172.17.76.108"), 1987);
			ds.send(dp);

			data = new byte[35000];
			DatagramPacket rec = new DatagramPacket(data, data.length);
			ds.receive(rec);
			System.out.println("rec.length=" + rec.getLength());
			System.out.println("rec.getData().length=" + rec.getData().length);
			InputStream strImg = new ByteArrayInputStream(rec.getData(), 0, rec
			        .getData().length);
			buImg = ImageIO.read(strImg);
			System.out.println("buImg=" + buImg);

			repaint();

		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public static void main(String [] args)
	{
		new Client();
	}
}

先把服务端运行起来,等待客户端连接。客户端运行起来后,输入一个存在的图片路径,点击按钮。即可获取从服务端发送过来的图片,并在绘制在窗体上。
效果如图:




但是有个问题,第一次点击按钮时,没有图片显示,第二次点击才会显示。第三次又没有,第四次又出现……如此循环,不知何故,望知情告知为谢!

已有 0 人发表留言,猛击->>这里<<-参与讨论


JavaEye推荐
  • 参加赢在淘宝,获取开放平台高级权限
  • ThoughtWorks揭秘持续集成之道-相信身为企业核心的您一定不会错过
  • 上海30-40万年薪招聘金融咨询顾问
  • 【杭州】高薪招聘java高级工程师,项目经理,架构师




文章来源: http://lupingzi.javaeye.com/blog/509165

你可能感兴趣的:([导入]利用DataGramPacket和DtaGramSocket编写的从服务端获取图片)