tcp/udp編程

學習自廖雪峯老師多的博客

經過測試好像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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章