簡體   English   中英

Python中的套接字編程-時間戳

[英]Socket programming in python - Timestamps

from socket import *
from time import ctime


HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT)

tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)

while True:
    print 'waiting for connection...'
    tcpCliSock, addr = tcpSerSock.accept()
    print "...connected from:", addr

    while True:
        data = tcpCliSock.recv(BUFSIZ)
        if not data:
            break
        tcpCliSock.send("[%s] %s" % (ctime(), data))

    tcpCliSock.close()
tcpSerSock.close()

我清除了一些錯誤。 我正在關注Core Python Application一書。 我需要知道循環中會發生什么?

tcpCliSock, addr = tcpSerSock.accept() 

這行代碼的作用是什么? “等待連接?” 與誰和如何? 沒有其他參數可以連接東西! 這個listen()到底如何工作? 簡要說明該程序。 謝謝

文檔中的Python套接字HOWTO中介紹了所需的內容。 這是Python 2版本:

http://docs.python.org/2/howto/sockets.html

簡短的版本是您發布的代碼是一台簡單的服務器,該服務器被配置為響應來自單獨進程(可能在另一台計算機上)的請求,該進程向其發送一小部分數據。 該服務器發回帶有時間戳的數據。

socket.listen()用於設置套接字以接收傳入的連接。 連接請求進入短隊列,並按順序處理。 socket.accept()檢查該偵聽隊列中是否有傳入連接,如果存在,它將為另一台計算機打開一個新套接字,以處理該連接。 連接結束后,第一個客戶端的新套接字關閉,服務器套接字移至隊列中的下一個連接以進行處理。

要使該服務器執行任何操作,您需要使用某些客戶端程序打開正確的端口並向其發送消息。 對於簡單的事情,如果您的計算機上安裝了telnet則可以嘗試使用它。 運行此服務器,然后嘗試:

telnet localhost 21567

在同一台機器上,然后開始輸入一些文本。 您應該看到響應。 我的輸出看起來像這樣:

$ telnet localhost 21567
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
j
[Sun Sep 15 11:58:27 2013] j
jkl
[Sun Sep 15 11:58:29 2013] jkl
fdjksla;
[Sun Sep 15 11:58:30 2013] fdjksla;
fdjkasl;fjdksal;fjkdsa;
[Sun Sep 15 11:58:32 2013] fdjkasl;fjdksal;fjkdsa;

注意:您必須在“ HOST字段中輸入主機名才能起作用。 嘗試使用'localhost' ,看看是否有幫助。 另外,我相信如果您將localhost用作HOST參數,則可能無法接收來自其他計算機的連接。 在這種情況下,您需要在網絡上使用自己的本地主機名或IP地址。

我已經使用固定的縮進和'localhost' HOST參數的'localhost'編輯了OP,並測試了它是否可以在另一個shell中與telnet ,如我在此所述。

我還注意到,此代碼永遠不會到達服務器套接字的close() 如果要關閉服務器並有條不紊地退出,則希望在外部while循環中的某處break

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM