`

UDP接收发送图片

阅读更多
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

    在"udp发送接收图片含demo"的场景中,我们需要创建两个Socket,一个用于发送图片,另一个用于接收图片。发送端首先读取图片文件内容,然后将其封装到UDP的数据报文(Datagram)中,最后通过sendto函数将数据报文发送...

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

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

    84 基于Qt设计的UDP协议图像传输软件(Qt接收UDP协议传递过来的图像实时显示).zip

    UDP图像采集发送端: 循环采集当前摄像头的图像数据,编码成JPG图像格式,然后通过UDP协议发送给指定的地址和端口。发送每帧JPG图像时,以十六进制 0xA1 0xA2...python代码发送、Qt接收UDP协议传递过来的图像实时显示。

    java UDP报文的发送与接收

    接下来,我们将详细讨论如何在Java中发送和接收UDP报文。 一、发送UDP报文 发送UDP报文主要涉及以下几个步骤: 1. **创建DatagramSocket**:首先,我们需要创建一个`DatagramSocket`实例,这将代表我们的UDP...

    tcpudp接收测试工具.rar

    socket,tcp、udp接收工具;作为接收端;不能作为发送端;小工具;

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

    在Java中,我们使用`java.net.DatagramSocket`类来创建一个UDP套接字,用于发送和接收数据报。`DatagramPacket`类用于封装我们要发送的数据和目标地址。以下是一个简单的UDP客户端示例: ```java import java.io....

    qt实现udp通讯可收发文字和图片

    3. **发送图片数据**:发送图片涉及到二进制数据的处理。首先,需要将图片转换为字节数组,例如,可以使用`QImage`和`QBuffer`将图片对象编码成JPEG或PNG格式,然后利用`writeDatagram()`函数发送。 4. **接收数据*...

    C#的Socket实现UDP协议通信

    其主要特点是无连接且不可靠的数据传输,这意味着UDP在发送数据时不会建立连接,也不会确认数据是否被接收方成功接收。这种特性使得UDP在数据传输速度和资源消耗上比TCP更优,适合于对实时性和速度有较高要求的应用...

    UDP实时图像传输.zip

    本资源内有两个C#窗体项目,一个是图像发送端,一个是图像接收端。发送端使用EmguCV读取摄像头图像,压缩为JPEG格式后使用UDP发送至接收端,接收端接收图像并进行显示。注释丰富,另外还有详细的介绍博客

    opencv UDP协议的摄像头视频实时传输

    2. 在循环中接收来自发送端的数据包,考虑到UDP的不可靠性,需要处理可能的数据包乱序和丢失。 3. 接收到的数据包可能包含多个连续帧的一部分,需要正确重组这些帧,恢复原始图像数据。 4. 对接收到的数据解码,例如...

    基于UDP的Java大数据传输

    UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...

    自己写的UDP传输并显示图片类

    4. 发送图片数据:将图片的字节数组封装到 `DatagramPacket` 中,并发送到接收端。 然后,`MulticastImageReceiverByCombineFile.java` 文件可能表示接收端的代码。接收端的工作流程可能包括: 1. 创建 `...

    84 基于Qt设计的UDP协议图像传输软件(实时图传).zip

    发送每帧JPG图像时,以十六进制 0xA1 0xA2 0xA3 开头,接着用2个字节保存图片的宽,接着用2个字节保存图片的高,然后接着就是完整的JPG图像,最后结尾以十六进制 0xB1 0xB2 0xB3 结尾。 Qt是属于图像接收端,收到图像...

    FPGA UDP视频/图片数据传输(QT实现)

    1、可以让pc通过udp与FPGA之间双向传输视频/图片。 2、udp传图的数据不经过压缩按:R(8bit)、G(8bit)、B(8bit)一个像素点一个像素点传输。 小白边学边写的,可能有很多问题,仅供参考!

    基于c++的udp传输,传送超过10M的文件

    总结来说,基于C++的UDP大文件传输涉及到了网络编程的基本原理,包括套接字的创建、绑定、监听、接收和发送,以及数据分块、确认机制、错误处理和文件I/O操作。在实际开发中,我们需要充分理解UDP的特点,设计出可靠...

    python实现udp传输图片功能

    因此,需要分批次发送图片数据。客户端先发送一个包含图片总长度的头部信息,服务器接收到头部后,根据长度循环接收数据,直到接收完整个图片。 6. **struct模块**: - 在分批传输时,使用`struct.pack`将图片长度...

    H265视频流文件解码及UDP发送接收解码并保存成图像文件

    H265裸流基于FFMPEG解码并保存成图像文件,UDP模拟H265裸流数据发送及接收解码并保存成图像文件。

    UDP传输图片文件并显示

    - 客户端:加载图片文件,将其编码成适合网络传输的格式,通过UDP socket发送到服务器的指定端口。 - 服务器:监听特定端口,接收到数据后,检查完整性(通过校验和),将接收到的二进制流保存为图片文件。 - ...

    使用UDP协议对文件(TXT,hex,gif。bmp等文件的)的完整发送和接收

    在本项目中,我们使用VC++6.0这个经典的C++集成开发环境,来实现基于UDP协议的文件(如TXT文本、HEX十六进制文件、GIF图像和BMP图像等)的发送和接收。 首先,我们要理解UDP通信的基本原理。UDP协议不建立连接,...

    Qt通过UDP传图片 实现自定义分包和组包

    本篇文章将深入探讨如何在Qt中通过UDP协议发送和接收图片,同时实现自定义的分包和组包策略。 首先,理解UDP的基础知识至关重要。UDP是一种无连接的传输层协议,这意味着在发送数据之前不需要建立连接,因此它比TCP...

Global site tag (gtag.js) - Google Analytics