第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 服務(wù)器打印 ASCII 而不是整數(shù)

Python 服務(wù)器打印 ASCII 而不是整數(shù)

回首憶惘然 2023-12-13 15:06:05
我正在開發(fā)一個與 Python 服務(wù)器連接的 Android 應(yīng)用程序。如果我將一個名為 Angle 的整數(shù)從我的應(yīng)用程序發(fā)送到 python 服務(wù)器,服務(wù)器將輸出 ASCII 字符而不是 int。import socketserver_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)host = "127.0.0.1"port = 1026server_socket.bind((host, port))server_socket.listen(3)while True:    client_socket, address = server_socket.accept()    try:        while True:            data = client_socket.recv(1024)            print(data.decode('utf-8'))    finally:        client_socket.close()Java 中的后臺 Android 代碼:class send extends AsyncTask<Void, Void , Void>{        Socket s;        PrintWriter pw;        @Override        protected Void doInBackground(Void...params){            try{                s = new Socket("10.0.2.2",1026);                pw = new PrintWriter(s.getOutputStream());                pw.write(Angle);                pw.flush();                pw.close();                s.close();            } catch (UnknownHostException e ){                System.out.println("Fail");                e.printStackTrace();            } catch (IOException e){                System.out.println("Fail");                e.printStackTrace();            }            return null;        }    }
查看完整描述

1 回答

?
幕布斯7119047

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)地解析它們。


查看完整回答
反對 回復(fù) 2023-12-13
  • 1 回答
  • 0 關(guān)注
  • 135 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號