我有一个服务器应用上用C写:是否可以使用Unix套接字在C应用程序和Java应用程序之间创建通信?
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;
}
而且有一个客户端上的Java写了junixsocket lib目录下:
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();
}
}
}
我开始服务器,并尝试connnect,然后得到异常:
/usr/lib/jvm/java-1.8.0-openjdk-amd64/bin/java -Didea.launcher.port = 7533 -Didea.launcher.bin.path = /家庭/安德鲁/下载/ 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.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.jar: /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/management-agent.jar:/usr/lib/jvm/java-1.8.0-openjdk- AMD64/JRE/lib中/ resources.jar:/ usr/lib中/ JVM/JA VA-1.8.0-的OpenJDK,AMD64/JRE/lib中/ rt.jar的:/家庭/安德鲁/ IdeaProjects /样品/出/生产/样品:/home/andrew/Workspace/libs/junixsocket-1.3.jar:/家/andrew/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) at org.newsclub.net.unix.NativeUnixSocket.connect(Native Method)at 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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect。 NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498)在 com.intellij .rt.execution.application.AppMain.main(AppMain.java:147)
请帮帮我!
Java和C程序应该能够通信,因为它们都使用套接字。你得到的具体错误似乎是这部分“AFUNIXSocketException:套接字的协议错误类型” – dahui