1 回答

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