客戶端
# 導(dǎo)入socket庫(kù):
import socket
#socket.AF_INET 表示ip4,SOCK_STREAM流的形式
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('127.0.0.1', 9999))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 發(fā)送數(shù)據(jù):
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
服務(wù)端
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 監(jiān)聽端口:
s.bind(('127.0.0.1', 9999))
#5表示最大連接數(shù)量
s.listen(5)
#接下來(lái),服務(wù)器程序通過(guò)一個(gè)永久循環(huán)來(lái)接受來(lái)自客戶端的連接,accept()會(huì)等待并返回一個(gè)客戶端的連接:
print('Waiting for connection...')
while True:
# 接受一個(gè)新連接:
sock, addr = s.accept()
# 創(chuàng)建新線程來(lái)處理TCP連接:
t = threading.Thread(target=tcplink, args=(sock, addr))
t.start()
#每個(gè)連接都必須創(chuàng)建新線程(或進(jìn)程)來(lái)處理,否則,單線程在處理連接的過(guò)程中,無(wú)法接受其他客戶端的連接:
def tcplink(sock, addr):
print('Accept new connection from %s:%s...' % addr)
sock.send(b'Welcome!')
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode('utf-8') == 'exit':
break
sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()
print('Connection from %s:%s closed.' % addr)

Paste_Image.png
UDP
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
# 發(fā)送數(shù)據(jù):
s.sendto(data, ('127.0.0.1', 9999))
# 接收數(shù)據(jù):
print(s.recv(1024).decode('utf-8'))
s.close()
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口:
s.bind(('127.0.0.1', 9999))
print('Bind UDP on 9999...')
while True:
# 接收數(shù)據(jù):
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
reply = 'Hello, %s!' % data.decode('utf-8')
s.sendto(reply.encode('utf-8'), addr)

Paste_Image.png