基於tcp協議的套接字

2021-08-21 07:44:17 字數 2938 閱讀 6810

簡單版本:

一:服務端

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...