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

相关推荐
tasselyue31 分钟前
Macbook M3 使用 VMware Fusion 安装 openEuler24.03LTS
linux
@老蝴35 分钟前
C语言 — 编译和链接
c语言·开发语言
行止61 小时前
MySQL主从复制与读写分离
linux·数据库·mysql
本郡主是喵1 小时前
并发编程 - go版
java·服务器·开发语言
南风lof1 小时前
源码赏析:Java线程池中的那些细节
java·源码阅读
pengyu1 小时前
【Java设计原则与模式之系统化精讲:零】 | 编程世界的道与术(理论篇)
java·后端·设计模式
程序员岳焱1 小时前
16.Java Annotation注解:元数据与代码增强
java·后端·编程语言
HEX9CF1 小时前
【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
linux·chrome·算法
labuladuo5202 小时前
Linux命令基础(2)
linux