我正在嘗試使用套接字連接將Python和Java結合起來。我有一個 Java 服務器和一個 Python 客戶端。它們能夠相互連接,而且服務器能夠寫給客戶端,但是當我試圖從客戶端向服務器發送一個訊息時,它拋出了一個 EOFException。我應該怎么做才能使其正常作業呢?
服務器代碼:
import java.io.DataInputStream。
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket。
import java.net.Socket。
public class Server {
public static void main(String[] args){
try {
ServerSocket serversocket = new ServerSocket(6000)。
Socket client = serversocket.accept()。
final DataInputStream input = new DataInputStream(client. getInputStream())。
final DataOutputStream output = new DataOutputStream(client. getOutputStream())。
output.writeUTF("Hello Client!")。
String message = (String)input.readUTF();
System.out.println(message)。
serversocket.close()。
} catch (IOException e) {
e.printStackTrace()。
}
}
客戶端代碼:
import socket
socket = socket.socket()
host = "localhost"/span>
埠 = 6000
socket.connect((host, port))
訊息 = socket.recv(1024)
print(message.decode())
socket.sendall("Hello Server".encode())
socket.close()
例外情況:
java.io.EOFException<
at java.base/java。 io.DataInputStream.readFully(DataInputStream.java:203)
at java.base/java。 io.DataInputStream.readUTF(DataInputStream.java:615)
at java.base/java。 io.DataInputStream.readUTF(DataInputStream.java:570)
at Server.main(Server.java:19)
uj5u.com熱心網友回復:
選項#1:
在服務器中用這個替換input.readUTF():
while(true) {
int ch = input.read() 。
if (ch == -1) break;
System.out.print((char)ch) 。
}
選項#2:
如果想在服務器上讀取UTF編碼的字串(相對于純ASCII),那么建議使用帶有utf-8字符集的BufferedReader和readLine()。
ServerSocket serversocket = new ServerSocket(6000)。
System.out.println("等待連接")。
Socket client = serversocket.accept()。
final BufferedReader input = new BufferedReader(
new InputStreamReader(client.getInputStream(), StandardCharsets.UTF_8)); // changed
final OutputStream output = client.getOutputStream()。
//output.writeUTF("Hello Client!"); // see note below
output.write("Hello Client!".getBytes(StandardCharsets.UTF_8)) // changed
String message = input.readLine(); // changed
System.out.println(message)。
client.close()。
serversocket.close()。
客戶端輸出:
Hello Client!
服務器輸出:
Hello Server
注意 DataOutputStream#writeUTF(..)的JavaDoc說:
首先,兩個位元組被寫到輸出流中,就像通過 writeShort方法給出后續的位元組數。
使用output.write(s.getBytes(StandardCharsets.UTF_8))與非Java客戶端更加兼容。Python utf-8解碼不支持writeUTF()所添加的2位元組長度前綴。
最后,如果想讓服務器處理一個以上的客戶端連接,那么在ServerSocket創建后添加一個回圈,將代碼包圍起來,只在回圈內關閉客戶端套接字。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311837.html
標籤:
上一篇:用C語言進行Unix網路編程
