【简单封装】UDP服务端

PZHelp_UDPServer

public class PZHelp_UDPServer extends Thread {
    private static final String TAG = "PZHelp_UDPServer";

    private DatagramSocket socket;
    private DatagramPacket packet;
    private int            port;

    private boolean isUDPServerRunning;

    private ByteReceiveListener   byteListener = null;
    private StringReceiveListener strListener  = null;

    private int receiveType;

    public PZHelp_UDPServer(int port, ByteReceiveListener listener) {
        this.port = port;
        this.byteListener = listener;
        receiveType = 1;
        byte[] data = new byte[2048];
        packet = new DatagramPacket(data, data.length);
    }

    public PZHelp_UDPServer(int port, StringReceiveListener listener) {
        this.port = port;
        this.strListener = listener;
        receiveType = 2;
        byte[] data = new byte[2048];
        packet = new DatagramPacket(data, data.length);
    }

    @Override
    public synchronized void start() {
        super.start();
        isUDPServerRunning = true;
    }

    @Override
    public void run() {
        try {
            socket = new DatagramSocket(port);
            while (isUDPServerRunning && !socket.isClosed()) {
                socket.receive(packet);//阻塞状态
                if (receiveType == 1){
                    byteListener.Receive(packet.getAddress().toString(), getByteArr(packet.getData(), packet.getOffset(), packet.getLength()));
                }else {
                    //接收字符串
                    strListener.Receive(packet.getAddress().toString(),new String(packet.getData(), 0, packet.getLength(),"GBK"));
                }
            }
            socket.close();
        } catch (Exception e) {
            if (receiveType == 1){
                byteListener.onFail(e.getMessage());
            }else {
                //接收字符串
                strListener.onFail(e.getMessage());
            }
        }
    }

    /**
     * 发送数据
     *
     * @param message 数据
     */
    public void send(String message) {
        try {
            if (isUDPServerRunning && !socket.isClosed()) {
                socket.send(new DatagramPacket(message.getBytes(), message.length(), packet.getAddress(), packet.getPort()));
            }
        } catch (IOException e) {
            byteListener.onFail(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 发送数据
     *
     * @param message 数据
     */
    public void send(byte[] message) {
        try {
            if (isUDPServerRunning && !socket.isClosed()) {
                socket.send(new DatagramPacket(message, message.length, packet.getAddress(), packet.getPort()));
            }
        } catch (IOException e) {
            byteListener.onFail(e.getMessage());
            e.printStackTrace();
        }
    }

    private byte[] getByteArr(byte[] data, int start, int length) {
        byte[] ret = new byte[length];
        System.arraycopy(data, start, ret, 0, length);
        return ret;
    }

    void close() {
        isUDPServerRunning = false;
    }

    /**
     * 回调
     */
    public interface ByteReceiveListener {
        void onFail(String err);

        void Receive(String address, byte[] response);
    }

    /**
     * 回调
     */
    public interface StringReceiveListener {
        void onFail(String err);

        void Receive(String address, String response);
    }
}

主函数使用

mUDPServer = new PZHelp_UDPServer(3232, new PZHelp_UDPServer.StringReceiveListener() {
     @Override
     public void onFail(String err) {
         Log.d(TAG, "onFail: " + err);
     }

     @Override
     public void Receive(String address, String response) {
     	//处理数据
     }
 });
 mUDPServer.start();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单封装UDP客户端和服务端的接口的示例代码: ```c // udp.h #ifndef UDP_H #define UDP_H #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> typedef struct { int sockfd; struct sockaddr_in addr; } udp_socket; // 初始化UDP客户端 int udp_client_init(udp_socket *sock, const char *ip, int port); // 发送数据到指定地址 int udp_sendto(udp_socket *sock, const char *ip, int port, const char *data, int len); // 接收数据 int udp_recvfrom(udp_socket *sock, char *ip, int *port, char *buf, int len); // 关闭UDP连接 void udp_close(udp_socket *sock); // 初始化UDP服务端 int udp_server_init(udp_socket *sock, const char *ip, int port); // 监听端口并接收数据 int udp_server_recv(udp_socket *sock, char *ip, int *port, char *buf, int len); #endif ``` ```c // udp.c #include "udp.h" int udp_client_init(udp_socket *sock, const char *ip, int port) { // 创建socket int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); return -1; } // 设置服务器地址 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip); addr.sin_port = htons(port); sock->sockfd = sockfd; sock->addr = addr; return 0; } int udp_sendto(udp_socket *sock, const char *ip, int port, const char *data, int len) { // 设置目标地址 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip); addr.sin_port = htons(port); // 发送数据 int ret = sendto(sock->sockfd, data, len, 0, (struct sockaddr *)&addr, sizeof(addr)); if (ret < 0) { perror("sendto"); return -1; } return 0; } int udp_recvfrom(udp_socket *sock, char *ip, int *port, char *buf, int len) { // 接收数据 struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int ret = recvfrom(sock->sockfd, buf, len, 0, (struct sockaddr *)&addr, &addrlen); if (ret < 0) { perror("recvfrom"); return -1; } // 获取发送方IP地址和端口号 strcpy(ip, inet_ntoa(addr.sin_addr)); *port = ntohs(addr.sin_port); return ret; } void udp_close(udp_socket *sock) { close(sock->sockfd); } int udp_server_init(udp_socket *sock, const char *ip, int port) { // 创建socket int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); return -1; } // 设置服务器地址 struct sockaddr_in addr; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(ip); addr.sin_port = htons(port); // 绑定端口 int ret = bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)); if (ret < 0) { perror("bind"); return -1; } sock->sockfd = sockfd; sock->addr = addr; return 0; } int udp_server_recv(udp_socket *sock, char *ip, int *port, char *buf, int len) { // 接收数据 struct sockaddr_in addr; socklen_t addrlen = sizeof(addr); int ret = recvfrom(sock->sockfd, buf, len, 0, (struct sockaddr *)&addr, &addrlen); if (ret < 0) { perror("recvfrom"); return -1; } // 获取发送方IP地址和端口号 strcpy(ip, inet_ntoa(addr.sin_addr)); *port = ntohs(addr.sin_port); return ret; } ``` 使用示例: ```c // client.c #include "udp.h" int main() { udp_socket sock; udp_client_init(&sock, "127.0.0.1", 8888); char buf[1024]; sprintf(buf, "Hello, server!"); udp_sendto(&sock, "127.0.0.1", 8888, buf, strlen(buf)); udp_close(&sock); return 0; } ``` ```c // server.c #include "udp.h" int main() { udp_socket sock; udp_server_init(&sock, "127.0.0.1", 8888); char buf[1024]; char ip[16]; int port; udp_server_recv(&sock, ip, &port, buf, sizeof(buf)); printf("Received message from %s:%d: %s\n", ip, port, buf); udp_close(&sock); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值