我們可以將網(wǎng)絡(luò)編程分為2個(gè)模塊:服務(wù)器編程和客服端編程碗短,接下來的代碼會(huì)告訴你這兩個(gè)模塊的相同之處以及不同之處伤提。
服務(wù)器
from socket import socket, AF_INET, SOCK_STREAM
import time
import datetime
def main():
# 創(chuàng)建一個(gè)基于TCP協(xié)議的套接字對(duì)象
# 因?yàn)槲覀冏龅氖菓?yīng)用級(jí)的產(chǎn)品或服務(wù)所以可以利用現(xiàn)有的傳輸服務(wù)來實(shí)現(xiàn)數(shù)據(jù)傳輸(TCP UDP)
server = socket(AF_INET, SOCK_STREAM) # 表達(dá)的是ipv4 和tcp協(xié)議(默認(rèn)前面兩個(gè)) 或者 udp協(xié)議
# 綁定IP地址(網(wǎng)絡(luò)上的主機(jī)的身份標(biāo)識(shí))和端口(用來區(qū)分不同服務(wù)的IP地址的擴(kuò)展)
server.bind(('127.0.0.1', 6789))
# 開始監(jiān)聽客戶端的連接
server.listen(512)
print('服務(wù)器已經(jīng)啟動(dòng)正在監(jiān)聽...')
time1 = str(datetime.datetime.now())
while True:
# 通過accept方法接收客戶端的連接
# accept方法是一個(gè)阻塞式的方法 如果沒有客戶端連上來
# 那么accept方法就會(huì)讓代碼阻塞 知道客戶端連接成功才返回
# accept方法返回一個(gè)元組 元祖宗的第一個(gè)值是代表客戶端的對(duì)象
# 元組的第二個(gè)值又是一個(gè)元組 其中有客戶端的IP地址和客戶端的端口
client, addr = server.accept()
print(addr, '連接成功')
while True:
data = client.recv(512)
print(data.decode('utf-8'))
b = input('服務(wù)器:')
client.send(('服務(wù)器:' + b).encode('utf-8'))
# client.send(time1.encode('utf-8'))
# client.close()
if __name__ == '__main__':
main()
客戶端
from socket import socket
def main():
# 表示持久化連接
while True:
# 創(chuàng)建套接字 其實(shí)就是創(chuàng)建一個(gè)通信口
client = socket()
# 客戶端是連接ip地址和端口號(hào) 服務(wù)器端則是綁定(bind)ip地址和端口號(hào)
client.connect(('127.0.0.1', 6789))
while True:
# 進(jìn)行通信
a = input('客戶端:')
client.send(('客戶端:' + a).encode('utf-8'))
data = client.recv(512)
# print(type(data))
print(data.decode('utf-8'))
if __name__ == '__main__':
main()