这是我们的一次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不同,无连接的数据报传送,只管网服务端的端口发送,收没收到不清楚。
分享到:
相关推荐
在本文中,我们将深入探讨如何在Qt5框架下利用UDP协议进行图片的发送与接收。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它以较小的开销提供了较高的传输效率,因此在实时应用或者对速度有...
在服务器端,可能会有一个循环不断地接收来自客户端的数据报,然后解析数据报,获取发送者的`SocketAddress`,并将图片数据转发回所有在线的客户端。这个过程可能会涉及多线程处理,以确保并发接收和发送的效率。 ...
`getIPAddress()` 方法通过调用 `Dns.GetHostByName()` 和 `Dns.GetHostName()` 来获取本地计算机的IP地址列表,并返回第一个有效的IP地址。 #### IP与端口号的有效性验证 `getValidPort()` 和 `getValidIP()` ...
使用`socket.http`模块,你可以发送GET请求来获取HTTP资源,例如图片。 2. **发起GET请求**: 要下载图片,你需要构造一个GET请求到图片的URL。以下是一个简单的示例: ```lua local http = require("socket....
"55 aa 99 02 + 服务器的设备名称",表示服务器接收到广播后,响应客户端请求,把此包指定IP发送客户端(此指定IP地址可以UDP广播信息包中获取) * 3. "55 aa 99 03",表示客户端接收到服务器的响应,接着向服务器...
发送端可能会调用QT的QImage或QPixmap类处理图片,同时使用QCamera类获取摄像头的实时流。这些数据经过编码后,可以通过UDP发送。接收端则需要解码接收到的图像数据,并用QT的相应组件显示。 5. **事件驱动编程**:...
假设我们已经从数据库获取了Base64编码的图片,将其转换为字节数组后,可以按照UDP报文大小限制(通常为65535字节)进行拆分,逐个发送: ```java byte[] base64ImageBytes = Base64.getDecoder().decode(base64...
opencv+udp+c++的摄像头实时传输显示源码,里面包括client server两个c++源代码。用的时候需要导入opencv库和附加依赖项WS2_32.lib。在开发板也测试过。只需在开发板上移植opencv的动态链接库(该库我已经上传)和...
在IT领域,网络通信是至关重要的部分,而UDP(用户数据报协议)作为一种无连接的、不可靠的传输协议,常用于实时数据传输,如音视频流媒体等。本项目"基于UDP的屏幕实时传输"利用C#语言实现了客户端与服务器端的屏幕...
Java UDP(用户数据报协议)是网络编程中的一个...同时,`Java.jpg`可能是一张关于Java UDP编程的图片,用于辅助理解或展示相关概念。在实际应用中,通常会使用多线程处理多个并发的UDP连接,以提高服务器的处理能力。
压缩包子文件的文件名称列表中,"ScrSpy.dcr"和"BufferUDP.dcr"可能是Delphi或C++ Builder中的资源文件,用于在运行时提供控件的可视化表示。“ScreenSpy.dpk”是Delphi的项目包文件,包含了关于项目的元数据和编译...
在C#中,我们可以利用GDI+或DirectX等图形库获取屏幕快照,然后将其转换为适合网络传输的格式,如JPEG或PNG。这里提到的“图片局部刷新原理”是指只传输屏幕发生改变的部分,而不是整个屏幕。这种优化策略大大降低了...
支持视频图片、音频、ppt,网页h5,网络串流、采集卡等设备一键无缝切换。 支持全屏拉伸模式,和保持视频原有比例模式播放。 支持多主机同步播放,设置简单。 支持时间轴联动功能,控制沙盘灯光等场景拜变换。 支持...
5. **udp.qrc**:在Qt开发环境中,这是资源文件,可以用来将非源代码文件(如图片、音频等)集成到应用程序中,但在这个上下文中可能并非直接与UDP通信有关。 6. **udp.sln**:这是Visual Studio的解决方案文件,...
这个.chm文件是一种Windows平台上的帮助文档格式,通常包含了丰富的文本、图片和超链接,便于用户查阅和学习。下面我们将深入探讨这个指南可能包含的重要知识点: 1. **UDP(User Datagram Protocol)介绍**:UDP是...
**VC++实现基于UDP协议的局域网通信工具详解** 在计算机网络编程中,UDP(User Datagram Protocol,用户数据报协议)是一种无连接的、不可靠的传输层协议,相较于TCP(传输控制协议),它提供了更低的延迟和更高的...
- 它需要获取本地IP地址和端口号,这可以使用IPAddress和IPEndPoint类来实现,获取到后,这些信息会被附加到数据报中。 - 发送端通过UdpClient.Send方法将数据发送到指定的远程IP地址和端口。 4. **接收端...
它通过创建一个UDP socket,绑定到本地IP地址和端口,通过ESP32-CAM获取JPEG的图像数据流,然后通过UDP通信把数据传输到服务器端,服务器获取到数据后,将数据解码为图像并在窗口中显示。用户可以通过按下键盘上的"q...
客户端则使用Socket类连接服务器,通过getOutputStream()和getInputStream()方法获取输入输出流,实现数据发送和接收。 对于UDP通信,DatagramSocket类被用来发送和接收数据报。服务器端创建一个DatagramSocket并...