1、编写客户/服务器程序,客户端Client.java使用DatagramSocket对象将数据包发送到服务器,请求获取服务器端的图像,服务器端Server.java将图像文件包装成数据包,并使用DatagramSocket对象将该数据包发送到客户端。首先将服务器端的程序编译通过,并运行起来,等待客户的请求。
public class UDPServerExample implements Runnable {
private DatagramSocket socket = null;
private DatagramPacket receivePacket = null, sendPacket = null;
public static void main(String args[]) {
new UDPServerExample().start();
}
public void start() {
try {
socket = new DatagramSocket(7000);
new Thread(this).start();//启动线程
} catch (Exception e) {
}
}
public void run() {
try {
while (true) {
byte[] buf = new byte[50];
receivePacket = new DatagramPacket(buf, buf.length);
socket.receive(receivePacket);
if(receivePacket.getLength() > 0) { //接收到请求
System.out.println("客户机的地址:" + receivePacket.getAddress().getHostAddress());
System.out.println("正在等待");
sendData(receivePacket.getAddress(),receivePacket.getPort());
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void close() {
}
public void sendData(InetAddress address,int post) {
FileInputStream fis = null;
try {
byte[] buf = new byte[3072];
fis = new FileInputStream(new File("c://1.jpg"));
int read = 0;
while((read=fis.read(buf)) != -1) {
sendPacket = new DatagramPacket(buf, read,address,post);
socket.send(sendPacket);
Thread.sleep(5);
}
// 文件发送完毕,再发送一个数据报通知客户端
if(read == -1) {
ByteArrayOutputStream out = new ByteArrayOutputStream();
PrintStream pout = new PrintStream(out);
pout.print("end");
buf = out.toByteArray();
sendPacket = new DatagramPacket(buf, buf.length, address, post);
socket.send(sendPacket);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(fis != null){
fis.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2、客户端
public class UDPClientExample extends JFrame implements ActionListener,Runnable {
private static final long serialVersionUID = 1L;
private DatagramSocket socket = null;
private DatagramPacket receivePacket = null, sendPacket = null;
private JButton button = new JButton("获取图像");
private JLabel label = new JLabel();
private String serverIp = "127.0.0.1";
private int serverPort = 7000;
public UDPClientExample() {
this.setTitle("I am a client");
this.setSize(500, 500);
this.setLocationRelativeTo(null);
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
button.addActionListener(this);
this.add(button, "North");
this.add(label, "Center");
this.setVisible(true);
try {
// 创建一个DatagramSocket,使用随机端口
socket = new DatagramSocket();
} catch (SocketException e1) {
e1.printStackTrace();
}
}
public void start() {
sendMessage(); //发送请求
new Thread(this).start();//启动线程
}
public static void main(String args[]) {
new UDPClientExample();
}
public void actionPerformed(ActionEvent e) {
start();
}
public void sendMessage() {
try {
byte[] buf = new byte[]{'g','e','t'};
sendPacket = new DatagramPacket(buf, buf.length, InetAddress
.getByName(serverIp), serverPort);
socket.send(sendPacket);
buf = null;
button.setEnabled(false);
} catch (Exception e) {
e.printStackTrace();
}
}
public void run() {
receiveData();
}
public void receiveData() {
try {
byte[] total = new byte[500*1024];
int start = 0;
byte buf[] = new byte[3072];
while (true) {
receivePacket = new DatagramPacket(buf, buf.length);
socket.receive(receivePacket);
ByteArrayInputStream bin = new ByteArrayInputStream(
receivePacket.getData());
BufferedReader read = new BufferedReader(new InputStreamReader(
bin));
String str = read.readLine();
if(str.startsWith("end")) {
break;
}
buf = receivePacket.getData();
// 将buf数组里的数据复制到total数组中
System.arraycopy(buf, 0, total, start, receivePacket.getLength());
start += receivePacket.getLength();
}
ImageIcon icon = new ImageIcon(total);
label.setIcon(icon);
//button.setEnabled(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
在"udp发送接收图片含demo"的场景中,我们需要创建两个Socket,一个用于发送图片,另一个用于接收图片。发送端首先读取图片文件内容,然后将其封装到UDP的数据报文(Datagram)中,最后通过sendto函数将数据报文发送...
在本文中,我们将深入探讨如何在Qt5框架下利用UDP协议进行图片的发送与接收。UDP(User Datagram Protocol)是一种无连接的、不可靠的传输层协议,它以较小的开销提供了较高的传输效率,因此在实时应用或者对速度有...
UDP图像采集发送端: 循环采集当前摄像头的图像数据,编码成JPG图像格式,然后通过UDP协议发送给指定的地址和端口。发送每帧JPG图像时,以十六进制 0xA1 0xA2...python代码发送、Qt接收UDP协议传递过来的图像实时显示。
接下来,我们将详细讨论如何在Java中发送和接收UDP报文。 一、发送UDP报文 发送UDP报文主要涉及以下几个步骤: 1. **创建DatagramSocket**:首先,我们需要创建一个`DatagramSocket`实例,这将代表我们的UDP...
socket,tcp、udp接收工具;作为接收端;不能作为发送端;小工具;
在Java中,我们使用`java.net.DatagramSocket`类来创建一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类用于封装我们要发送的数据和目标地址。以下是一个简单的UDP客户端示例: ```java import java.io....
3. **发送图片数据**:发送图片涉及到二进制数据的处理。首先,需要将图片转换为字节数组,例如,可以使用`QImage`和`QBuffer`将图片对象编码成JPEG或PNG格式,然后利用`writeDatagram()`函数发送。 4. **接收数据*...
其主要特点是无连接且不可靠的数据传输,这意味着UDP在发送数据时不会建立连接,也不会确认数据是否被接收方成功接收。这种特性使得UDP在数据传输速度和资源消耗上比TCP更优,适合于对实时性和速度有较高要求的应用...
本资源内有两个C#窗体项目,一个是图像发送端,一个是图像接收端。发送端使用EmguCV读取摄像头图像,压缩为JPEG格式后使用UDP发送至接收端,接收端接收图像并进行显示。注释丰富,另外还有详细的介绍博客
2. 在循环中接收来自发送端的数据包,考虑到UDP的不可靠性,需要处理可能的数据包乱序和丢失。 3. 接收到的数据包可能包含多个连续帧的一部分,需要正确重组这些帧,恢复原始图像数据。 4. 对接收到的数据解码,例如...
UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...
4. 发送图片数据:将图片的字节数组封装到 `DatagramPacket` 中,并发送到接收端。 然后,`MulticastImageReceiverByCombineFile.java` 文件可能表示接收端的代码。接收端的工作流程可能包括: 1. 创建 `...
发送每帧JPG图像时,以十六进制 0xA1 0xA2 0xA3 开头,接着用2个字节保存图片的宽,接着用2个字节保存图片的高,然后接着就是完整的JPG图像,最后结尾以十六进制 0xB1 0xB2 0xB3 结尾。 Qt是属于图像接收端,收到图像...
1、可以让pc通过udp与FPGA之间双向传输视频/图片。 2、udp传图的数据不经过压缩按:R(8bit)、G(8bit)、B(8bit)一个像素点一个像素点传输。 小白边学边写的,可能有很多问题,仅供参考!
总结来说,基于C++的UDP大文件传输涉及到了网络编程的基本原理,包括套接字的创建、绑定、监听、接收和发送,以及数据分块、确认机制、错误处理和文件I/O操作。在实际开发中,我们需要充分理解UDP的特点,设计出可靠...
因此,需要分批次发送图片数据。客户端先发送一个包含图片总长度的头部信息,服务器接收到头部后,根据长度循环接收数据,直到接收完整个图片。 6. **struct模块**: - 在分批传输时,使用`struct.pack`将图片长度...
H265裸流基于FFMPEG解码并保存成图像文件,UDP模拟H265裸流数据发送及接收解码并保存成图像文件。
- 客户端:加载图片文件,将其编码成适合网络传输的格式,通过UDP socket发送到服务器的指定端口。 - 服务器:监听特定端口,接收到数据后,检查完整性(通过校验和),将接收到的二进制流保存为图片文件。 - ...
在本项目中,我们使用VC++6.0这个经典的C++集成开发环境,来实现基于UDP协议的文件(如TXT文本、HEX十六进制文件、GIF图像和BMP图像等)的发送和接收。 首先,我们要理解UDP通信的基本原理。UDP协议不建立连接,...
本篇文章将深入探讨如何在Qt中通过UDP协议发送和接收图片,同时实现自定义的分包和组包策略。 首先,理解UDP的基础知识至关重要。UDP是一种无连接的传输层协议,这意味着在发送数据之前不需要建立连接,因此它比TCP...