學習自廖雪峯老師多的博客
經過測試好像send和sento只能發送二進制的字母字符串或者是字符編碼爲utf-8格式
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014320037274136d31bd9979d648cd822375394e29a871000
TCP編程
TCP和UDP
相同點服務端都需要bind,
UDP綁定端口和TCP一樣,但是不需要調用listen()方法,而是直接接收來自任何客戶端的數據 ,TCP客戶端需要connect UDP客戶端不需要 完了之後客戶端拿socket就可以操作來
不同點詳細
TCP服務端需要listen 對應函數send recv 客戶端需要connect
sock,addr=socket.accept()#得到的這個新sock系統就知道往哪裏發了 客戶端直接用socket就行
sock.recv()
sock.send()
而UDP服務端不需要listen 對應函數sendto recvfrom recv 客戶端不需要connect
socket.recv socket.recvfrom socket.sendto
這裏我們需要知道的是 recvfrom返回 data, addr
recv只返回data
recvfrom()方法返回數據和客戶端的地址與端口,這樣,服務器收到數據後,直接調用sendto()就可以把數據用UDP發給客戶端。
客戶端使用UDP時,首先仍然創建基於UDP的Socket,然後,不需要調用connect(),直接通過sendto()給服務器發數據
這裏有篇文章詳細講述了recv recvfrom send sendto的不同
https://blog.csdn.net/xvd217/article/details/38902081
# server
import socket
import threading
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1',9998))
s.listen(5)
print('Waiting for connection...')
def tcplink(sock,addr):
print('accept new connection from %s:%s...' % addr)
sock.send('Welcome!'.encode('utf-8'))
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)
while True:
sock,addr=s.accept()
t=threading.Thread(target=tcplink,args=(sock,addr))
t.start()
# client
# coding=utf-8
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
s.connect(('127.0.0.1', 9998))
# 接收歡迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
# 發送數據:
s.send(data)
print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()
UDP編程
#client
import socket
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
# 發送數據:
s.sendto(('草泥馬'.encode('utf-8')), ('127.0.0.1', 9990))
# 接收數據:
print(s.recv(1024).decode('utf-8'))
s.close()
#server
import socket
import time
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口:
s.bind(('127.0.0.1', 9990))
print('Bind UDP on 9998...')
def udplink(data,addr):
s.sendto(b'Hello, %s!' % data, addr)
while True:
# 接收數據:
data, addr = s.recvfrom(1024)
print('Received from %s:%s.' % addr)
t=threading.Thread(target=udplink,args=(data,addr))
t.start()