簡體   English   中英

是否可以使用Unix套接字在C應用程序和Java應用程序之間創建通信?

[英]Is it possible to create a communication between C application and Java application using Unix Sockets?

我在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 lib在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();
    }
}
}

我啟動了服務器,並嘗試連接,然后獲得異常:

/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -Didea.launcher.port = 7533 -Didea.launcher.bin.path = / home / andrew / Downloads / idea-IU-163.7743。 44 / bin -Dfile.encoding = UTF-8 -classpath /usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/charsets.jar:/usr/lib/jvm/java-1.8.0 -openjdk-AMD64 / JRE / lib / ext目錄/ cldrdata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/dnsns.jar:/ usr / lib中/ JVM / JAVA -1.8.0-的openjdk-AMD64 / JRE / lib / ext目錄/的IcedTea-sound.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/jaccess.jar:在/ usr /lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/nashorn。罐子:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ EXT /程序(sunjce_provider.jar):/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/ JRE / lib / ext目錄/ zipfs.jar:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/jce.jar:/usr/lib/jvm/java-1.8.0-openjdk- AMD64 / JRE / LIB / jsse.jar:/ usr / lib中/ JVM / JAVA-1。 8.0-的openjdk-AMD64 / JRE / LIB /管理-agent.jar中:/usr/lib/jvm/java-1.8.0-openjdk-amd64/jre/lib/resources.jar:/ usr / lib中/ JVM / Java的1.8.0-的OpenJDK,AMD64 / JRE / lib中/ rt.jar的:/家庭/安德魯/ IdeaProjects /樣品/出/生產/樣品:/home/andrew/Workspace/libs/junixsocket-1.3.jar:/家庭/安德魯/Workspace/libs/junixsocket-demo-1.3.jar:/home/andrew/Workspace/libs/junixsocket-mysql-1.3.jar:/home/andrew/Workspace/libs/junixsocket-rmi-1.3.jar:/home/ andrew / Downloads / idea-IU-163.7743.44 / lib / idea_rt.jar com.intellij.rt.execution.application.AppMain client.Client org.newsclub.net.unix.AFUNIXSocketException:socket的錯誤類型協議(socket:/ home / andrew / IdeaProjects / Sample / tmp / SOCKET_ADDRESS)org.newsclub.net.unix.NativeUnixSocket.connect(Native Method)org.newsclub.net.unix.AFUNIXSocketImpl.connect(AFUNIXSocketImpl.java:125)at org。 newsclub.net.unix.AFUNIXSocket.connect(AFUNIXSocket.java:97)at org.newsclub.net.unix.AFUNIXSocket.connect(AFUNIXSocket.java:87)at client.Client.main(Client.java:19)at su n.reflect.NativeMethodAccessorImpl.invoke0(本地方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method。在com.intellij.rt.execution.application.AppMain.main上調用(Method.java:498)(AppMain.java:147)

請幫我!

unix域套接字是一種特定於平台的機制,沒有本機庫的Java不支持它。 您使用org.newsclub.net.unix.AFUNIXSocket 但是這個庫只支持套接字類型SOCK_STREAMSOCK_DGRAM 您的C應用程序使用SOCK_SEQPACKET ,它是unix域套接字的特定於Linux的擴展,此庫不支持。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM