如下代碼兼容python2.7+、python3
python
TCP示例windows
服務器 -- sever_tcp.py服務器
#!/usr/bin/env python #coding=utf-8 import time import socket import threading local_addr = ('127.0.0.1',8888) buff_len = 1024 def conn_proc(sock, addr): print('accept new connection from %s:%s...' % addr) # 發送數據給客戶端 sock.send('welcome'.encode('utf-8')) while True: print('wating for message...') # 阻塞接收客戶端數據 date = sock.recv(buff_len) if not date or date.decode('utf-8')=='exit': break print(date.decode('utf-8')) time.sleep(1.5) sock.send(('server '+str(time.time())).encode('utf-8')) sock.close() print('close connection %s:%s' % addr) if __name__ == '__main__': # 建立一個socket tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 綁定監聽的地址和端口 tcp.bind(local_addr) # 開始監聽端口,等待鏈接的最大數量爲10 tcp.listen(10) while True: # 阻塞等待客戶端過來的tcp鏈接 sock,addr = tcp.accept() # 建立一個新線程來處理TCP鏈接 threading.Thread(target=conn_proc,args=(sock,addr)).start() # 關閉socket tcp.close()
打印log以下:python2.7
accept new connection from 127.0.0.1:51241...
wating for message...
hello server.1563353570.55
wating for message...
1563353572.05socket
客戶端 -- client_tcp.py tcp
#!/usr/bin/env python #coding=utf-8 import time import socket server_addr = ('127.0.0.1',8888) buff_len = 1024 if __name__ == '__main__': # 建立一個socket tcp = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 創建鏈接 tcp.connect(server_addr) # 發送數據給服務器 tcp.send('hello server.'.encode('utf-8')) # 阻塞接收服務器數據 print(tcp.recv(buff_len).decode('utf-8')) while True: tcp.send(str(time.time()).encode('utf-8')) date = tcp.recv(buff_len) if not date or date.decode('utf-8')=='exit': break print(date.decode('utf-8')) # 關閉socket tcp.close()
打印log以下: spa
welcome
server 1563353572.051841線程
UDP示例code
服務端 -- server_udp.pyserver
#!/usr/bin/env python #coding=utf-8 import time import socket local_addr = ('127.0.0.1',8888) buff_len = 1024 if __name__ == '__main__': # 建立一個socket udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 綁定監聽的地址和端口 udp.bind(local_addr) while True: print('wating for message...') # 阻塞接收客戶端數據 data, addr = udp.recvfrom(buff_len) print('received from %s data:%s' % (addr, data.decode('utf-8'))) time.sleep(1.5) # 發送數據給客戶端 udp.sendto(('server '+str(time.time())).encode('utf-8'), addr) # 關閉socket udp.close()
打印log以下:
wating for message...
received from ('127.0.0.1', 51264) data:hello server.
wating for message...
received from ('127.0.0.1', 51264) data:1563353804.57
wating for message...
received from ('127.0.0.1', 51264) data:1563353806.07
客戶端 -- client_udp.py
#!/usr/bin/env python #coding=utf-8 import time import socket server_addr = ('127.0.0.1',8888) buff_len = 1024 if __name__ == '__main__': # 建立一個socket udp = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 發送數據給服務器 udp.sendto('hello server.'.encode('utf-8'), server_addr) # 阻塞接收服務器數據 print(udp.recv(buff_len).decode('utf-8')) while True: udp.sendto(str(time.time()).encode('utf-8'),server_addr) print(udp.recv(buff_len).decode('utf-8')) # 關閉socket udp.close()
打印log以下:
server 1563353804.56509
server 1563353806.0682404
若是udp鏈接不通或收發數據延遲,解決辦法有2個:
1. 直接關閉防火牆
2. disable防火牆中阻止udp的策略規則,並容許python.exe經過防火牆
在windows上,若想讓python隱藏窗口,可在程序啓動後,插入以下代碼:
import ctypes main_wnd = ctypes.windll.kernel32.GetConsoleWindow() if main_wnd != 0: ctypes.windll.user32.ShowWindow(main_wnd, 0) ctypes.windll.kernel32.CloseHandle(main_wnd)