1、建立套接字
2、bind繫結ip和port
作為服務方,ip port 應該是固定的,所以要繫結;客戶端一般不繫結
3、listen使套接字變成監聽套接字,即變為被動鏈結
4、accept等待客戶的鏈結
生活中的**機「
1、買手機
2、插上手機卡
3、設定成響鈴狀態,否則別人打**聽不到
4、接聽**-等待別人打進來
**1. **vim 05-tcp伺服器.py
思路:用注釋搭建流程
def main():
#1、買手機(建立套接字)
#2、插手機卡(繫結 bind ip port)
#3、設定成響鈴狀態(將套接字由主動變為被動 listen)
#4、等待別人打進來(等待客戶鏈結 accept)
if __name__ == "__main__":
main()
注意:listen有乙個引數,是乙個數值,一般寫128,引數越大,以後可以連線的客戶端越多,引數越小鏈結的客戶端越少,作業系統不同,引數不同影響不同,linux中128 與256與10差別不是很大,一般寫128就可以了
。accept有乙個返回值,返回值是乙個元組,如果等號的右邊的返回值是乙個元組的時候,等號左邊有兩個變數,叫做拆包,可用ipython3進行測試某個知識點;
。accept返回的第乙個變數用來接收新的套接字,第二個變數用來接收客戶端的資訊
。舉例:給10086打**時,伺服器先有乙個監聽套接字,客戶來了之後接通,伺服器會再找乙個套接字為這個客戶服務即人工客服,再來乙個客戶時,先鏈結監聽套接字,然後伺服器再找另外乙個套接字為新客戶服務,打通10086時,對方是知道你的**號碼的
。流程中的前三步都是固定的,最後accept會預設阻塞,當有新的客戶鏈結進來時才會解阻塞
。作為伺服器,一般都是先收資料再發資料,於是有了第5步,收資料,有兩個套接字,tcp_server_socket和new_client_socket,收資料是通過new_client_socket,收資料是recv,udp中是recvfrom,兩個後面都有乙個引數,一般寫1024,因為之前已經知道了客戶端的ip和port,所以new_client_socket.recv(1024)返回的僅僅是資料,而不是元組
.接收資料後,要給客戶端回訊息,即send
。關閉套接字,有兩個套接字,都要關閉
import socket
def main():
#1、買手機(建立套接字)
tcp_server_socket = socket.socket(socket.af_inet,socket.sock_stream)
#2、插手機卡(繫結 bind ip port)
tcp_server_socket.bind(("",7890))
#3、設定成響鈴狀態(將套接字由主動變為被動 listen)
tcp_server_socket.listen(128)
#4、等待別人打進來(等待客戶鏈結 accept)
new_client_socket,client_addr = tcp_server_socket.accept()
print(client_addr)
#5、接收客戶端發過來的請求
recv_data = new_client_socket.recv(1024)
print(recv_data)
#6、給客戶端傳送資料
new_client_socket.send("hahahh".encode("utf-8"))
#7、關閉套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()
為了方便檢視,可列印幾行虛線用來測試程式
import socket
def main():
#1、買手機(建立套接字)
tcp_server_socket = socket.socket(socket.af_inet,socket.sock_stream)
#2、插手機卡(繫結 bind ip port)
tcp_server_socket.bind(("",7890))
#3、設定成響鈴狀態(將套接字由主動變為被動 listen)
tcp_server_socket.listen(128)
print("-------1-------")
#4、等待別人打進來(等待客戶鏈結 accept)
new_client_socket,client_addr = tcp_server_socket.accept()
print("-------2-------")
print(client_addr)
#5、接收客戶端發過來的請求
recv_data = new_client_socket.recv(1024)
print(recv_data)
#6、給客戶端傳送資料
new_client_socket.send("hahahh".encode("utf-8"))
#7、關閉套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()
執行程式進行測試,發現----1----列印出來了,說明前三步都沒問題,accept預設阻塞,當有新的客戶端到來並且給伺服器傳送訊息後,就會解阻塞。 Python3網路程式設計 TCP伺服器和客戶端
此指令碼建立乙個tcp伺服器,他接受來自客戶端的訊息,然後將訊息加上時間戳字首併發送回客戶端 usr bin env python from socket import from time import ctime host 對bind 方法的標識 port 21567 埠號 bufsiz 1024...
伺服器TCP網路程式設計實踐
這個問題涉及到2個tcp連線狀態,close wait與time wait。我想描述清楚這2個狀態,將會對伺服器關閉的生命週期了解的更為清晰。1 定義 假設有伺服器a正在執行,接受從客戶端c傳送過來的連線。在某個時間點上,c正常關閉了連線 一般正常關閉是使用close函式 此時伺服器在recv函式上...
1 1 2 10 網路程式設計1
知名埠 well known ports 知名埠是眾所周知的埠號,範圍從0到1023 80埠分配給http服務 21埠分配給ftp服務 動態埠 dynamic ports 動態埠的範圍是從1024到65535,之所以稱為動態埠,是因為它一般不固定分配某種服務,而是動態分配。動態分配是指當乙個系統程式...