9 網路程式設計 tcp伺服器(1)

2021-09-25 08:16:55 字數 2887 閱讀 3578

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,之所以稱為動態埠,是因為它一般不固定分配某種服務,而是動態分配。動態分配是指當乙個系統程式...