所謂的伺服器端:就是提供服務的一方,而客戶端,就是需要被服務的一方
比如乙個人想打10086求助人工服務。 tcp的客戶端要比伺服器端簡單很多,客戶端只需要找乙個**亭,拿起**撥打即可,流程要少很多
示例**:
from socket import *
# 建立socket
tcp_client_socket = socket(af_inet, sock_stream)
# 目的資訊
server_ip = input("請輸入伺服器ip:")
server_port = int(input("請輸入伺服器port:"))
# 鏈結伺服器
tcp_client_socket.connect((server_ip, server_port))
# 提示使用者輸入資料
send_data = input("請輸入要傳送的資料:")
tcp_client_socket.send(send_data.encode("gbk"))
# 接收對方傳送過來的資料,最大接收1024個位元組
recvdata = tcp_client_socket.recv(1024)
print('接收到的資料為:', recvdata.decode('gbk'))
# 關閉套接字
tcp_client_socket.close()
<1>tcp客戶端請輸入伺服器ip:10.10
.0.47
請輸入伺服器port:8080
請輸入要傳送的資料:你好啊
接收到的資料為: 我很好,你呢
如同上面的**機過程一樣,在程式中,如果想要完成乙個tcp伺服器的功能,需要的流程如下:
socket建立乙個套接字
bind繫結ip和port
listen使套接字變為可以被動套接字
accept取出乙個客戶端連線 用以服務
recv/send接收傳送資料
乙個很簡單的tcp伺服器如下:
from socket import *
# 建立socket
tcp_server_socket = socket(af_inet, sock_stream)
# 本地資訊
address = ('', 7788)
# 繫結
tcp_server_socket.bind(address)
# 使用socket建立的套接字預設的屬性是主動的,使用listen將其變為被動的,這樣完成之後 下一步就可以接受accept別人的連線connect請求了
tcp_server_socket.listen(128)
# 如果有新的客戶端來鏈結伺服器,那麼就產生乙個新的套接字專門為這個客戶端服務
# client_socket用來為這個客戶端服務
# tcp_server_socket就可以省下來專門等待其他新客戶端的鏈結
client_socket, clientaddr = tcp_server_socket.accept()
# 接收對方傳送過來的資料
recv_data = client_socket.recv(1024) # 接收1024個位元組
print('接收到的資料為:', recv_data.decode('gbk'))
# 傳送一些資料到客戶端
client_socket.send("thank you !".encode('gbk'))
# 關閉為這個客戶端服務的套接字,只要關閉了,就意味著為不能再為這個客戶端服務了,如果還需要服務,只能再次重新連線
client_socket.close()
<1>tcp伺服器接收到的資料為: 你在麼?
tcp伺服器一般情況下都需要繫結,否則客戶端找不到這個伺服器
tcp客戶端一般不繫結,因為是主動鏈結伺服器,所以只要確定好伺服器的ip、port等資訊就好,本地客戶端可以隨機
tcp伺服器中通過listen可以將socket建立出來的主動套接字變為被動的,這是做tcp伺服器時必須要做的
當客戶端需要鏈結伺服器時,就需要使用connect進行鏈結,udp是不需要鏈結的而是直接傳送,但是tcp必須先鏈結,只有鏈結成功才能通訊
當乙個tcp客戶端連線伺服器時,伺服器端會有1個新的套接字,這個套接字用來標記這個客戶端,單獨為這個客戶端服務
listen後的套接字是被動套接字,用來接收新的客戶端的連線請求的,而accept返回的新套接字是標識這個新客戶端的
關閉listen後的套接字意味著被動套接字關閉了,會導致新的客戶端不能夠鏈結伺服器,但是之前已經鏈結成功的客戶端正常通訊。
關閉accept返回的套接字意味著這個客戶端已經服務完畢
當客戶端的套接字呼叫close後,伺服器端會recv解阻塞,並且返回的長度為0,因此伺服器可以通過返回資料的長度來區別客戶端是否已經下線;同理 當伺服器斷開tcp連線的時候 客戶端同樣也會收到0位元組資料。
PythonTCP網路程式設計及應用
1 tcp服務端的建立 import socket 建立tcp套接字 sockfd socket.socket socket.af inet,socket.sock stream 繫結位址 sockfd.bind 0.0.0.0 6663 設定監聽 sockfd.listen 2 等待客戶端連線 w...
tcp網路客戶端程式
tcp client.c include include include include include include include include define portnumber 3333 int main int argc,char argv 使用hostname查詢host名字 if ...
Python TCP客戶端和服務端開發 學習筆記
1.建立tcp客戶端套接字 tcp client socket socket.socket socket.af inet,socket.sock stream 2.和服務端套接字建立連線 tcp client socket.connect 192.168.1.207 9090 send connec...