Spring Boot 后端和c语言的客户端使用udp通信(双工)

做一个c语言和Spring Boot的后端进行通信的小示例。用的Socket进行通信,要说有啥问题,就是注意c语言的客户端进行消息接收的前提是启动bind来进行端口监听,否则只是监听端口是无法收到消息的。

  • Spring Boot后端的实现,接收和发送消息,我放在了一个类里面。用了线程,防止阻塞。emmm,端口是6678。
package com.example.demo.Servers;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**
 * 这个类用来进行和c语言的客户端进行数据交互
 */
public class UDPServerC {
    /**
     * 接收客户端消息线程的实现类
     * 为了不阻塞
     */
    class Listen implements Runnable {
        @Override
        public void run(){
            Thread.currentThread().setName("等待c客户端的消息进程");
            try {
                DatagramSocket server = new DatagramSocket(6678);
                while(true){
                    byte[] buf = new byte[1024];
                    DatagramPacket dp = new DatagramPacket(buf, buf.length);
                    System.out.println("正在监听6678端口,等待客户端消息。");
                    server.receive(dp);
                    System.out.println("收到客户端:"+ new String(dp.getData()));
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }

    /**
     * 接收客户端的消息
     * @throws IOException
     */
    public void start() throws IOException {
        Listen ser = new Listen();
        Thread m = new Thread(ser);
        m.start();
    }

    /**
     * 向客户端发送消息
     * @param s
     * @throws IOException
     */
    public void send(String s) throws IOException {
        DatagramSocket server = new DatagramSocket(6678);
        DatagramPacket se = new DatagramPacket(s.getBytes(), s.getBytes().length,
                InetAddress.getByName("127.0.0.1"), 5678);
        try{
            server.send(se);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
  • C语言发送消息的代码。编译的时候会警告gets的函数会有危险,不用管。
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(){
        int sockfd;
        int len;
        struct sockaddr_in address;
        int result;
        char str[30];
        char* ch = str;
        while(1){
                 //参数配置,目的地的信息
                sockfd = socket(AF_INET, SOCK_DGRAM, 0);
                address.sin_family = AF_INET;
                address.sin_addr.s_addr = inet_addr("127.0.0.1");
                address.sin_port = htons(6678);
                len = sizeof(address);
                printf("请输入你要传输的数据\n");
                gets(ch);
                len = strlen(ch);
                sendto(sockfd, ch, len, 0,(struct sockaddr *)&address, sizeof(address));        
        }
        close(sockfd);
        exit(0);
        return 0;
}
  • C语言接收消息的代码,注意要绑定端口。
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(){
        int sockfd;
        int len;
        struct sockaddr_in address;
        int result;
        char str[30];
        char* ch = str;
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr("127.0.0.1");
        address.sin_port = htons(5678);
        //下面绑定端口
        bind(sockfd, (struct sockaddr *)&address, sizeof(address));
        while(1){
                //接受输入
                printf("等待接收:\n");
                socklen_t lent = sizeof(address);
                int length = 8192;//这个参数是表示可以接收的数据的长度,太短会把接收的消息截取
                                 //造成信息丢失,单位是位。
                result = recvfrom(sockfd, ch, length, 0, (struct sockaddr *)&address, &lent);
                ch[result] = '\0';
                printf("收到回复:%s\n", ch);
        }
        close(sockfd);
        exit(0);
        return 0;
}

これて最後だ、終了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值