今天解决了一个困扰好几天的问题,由于比赛需要,需要用java语言,并采用UDP传输协议,让树莓派与服务器(就是本机)建立连接传输视频,图片。

由于UDP是建立在无连接的协议上,因此就碰到了一个很尴尬的问题,就是客户端一直发送,但是在本地服务器就是接收不到数据,最恶心的是根本不报错,所以根本不知道错在了哪。在讲过查阅资料后,终于解决了该问题,

1.首先,要先将树莓派和本地服务器的防火墙都关掉。

2.其次就是代码中的一些参数需要注意,具体代码如下:

package UDPTest;

import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
import java.net.InetAddress;  
 
public class Client {  
   public static void main(String[] args) {  
       try {  
           // 创建发送方的套接字,IP默认为本地,端口号随机  
           DatagramSocket sendSocket = new DatagramSocket();  
 
           // 确定要发送的消息:  
           String mes = "你好!接收方!";  
 
           // 由于数据报的数据是以字符数组传的形式存储的,所以传转数据  
           byte[] buf = mes.getBytes();  
 
           // 确定发送方的IP地址及端口号,地址为本地机器地址  
           int port = 12306;  
//这里填写的服务器的IP地址 InetAddress ip
= InetAddress.getByName("192.168.43.57"); // 创建发送类型的数据报: DatagramPacket sendPacket = new DatagramPacket(buf, buf.length,ip, port); // 通过套接字发送数据: sendSocket.send(sendPacket); // 确定接受反馈数据的缓冲存储器,即存储数据的字节数组 byte[] getBuf = new byte[1024]; // 创建接受类型的数据报 DatagramPacket getPacket = new DatagramPacket(getBuf, getBuf.length); // 通过套接字接受数据 sendSocket.receive(getPacket); // 解析反馈的消息,并打印 String backMes = new String(getBuf, 0, getPacket.getLength()); System.out.println("接受方返回的消息:" + backMes); // 关闭套接字 sendSocket.close(); } catch (Exception e) { e.printStackTrace(); } } }

接收端代码如下:

package UDPTest;

import java.net.DatagramPacket;  
import java.net.DatagramSocket;  
import java.net.InetAddress;  
import java.net.SocketAddress;  
 
public class Server {  
   public static void main(String[] args) {  
       try {  
           // 确定接受方的IP和端口号,IP地址为本地机器地址  
           InetAddress ip = InetAddress.getLocalHost();  
           int port = 12306;  
 
           // 创建接收方的套接字,并制定端口号和IP地址  
           DatagramSocket getSocket = new DatagramSocket(port, ip);  
 
           // 确定数据报接受的数据的数组大小  
           byte[] buf = new byte[1024];  
 
           // 创建接受类型的数据报,数据将存储在buf中  
           DatagramPacket getPacket = new DatagramPacket(buf, buf.length);  
 
           // 通过套接字接收数据  
           getSocket.receive(getPacket);  
 
           // 解析发送方传递的消息,并打印  
           String getMes = new String(buf, 0, getPacket.getLength());  
           System.out.println("对方发送的消息:" + getMes);  
 
           // 通过数据报得到发送方的IP和端口号,并打印  
           InetAddress sendIP = getPacket.getAddress();  
           int sendPort = getPacket.getPort();  
           System.out.println("对方的IP地址是:" + sendIP.getHostAddress());  
           System.out.println("对方的端口号是:" + sendPort);  
 
           // 通过数据报得到发送方的套接字地址  
           SocketAddress sendAddress = getPacket.getSocketAddress();  
 
           // 确定要反馈发送方的消息内容,并转换为字节数组  
           String feedback = "接收方说:我收到了!";  
           byte[] backBuf = feedback.getBytes();  
 
           // 创建发送类型的数据报  
           DatagramPacket sendPacket = new DatagramPacket(backBuf,  
                   backBuf.length, sendAddress);  
 
           // 通过套接字发送数据  
           getSocket.send(sendPacket);  
 
           // 关闭套接字  
           getSocket.close();  
       } catch (Exception e) {  
           e.printStackTrace();  
       }  
   }  
}  

注:在接收端只需要填写接收的端口号即可,前提是服务器端 和客户端端口一致,并且没有被占用。

在启动时要先启动服务端,在启动客户端。

其次就是注意其中DatagramPacket的构造参数的问题。

运行程序结果如下:

客户端:

 

 

接收端:

如果还有别的什么问题,请留言联系。