Linux下的c进程和java进程的通信-UnixSocket

1、开发c代码

引用的库

/usr/include

c代码

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>


#define SOCKET_PATH "/tmp/my_socket"

int main() {
	int server_fd, new_socket;
	struct sockaddr_un address;
	int opt = 1;
	int addrlen = sizeof(address);
	char buffer[1024] = { 0 };
	const char *hello = "Hello from C server!";

	// 创建套接字文件描述符
	if ((server_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == 0) {
		perror("socket failed");
		exit(EXIT_FAILURE);
	}

	// 设置套接字地址结构
	address.sun_family = AF_UNIX;
	strcpy(address.sun_path, SOCKET_PATH);

	// 绑定套接字到指定路径
	if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
		perror("bind failed");
		exit(EXIT_FAILURE);
	}

	// 监听连接
	if (listen(server_fd, 3) < 0) {
		perror("listen");
		exit(EXIT_FAILURE);
	}

	printf("Server listening on %s...\n", SOCKET_PATH);

	// 接受客户端连接
	if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
		perror("accept");
		exit(EXIT_FAILURE);
	}

	// 读取客户端发送的数据
	int valread = read(new_socket, buffer, 1024);
	if (valread < 0) {
		perror("read");
		exit(EXIT_FAILURE);
	}
	printf("Received from client: %s\n", buffer);

	// 发送响应给客户端
	send(new_socket, hello, strlen(hello), 0);
	printf("Message sent to client\n");

	// 关闭套接字
	close(new_socket);
	close(server_fd);
	unlink(SOCKET_PATH);

	return 0;
}

编译

gcc -o myserver server.c

执行

2、开发java代码

引入第三方库junixsocket ,注意这里的type是pom

GitCode - 全球开发者的开源社区,开源代码托管平台

复制代码
https://gitcode.com/gh_mirrors/ju/junixsocket/blob/main/junixsocket-demo/src/main/java/org/newsclub/net/unix/demo/SimpleTestClient.java
XML 复制代码
        <dependency>
            <groupId>com.kohlschutter.junixsocket</groupId>
            <artifactId>junixsocket-core</artifactId>
            <version>2.10.1</version>
            <type>pom</type>
        </dependency>

代码

java 复制代码
package com.example.service;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

import org.newsclub.net.unix.AFUNIXSocket;
import org.newsclub.net.unix.AFUNIXSocketAddress;

public class SimpleTestClient {
    public static void main(String[] args) throws IOException {
//        final File socketFile = new File(new File(System.getProperty("java.io.tmpdir")),
//                "junixsocket-test.sock");
        final File socketFile = new File("/tmp/my_socket");
        boolean connected = false;
        try (AFUNIXSocket sock = AFUNIXSocket.connectTo(AFUNIXSocketAddress.of(socketFile));
             InputStream is = sock.getInputStream(); //
             OutputStream os = sock.getOutputStream();
             DataInputStream din = new DataInputStream(is);
             DataOutputStream dout = new DataOutputStream(os);) {
            System.out.println("Connected");
            connected = true;

            byte[] buf = new byte[128];

            int read = is.read(buf);
            System.out.println("Server says: " + new String(buf, 0, read, StandardCharsets.UTF_8));

            System.out.println("Replying to server...");
            os.write("Hello Server".getBytes(StandardCharsets.UTF_8));
            os.flush();

            System.out.println("Now reading numbers from the server...");
            while (!Thread.interrupted()) {
                int number = din.readInt();
                if (number == -123) {
                    // by convention of this demo, if the number is -123, we stop.
                    // If we don't do this, we'll get an EOFException upon the next unsuccessful read.
                    break;
                }
                System.out.println(number);

                int ourNumber = number * 2;

                System.out.println("Sending back " + ourNumber);
                dout.writeInt(ourNumber);
            }
        } catch (SocketException e) {
            if (!connected) {
                System.out.println("Cannot connect to server. Have you started it?");
                System.out.println();
            }
            throw e;
        }

        System.out.println("End of communication.");
    }
}

打包

利用idea,创建Artifacts

Build Artifacts

执行

java -jar nearWeb.jar

相关推荐
盗理者4 分钟前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
GitLqr5 分钟前
Java 26 终于原生支持 HTTP/3 了:告别 Netty,直接用 QUIC
java·netty·http3
用户409666013175114 分钟前
Jackson 序列化:@JsonIgnore / @JsonProperty / @JsonFormat / @JsonInclude / @JsonUnwrapped 一次讲清楚
java·后端
码路漫漫16 分钟前
用了 Caffeine,消息为什么还是被处理了两次?
java
云和数据.ChenGuang25 分钟前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
小龙报1 小时前
【优选算法】1.搜索插入位置 2.x的平方根
java·c语言·数据结构·c++·python·算法·蓝桥杯
mgaofeid1 小时前
Ubuntu 24.04 中文输入法安装
linux·运维·ubuntu
山荷枝1 小时前
04-框架--SpringBoot
java·spring boot·后端
linux修理工1 小时前
内存占用 99% 且 Java 程序较多的优化建议
java·开发语言
weixin_460443561 小时前
企业考试系统如何对接OA、钉钉和企业微信?SSO单点登录、组织同步与权限一致性设计
java·开发语言·数据库