`

UDP获取图片列表,下载图片

阅读更多
这是我们的一次java作业中的一道题目,第一次接触javaUDP,如果哪位觉有需要改正的地方,尽管提出,谢谢!
Client:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.util.Date;
import java.io.*;
import java.awt.image.*;
import javax.imageio.*;
import javax.imageio.ImageIO;
public class GetRemoteImageClient extends JFrame implements Runnable, ActionListener
{
	JTable table;
	Object a[][] ={ 
	    {"", "", ""}
	};
	Object name[] = { "名称", "类型", "大小"};
	JButton GetImage, GetImageData;
	JTextField inputImgName;
	JPanel pSouth, pNorth;
	Thread thread;
	boolean isImage = false;
	GetRemoteImageClient()
	{
		GetImage = new JButton("下载图片");
		GetImageData = new JButton("获得图片列表");
		GetImage.addActionListener(this);
		GetImageData.addActionListener(this);
		inputImgName = new JTextField(20);
		inputImgName.setEnabled(false);
		table = new JTable(a, name);
		pSouth = new JPanel();
		pNorth = new JPanel();
		pNorth.add(new JLabel("输入要下载的图片的名称"));
		pNorth.add(inputImgName);
		pSouth.add(GetImage);
		pSouth.add(GetImageData);
		add(pSouth, BorderLayout.SOUTH);
		add(pNorth, BorderLayout.NORTH);
		add(new JScrollPane(table), BorderLayout.CENTER);
		setBounds(100, 100, 600, 400);
		setVisible(true);
		validate();
		thread = new Thread(this);
		thread.start();
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	}
	public void actionPerformed(ActionEvent e)
	{
		if (e.getSource() == GetImageData)
		{
			Send("图片列表");
		}
		if (e.getSource() == GetImage)
		{
			if (!inputImgName.getText().equals(""))
			{
				JOptionPane.showMessageDialog(null, inputImgName.getText());
				Send(inputImgName.getText());
				isImage = true;
			}
			else
				JOptionPane.showMessageDialog(null, "请选中要下载的图片!");
		}

	}
	public void Send(String msg)
	{
		byte b[] = msg.getBytes();
		try
		{
			InetAddress address = InetAddress.getByName("127.0.0.1");
			DatagramPacket data = new DatagramPacket(b, b.length, address, 5678);
			DatagramSocket mail = new DatagramSocket();
			mail.send(data);
		}
		catch (Exception ex)
		{ }
	}
	public void run()
	{
		DatagramPacket pack = null;
		DatagramSocket mail = null;
		byte b[] = new byte[8192];
		try
		{
			pack = new DatagramPacket(b, b.length);
			mail = new DatagramSocket(1234);
		}
		catch (Exception e)
		{ }
		while (true)
		{
			int i=0;
			try
			{
				mail.receive(pack);
				if (!isImage)
				{
					String message = new String(pack.getData(), 0, pack.getLength());
					GetTableData(message);
				}
				else
				{
					
					String message = new String(pack.getData(), 0, pack.getLength());
					File output = new File("C:\\a.jpg");
					FileOutputStream fos = new FileOutputStream(output);
					int len = Integer.parseInt(message);
					int length = 0;
					while (length < len)
					{
						try
						{
							mail.receive(pack);
							length += pack.getLength();
							JOptionPane.showMessageDialog(null, length);
							fos.write(pack.getData(), 0, pack.getLength());
						}
						catch (Exception e)
						{
							fos.flush();
							fos.close();
						}
					}
					JOptionPane.showMessageDialog(null, "读取完毕,存储中...");
					isImage = false;
				}
				//FormTable();
			}
			catch (Exception ex)
			{ }
		}
	}
	public void GetTableData(String recvData)
	{
		//JOptionPane.showMessageDialog(null, recvData);
		String[] rows = recvData.split("#");
		Object a[][] = new Object[rows.length][3];
		//JOptionPane.showMessageDialog(null, rows);
		for (int i = 0;i< rows.length; i++)
		{
			String columns[] = rows[i].split(",");
			for (int j = 0; j < columns.length; j++)
			{
				if (j == columns.length - 1)
					a[i][j] = new Date(Long.parseLong(columns[j]));
				else
					a[i][j] = columns[j];
			}
		} 
		
		getContentPane().removeAll();
		table = new JTable(a, name);
		table.setRowHeight(20);//设置每行的高度为20
		//table.setRowHeight(0, 30);//设置第1行的高度为15
		table.addMouseListener(new MouseAdapter()
		{
			public void mouseClicked(MouseEvent e)
			{
				String value = table.getValueAt(table.getSelectedRow(), 0).toString();
				inputImgName.setText(value);
			}
		});
		table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		//table.setEnabled(false);
		add(new JScrollPane(table), BorderLayout.CENTER);
		add(pSouth, BorderLayout.SOUTH);
		add(pNorth, BorderLayout.NORTH);
		validate();
	}
	public static void main(String args[])
	{
		new GetRemoteImageClient();
	}
}


Server
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.Date;
public class ImageServer implements Runnable
{
	File dir = new File("C:\\images");
	File fileName[];
	ImageServer()
	{
		Thread thread = new Thread(this);
		thread.start();
	}
	public void Send(byte b[])
	{
		//byte b[] = datas.getBytes();
		try
		{
			InetAddress address = InetAddress.getByName("127.0.0.1");
			DatagramPacket data = new DatagramPacket(b, b.length, address, 1234);
			DatagramSocket mail = new DatagramSocket();
			mail.send(data);
		}
		catch (Exception e)
		{ }
	}
	public void run()
	{
		DatagramPacket pack = null;
		DatagramSocket mail = null;
		byte b[] = new byte[8192];
		try
		{
			pack = new DatagramPacket(b, b.length);
			mail = new DatagramSocket(5678);
		}
		catch (Exception e)
		{ }
		while (true)
		{
			try
			{
				mail.receive(pack);
				String message = new String(pack.getData(), 0, pack.getLength());
				if (message.equals("图片列表"))
				{
					String extendNames = "jpg,jpeg,bmp,png,gif";
					String datas = GetImageInfoFromFile(extendNames);
					Send(datas.getBytes());
				}
				else
				{
					for (int i = 0; i < fileName.length; i++)
					{
						if (message.equals(fileName[i].getName()))
						{
							InputStream is = new FileInputStream(fileName[i]);
							System.out.println(fileName[i].getName());
							//b = new byte[(int)fileName[i].length()];
							String length = ""+fileName[i].length();
							Send(length.getBytes());
							byte[] buffer = new byte[8192];
							int len = 0;
							while ((len = is.read(buffer)) != -1)
							{
								System.out.println(len);
								Send(buffer);
							}
							break;
						}
					}
				}
			}
			catch (Exception ex)
			{ }
		}
	}
	public String GetImageInfoFromFile(String extendNames)
	{
		String data="";
		OnlyExtendName imgFilter = new OnlyExtendName(extendNames);
		dir = new File("C:\\images");
		fileName = dir.listFiles(imgFilter);
		
		for (int i = 0; i < fileName.length; i++)
		{
			System.out.println("文件名称:" + fileName[i].getName() + ",长度:" + fileName[i].length() + ",修改时间:" + new Date(fileName[i].lastModified()));
			data += fileName[i].getName() + "," + fileName[i].length() + "," + fileName[i].lastModified() + "#";
		}
		data = data.substring(0, data.length() - 1);
		return data;
	}
	public static void main(String args[])
	{
		new ImageServer();
	}
}

class OnlyExtendName implements FilenameFilter
{
	/*
	 * 扩展名数组
	 * */
	private String[] extendName;

	public OnlyExtendName(String extendNames)
	{
		this.extendName = extendNames.split(",");
	}

	public boolean accept(File dir, String name)
	{
		if (extendName != null)
		{ 
			boolean isAccept = false;
			for (int i = 0; i < extendName.length; i++)
			{
				isAccept = isAccept || name.endsWith("." + extendName[i]);
			}
			return isAccept;
		}
		return false;
	}
}

小结:之前计算机网络课,制作了一个C#的聊天程序TCP的,因为TCP是面向连接的,所以使用异步,但是UDP不同,无连接的数据报传送,只管网服务端的端口发送,收没收到不清楚。
0
0
分享到:
评论

相关推荐

    Qt5--UDP图片的发送与接收

    在本文中,我们将深入探讨如何在Qt5框架下利用UDP协议进行图片的发送与接收。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它以较小的开销提供了较高的传输效率,因此在实时应用或者对速度有...

    java基于UDP实现图片群发功能

    在服务器端,可能会有一个循环不断地接收来自客户端的数据报,然后解析数据报,获取发送者的`SocketAddress`,并将图片数据转发回所有在线的客户端。这个过程可能会涉及多线程处理,以确保并发接收和发送的效率。 ...

    C#的Socket实现UDP协议通信

    `getIPAddress()` 方法通过调用 `Dns.GetHostByName()` 和 `Dns.GetHostName()` 来获取本地计算机的IP地址列表,并返回第一个有效的IP地址。 #### IP与端口号的有效性验证 `getValidPort()` 和 `getValidIP()` ...

    lua下载图片

    使用`socket.http`模块,你可以发送GET请求来获取HTTP资源,例如图片。 2. **发起GET请求**: 要下载图片,你需要构造一个GET请求到图片的URL。以下是一个简单的示例: ```lua local http = require("socket....

    两台Android设备间通过UDP传送目录内的文件

    "55 aa 99 02 + 服务器的设备名称",表示服务器接收到广播后,响应客户端请求,把此包指定IP发送客户端(此指定IP地址可以UDP广播信息包中获取) * 3. "55 aa 99 03",表示客户端接收到服务器的响应,接着向服务器...

    QT扫描+UDP通信

    发送端可能会调用QT的QImage或QPixmap类处理图片,同时使用QCamera类获取摄像头的实时流。这些数据经过编码后,可以通过UDP发送。接收端则需要解码接收到的图像数据,并用QT的相应组件显示。 5. **事件驱动编程**:...

    java网络编程,UDP,发送16进制报文。

    假设我们已经从数据库获取了Base64编码的图片,将其转换为字节数组后,可以按照UDP报文大小限制(通常为65535字节)进行拆分,逐个发送: ```java byte[] base64ImageBytes = Base64.getDecoder().decode(base64...

    opencv+udp+c++ 的摄像头实时传输显示源码

    opencv+udp+c++的摄像头实时传输显示源码,里面包括client server两个c++源代码。用的时候需要导入opencv库和附加依赖项WS2_32.lib。在开发板也测试过。只需在开发板上移植opencv的动态链接库(该库我已经上传)和...

    C#基于Udp的屏幕实时传输

    在IT领域,网络通信是至关重要的部分,而UDP(用户数据报协议)作为一种无连接的、不可靠的传输协议,常用于实时数据传输,如音视频流媒体等。本项目"基于UDP的屏幕实时传输"利用C#语言实现了客户端与服务器端的屏幕...

    java UDP报文的发送与接收

    Java UDP(用户数据报协议)是网络编程中的一个...同时,`Java.jpg`可能是一张关于Java UDP编程的图片,用于辅助理解或展示相关概念。在实际应用中,通常会使用多线程处理多个并发的UDP连接,以提高服务器的处理能力。

    一个捕获屏幕并以UDP传输的控件

    压缩包子文件的文件名称列表中,"ScrSpy.dcr"和"BufferUDP.dcr"可能是Delphi或C++ Builder中的资源文件,用于在运行时提供控件的可视化表示。“ScreenSpy.dpk”是Delphi的项目包文件,包含了关于项目的元数据和编译...

    C#UDP屏幕监控

    在C#中,我们可以利用GDI+或DirectX等图形库获取屏幕快照,然后将其转换为适合网络传输的格式,如JPEG或PNG。这里提到的“图片局部刷新原理”是指只传输屏幕发生改变的部分,而不是整个屏幕。这种优化策略大大降低了...

    局域网中控视频播放器,udp,tcp,串口,web控制,语音识别控制

    支持视频图片、音频、ppt,网页h5,网络串流、采集卡等设备一键无缝切换。 支持全屏拉伸模式,和保持视频原有比例模式播放。 支持多主机同步播放,设置简单。 支持时间轴联动功能,控制沙盘灯光等场景拜变换。 支持...

    udp的demo,没什么好说的

    5. **udp.qrc**:在Qt开发环境中,这是资源文件,可以用来将非源代码文件(如图片、音频等)集成到应用程序中,但在这个上下文中可能并非直接与UDP通信有关。 6. **udp.sln**:这是Visual Studio的解决方案文件,...

    IE-UDP-全汉化帮助

    这个.chm文件是一种Windows平台上的帮助文档格式,通常包含了丰富的文本、图片和超链接,便于用户查阅和学习。下面我们将深入探讨这个指南可能包含的重要知识点: 1. **UDP(User Datagram Protocol)介绍**:UDP是...

    VC 基于UDP协议的局域网通信工具

    **VC++实现基于UDP协议的局域网通信工具详解** 在计算机网络编程中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议,相较于TCP(传输控制协议),它提供了更低的延迟和更高的...

    vs2015做的基于UDP的网络聊天小程序

    - 它需要获取本地IP地址和端口号,这可以使用IPAddress和IPEndPoint类来实现,获取到后,这些信息会被附加到数据报中。 - 发送端通过UdpClient.Send方法将数据发送到指定的远程IP地址和端口。 4. **接收端...

    ESP32获取图像,并通过电脑端服务器显示图像

    它通过创建一个UDP socket,绑定到本地IP地址和端口,通过ESP32-CAM获取JPEG的图像数据流,然后通过UDP通信把数据传输到服务器端,服务器获取到数据后,将数据解码为图像并在窗口中显示。用户可以通过按下键盘上的"q...

    Java——UDP,tcp聊天室,基本功能实现,适合新手,发送表情,字体

    客户端则使用Socket类连接服务器,通过getOutputStream()和getInputStream()方法获取输入输出流,实现数据发送和接收。 对于UDP通信,DatagramSocket类被用来发送和接收数据报。服务器端创建一个DatagramSocket并...

Global site tag (gtag.js) - Google Analytics