当前位置: 首页 > 知识库问答 >
问题:

是否可以使用Unix套接字在C应用程序和Java应用程序之间创建一个通信?

夏立果
2023-03-14

我有一个服务器应用程序写在C:

int main(int argc, char const *argv[]) {

int sock;

struct sockaddr_un serv_addr;

size_t serv_addr_len;

int msgsock;
char buf[1024];
int msg_len;

remove(SOCKET_ADDRESS);

sock = socket(AF_UNIX, SOCK_SEQPACKET, 0);

if (sock < 0) {
    perror("Opening stream socket");
    exit(1);
}

memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sun_family = AF_UNIX;

strcpy(serv_addr.sun_path, SOCKET_ADDRESS);

serv_addr_len = strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);

if (bind(sock, (struct sockaddr *) &serv_addr, serv_addr_len)) {
    perror("Binding stream socket");
    exit(1);
}

if (listen(sock, 5) < 0) {
    perror("Listening falied");
    exit(1);
}

while (TRUE) {
    msgsock = accept(sock, (struct sockaddr *) 0, 0);

    if (msgsock == -1) {
        perror("Accept");
    }
    else {
        do {
            memset(buf, 0, sizeof(buf));

            if ((msg_len = recv(msgsock, buf, sizeof(buf), MSG_WAITALL)) < 0) {
                perror("Reading stream message");
            }
            else if (msg_len == 0) {
                printf("Ending connection\n");
            }
            else {
                printf("%s\n", buf);
            }
        } while (msg_len > 0);

        close(msgsock);
    }
}
return 0;
}

并使用junixsocket库在Java上编写客户端:

package client;

import java.io.*;
import org.newsclub.net.unix.AFUNIXSocket;
import org.newsclub.net.unix.AFUNIXSocketAddress;

public class Client {

public static void main(String args[]) {

    final String socketAddress = "/home/andrew/IdeaProjects/Sample/tmp/SOCKET_ADDRESS";

    String message = "Hello Server!";

    try {
        final File socketFile = new File(socketAddress);

        AFUNIXSocket socket = AFUNIXSocket.newInstance();

        socket.connect(new AFUNIXSocketAddress(socketFile));

        OutputStream out = socket.getOutputStream();

        out.write(message.getBytes());
        out.flush();
        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}
}

请帮帮我!

共有1个答案

赵正雅
2023-03-14

unix域套接字是一种特定于平台的机制,没有本机库的java不支持它。您可以使用org.newsclub.net.unix.afunixsocket。但此库仅支持套接字类型sock_streamsock_dgram。您的C应用程序使用sock_seqpacket,它是unix域套接字的linux特定扩展,这个库不支持它。

 类似资料:
  • 我计划创建一个Xamarin android应用程序。我已经创建了一个windows表单。NET应用程序。我想知道这是否是连接两者以在它们之间传输数据的一种方式。或者如果它不适用于Windows表单应用程序,那么我可以将. NET Web应用程序连接到Xamarin应用程序吗? *问题补充我其实有一个. net windows form app可以读取和生成二维码。我计划制作一个应用程序来扫描二维

  • 问题内容: 我有2个应用程序,一个是用C编写的,另一个是用Java编写的,它们假定在同一台机器上运行。在它们之间实施IPC的最佳方法是什么? 最好的含义是可移植性,最小的用户意识(防火墙弹出窗口…)等。 问题答案: 我将使用Sockets over loop back开始。这样,您就可以发送文本或二进制数据,并在一个进程开始或结束时彻底处理。延迟大约为20-50微秒,具体取决于您对数据进行的处理以

  • 由于我是JavaFx的新手,当然还有spring jdbc的新手,所以我处于阻塞状态。我的应用程序几乎准备就绪,我甚至使用inno setup为windows创建了安装文件。此安装文件在我的系统上运行良好,但当我在另一个系统上运行时,它不会运行;可能是由于缺少数据库及其服务器。因此,我需要一个独立的应用程序,通过安装程序管理所有数据库和其他需求。经过研究,我发现许多人建议使用Sqlite或hsql

  • 我想创建一个应用程序使用:客户端向服务器发送,服务器将使用的大写字母,并发送回客户端进行显示。 当运行时。它显示以下错误: 我有搜索和做一些方法,但是。。你能帮助我吗。

  • 问题内容: 我是程序世界中的每个新手,我遇到一个问题,我的要求与使用JAVA Code在Android平板电脑与台式机之间的通信有关。 上面的代码是我的servlet代码,它在我的本地系统服务器(Tomcat 6.0)中运行,在这里,我正在通过println发送消息,并且我想在另一个系统中运行的Android应用中显示相同的消息。现在,我要发布在另一个系统上运行的android代码。 这里的192

  • 不是一个真正重要的问题,但只是好奇。您可以在运行时更改应用程序图标吗?例如,有一个按钮,当您按下该按钮时,您会在flutter中获得不同的应用程序图标(假设应用程序图标已经“设置”)。Android和iOS。 非常感谢任何意见。谢谢