做一个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;
}
これて最後だ、終了。