![](/img/trans.png)
[英]How I can edit this code, so that server zips the file before sending to the client and Client unzips this after receiving
[英]How can I write the client socket stream which connects to local file for sending and receiving packets
如何在Java中的本地文件系統客戶端上編寫此套接字流?
Python工作原理:
# Echo server program
import socket,os
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
os.remove("/tmp/socketname")
except OSError:
pass
s.bind("/tmp/socketname")
s.listen(1)
conn, addr = s.accept()
while 1:
data = conn.recv(1024)
if not data: break
conn.send(data)
conn.close()
# Echo client program
import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/tmp/socketname")
s.send('Hello, world')
data = s.recv(1024)
s.close()
print 'Received', repr(data)
Java的:
/* Client: how do you mention the /tmp/socketname? */
public static String localsendTCPBytes(String bytes) throws IOException {
String downloaded = null;
Socket socket = new Socket("localhost", 58888);
DataOutputStream upload = new DataOutputStream(socket.getOutputStream());
BufferedReader download = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String caps = bytes;
upload.writeBytes(caps);
upload.flush();
String get;
downloaded = download.readLine();
System.out.println("[TCP]: downloading: " + downloaded);
socket.close();
return downloaded;
}
跟進:
1)導入jar並附加到項目:
2)Unitest Java客戶端代碼
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.newsclub.net.unix.AFUNIXSocket;
import org.newsclub.net.unix.AFUNIXSocketAddress;
import org.newsclub.net.unix.AFUNIXSocketException;
public class SimpleTestClient {
public static void main(String[] args) throws IOException {
final File socketFile = new File("/tmp/socketname");
AFUNIXSocket sock = AFUNIXSocket.newInstance();
try {
sock.connect(new AFUNIXSocketAddress(socketFile));
} catch (AFUNIXSocketException e) {
System.out.println("Cannot connect to server. Have you started it?");
System.out.flush();
throw e;
}
System.out.println("Connected");
InputStream is = sock.getInputStream();
OutputStream os = sock.getOutputStream();
byte[] buf = new byte[128];
int read = is.read(buf);
System.out.println("Server says: " + new String(buf, 0, read));
System.out.println("Replying to server...");
os.write("Hello Server".getBytes());
os.flush();
os.close();
is.close();
sock.close();
System.out.println("End of communication.");
}
}
3)構建/編譯問題:
java.lang.UnsatisfiedLinkError: Could not load junixsocket library, tried [/opt/newsclub/lib-native/libjunixsocket-linux-1.6-amd64.so, /opt/newsclub/lib-native/libjunixsocket-linux-1.5-amd64.so, lib:junixsocket-linux-1.6-amd64, lib:junixsocket-linux-1.5-amd64]; please define system property org.newsclub.net.unix.library.path
at org.newsclub.net.unix.NativeUnixSocket.load(NativeUnixSocket.java:95)
at org.newsclub.net.unix.NativeUnixSocket.<clinit>(NativeUnixSocket.java:105)
at org.newsclub.net.unix.AFUNIXSocket.<init>(AFUNIXSocket.java:36)
at org.newsclub.net.unix.AFUNIXSocket.newInstance(AFUNIXSocket.java:50)
at unixdomainsocket.SimpleTestClient.main(SimpleTestClient.java:26)
Caused by: java.lang.UnsatisfiedLinkError: no junixsocket-linux-1.5-amd64 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1681)
at java.lang.Runtime.loadLibrary0(Runtime.java:840)
at java.lang.System.loadLibrary(System.java:1047)
at org.newsclub.net.unix.NativeUnixSocket.load(NativeUnixSocket.java:77)
... 4 more
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class org.newsclub.net.unix.NativeUnixSocket
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 unixdomainsocket.SimpleTestClient.main(SimpleTestClient.java:28)
Java Result: 1
4)解決方案:
-Djava.library.path=/usr/lib/jni -Djava.library.path=/usr/lib/rxtx -Djava.security.policy=applet.policy -Djava.library.path=/var/tmp/screwyou/jar/lib-native
作品!
“junixsocket是一個允許使用Java的Unix域套接字(AF_UNIX套接字)的Java / JNI庫。”
https://code.google.com/p/junixsocket/
“JUDS(Java Unix Domain Sockets)提供了一些類來滿足Java中訪問Unix域套接字的需求。”
雖然在問題中提到了對我有用的解決方案,但我發現我只需要在JVM上設置一個-D標志,就像這樣,來解決問題:
-Djava.library.path=/usr/lib/jni
您不能使用Java JDK中的Unix域套接字。 你需要一個外部包,如果你能找到一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.