1 回答

TA貢獻1794條經(jīng)驗 獲得超8個贊
當(dāng)您使用PrintWriter.write(int c)方法時,您基本上將整數(shù)轉(zhuǎn)換為字符,并且當(dāng)服務(wù)器接收輸入時,它會接收文本。
來自 PrintWriter 類文檔:
將對象的格式化表示打印到文本輸出流。此類實現(xiàn)了 PrintStream 中的所有打印方法。它不包含寫入原始字節(jié)的方法,程序應(yīng)使用未編碼的字節(jié)流。
如果您想要更好的方法,請這樣做。如果您想放棄 PrintWriter 并將純整數(shù)發(fā)送到您的服務(wù)器,您可以這樣做:
在您的 Java 客戶端上:
使用 Socket 的OutputStream.write(byte b[])方法并傳遞您的 int 。整數(shù)通常由 4 個字節(jié)組成。使用此方法時,您將 4 個字節(jié)發(fā)送到 python 服務(wù)器。
outputStream.write(ByteBuffer.allocate(4).putInt(yourIntHere).array());
在你的 Python 服務(wù)器上:
from struct import unpack
# put this in your socket while True loop
my_bytes = client_socket.recv(4)
my_int = unpack('>I', my_bytes)[0]
所以基本上每次你的 Socket 客戶端發(fā)送 4 個字節(jié)的整數(shù)時,你的服務(wù)器必須正好接收到 4 個字節(jié),因為這是整數(shù)長度。最后 unpack() 方法將字節(jié)轉(zhuǎn)換為 int。
不推薦: 如果您仍然想使用 PrintWriter,請使用PrintWriter.write(String s)方法將 int 作為 String 發(fā)送(確保首先將 int 轉(zhuǎn)換為 String)。然后在你的 python 服務(wù)器上通過簡單地使用將 str 轉(zhuǎn)換為 int
int(data.decode('utf-8'))
盡管這不是將整數(shù)發(fā)送到后端的最佳方式,但它仍然有效,但如果您不知道客戶端發(fā)送了多少字節(jié),則極容易出錯。問題是,當(dāng)你說recv(1024)你的服務(wù)器可能會同時獲得多個輸入時。在您的情況下,您在發(fā)送數(shù)據(jù)后立即關(guān)閉套接字,所以您會沒事,但如果您打算維持一個來回發(fā)送數(shù)據(jù)的連接而不關(guān)閉連接,那么這將是一個問題。例如,當(dāng)您的客戶端發(fā)送一個編碼為文本的整數(shù)時,您的服務(wù)器可能最終會一次以字符串形式獲取多個輸入,而"102030"實際上10, 20, 30應(yīng)該將其分開,并且您將不會獲得預(yù)期的結(jié)果。您確實需要知道客戶端發(fā)送了多少字節(jié)以防止這種情況發(fā)生。為了防止這種情況,您可以做的另一件事是在它們前面添加一些字符,以便您的客戶端發(fā)送"-10", "-20", "-30"并服務(wù)器接收"-10-20-30",然后使用"-10-20-30".split('-')python 函數(shù)相應(yīng)地解析它們。
添加回答
舉報