簡單版本:
一:服務端
import socket
#1、買手機(拿到套接字物件,用來鏈結建立鏈結)
phone=socket.socket(socket.af_inet,socket.sock_stream) #tcp稱為流式協議sock_stream,udp稱為資料報協議sock_dgram
# print(phone)
#2、插入/繫結手機卡(繫結)
# phone.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
#主要用來解決埠被占用的問題,可以加上這麼一句,方法二是重新繫結埠號
phone.bind(('127.0.0.1',8080))#繫結伺服器本地ip和埠號
#3、開機
phone.listen(5) # 半連線池,限制的是請求數
#4、等待**連線
print('start....')
conn,client_addr=phone.accept() #(三次握手建立的雙向連線,(client_add客戶端的ip,埠))
#拿到conn套接字物件,利用conn收發資訊
# print(conn)
print(client_addr)
#5、通訊:收\發訊息
data=conn.recv(1024) #最大接收的位元組數
print('來自客戶端的資料',data)
conn.send(data.upper())
# import time
# time.sleep(500)
#6、掛掉**連線
conn.close()
#7、關機
phone.close()
二:客戶端
import socket
#1、買手機
phone=socket.socket(socket.af_inet,socket.sock_stream)
print(phone)
#2、撥**
phone.connect(('127.0.0.1',8080)) # 指定服務端ip和埠
#3、通訊:發\收訊息
phone.send('hello'.encode('utf-8'))
# phone.send(bytes('hello',encoding='utf-8'))
data=phone.recv(1024)
print(data)
# import time
# time.sleep(500)
#4、關閉
phone.close()
加上鏈結迴圈和通訊迴圈
一:服務端
import socket
#1、買手機
phone=socket.socket(socket.af_inet,socket.sock_stream) #tcp稱為流式協議,udp稱為資料報協議sock_dgram
# print(phone)
#2、插入/繫結手機卡
# phone.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
phone.bind(('127.0.0.1',8080))
#3、開機
phone.listen(5) # 半連線池,限制的是請求數
#4、等待**連線
print('start....')
while true: # 連線迴圈
conn,client_addr=phone.accept() #(三次握手建立的雙向連線,(客戶端的ip,埠))
# print(conn)
print('已經有乙個連線建立成功',client_addr)
#5、通訊:收\發訊息
while true: # 通訊迴圈
try:(主要解決windows系統上由於客戶端單方面斷開鏈結引起的鏈結異常)
print('服務端正在收資料...')
data=conn.recv(1024) #最大接收的位元組數,沒有資料會在原地一直等待收,
即傳送者傳送的資料量必須》0bytes
# print('===>')
if len(data) == 0:break #在客戶端單方面斷開連線,
服務端才會出現收空資料的情況(主要表現在linux機器上面)
print('來自客戶端的資料',data)
conn.send(data.upper())
except connectionreseterror:
break
#6、掛掉**連線
conn.close()
#7、關機
phone.close()
二:客戶端:
import socket
#1、買手機
phone=socket.socket(socket.af_inet,socket.sock_stream)
# print(phone)
#2、撥**
phone.connect(('127.0.0.1',8080)) # 指定服務端ip和埠
#3、通訊:發\收訊息
while true: # 通訊迴圈
msg=input('>>: ').strip() #msg=''
if len(msg) == 0:continue #如果客戶端輸入為空,則讓他繼續輸入,如果沒有這一行判斷
客戶端會卡住,因為空字元傳給作業系統,服務端會收不到訊息,所以會卡在recv
phone.send(msg.encode('utf-8'))
# print('has send----->')
data=phone.recv(1024)
# print('has recv----->')
print(data)
#4、關閉
phone.close()
基於TCP協議的套接字程式設計
socket是應用層與tcp ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。socket模板已經為我們封裝好了,我...
基於TCP協議的套接字程式設計
基於socket通訊的內部演算法,當傳送的訊息為空的時候,接收端不會收到訊息,而傳送端向下執行到recv,兩端出於僵持狀態。所以在傳送端需要有個判斷,如果傳送的為空,則重新輸入傳送內容。socket是應用層與tcp ip協議通訊的中間軟體抽象層,它是一組介面。import socket 買手機 ph...
基於tcp協議通訊的套接字
以打 舉例 import socket 1.買手機 phone socket.socket socket.af inet,socket.sock stream sock steam tcp流式協議,2.撥號 phone.connect 127.0.0.1 8080 3.發 收訊息 phone.sen...