亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

Python 服務器打印 ASCII 而不是整數

Python 服務器打印 ASCII 而不是整數

回首憶惘然 2023-12-13 15:06:05
我正在開發一個與 Python 服務器連接的 Android 應用程序。如果我將一個名為 Angle 的整數從我的應用程序發送到 python 服務器,服務器將輸出 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條經驗 獲得超8個贊

當您使用PrintWriter.write(int c)方法時,您基本上將整數轉換為字符,并且當服務器接收輸入時,它會接收文本。


來自 PrintWriter 類文檔:


將對象的格式化表示打印到文本輸出流。此類實現了 PrintStream 中的所有打印方法。它不包含寫入原始字節的方法,程序應使用未編碼的字節流。


如果您想要更好的方法,請這樣做。如果您想放棄 PrintWriter 并將純整數發送到您的服務器,您可以這樣做:


在您的 Java 客戶端上:


使用 Socket 的OutputStream.write(byte b[])方法并傳遞您的 int 。整數通常由 4 個字節組成。使用此方法時,您將 4 個字節發送到 python 服務器。


outputStream.write(ByteBuffer.allocate(4).putInt(yourIntHere).array());

在你的 Python 服務器上:


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 客戶端發送 4 個字節的整數時,你的服務器必須正好接收到 4 個字節,因為這是整數長度。最后 unpack() 方法將字節轉換為 int。


不推薦: 如果您仍然想使用 PrintWriter,請使用PrintWriter.write(String s)方法將 int 作為 String 發送(確保首先將 int 轉換為 String)。然后在你的 python 服務器上通過簡單地使用將 str 轉換為 int


int(data.decode('utf-8'))

盡管這不是將整數發送到后端的最佳方式,但它仍然有效,但如果您不知道客戶端發送了多少字節,則極容易出錯。問題是,當你說recv(1024)你的服務器可能會同時獲得多個輸入時。在您的情況下,您在發送數據后立即關閉套接字,所以您會沒事,但如果您打算維持一個來回發送數據的連接而不關閉連接,那么這將是一個問題。例如,當您的客戶端發送一個編碼為文本的整數時,您的服務器可能最終會一次以字符串形式獲取多個輸入,而"102030"實際上10, 20, 30應該將其分開,并且您將不會獲得預期的結果。您確實需要知道客戶端發送了多少字節以防止這種情況發生。為了防止這種情況,您可以做的另一件事是在它們前面添加一些字符,以便您的客戶端發送"-10", "-20", "-30"并服務器接收"-10-20-30",然后使用"-10-20-30".split('-')python 函數相應地解析它們。


查看完整回答
反對 回復 2023-12-13
  • 1 回答
  • 0 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號