[100]socket作業
日期:2019-01-04
研究生:顏慷 Q36064117
目的:
透過Socket連線讓Server和Client建立溝通,並且實作程式碼,與其中的功能解說,相較於課本的範例,我加入”多線程”的功能,使得一個server端能跟多個client作溝通,好比說,server與client1做連結時,在加入client2後,兩個client都能夠傳送訊息給server,而server都能夠成功接收。
1.程式碼
Server端
#!/usr/bin/env python
#coding:utf-8
from socketserver import BaseRequestHandler,ThreadingTCPServer # socketserver 能對socket做封裝
import threading
BUF_SIZE=1024
class Handler(BaseRequestHandler):
def handle(self):
address,pid = self.client_address
print('%s connected! '%address)
# 啟動server準備讓client傳送訊息
while True:
data = self.request.recv(BUF_SIZE) # 接收client端傳的信息
if len(data)>0:
print(data.decode('utf-8')+ ' is received') #印出client端傳送的信息
cur_thread = threading.current_thread()
self.request.sendall('response'.encode('utf-8'))#送response到client端
print('send response to the client')
else: #如果client端輸入的信息長度小於0,server端會關閉對該client端的連接
print('close')
break
if __name__ == '__main__':
HOST = '127.0.0.1'
PORT = 8998
ADDR = (HOST,PORT)
server = ThreadingTCPServer(ADDR,Handler) #ADDR是監聽地址,handler是以建立連接的處理類
print('Server is listening')
server.serve_forever() #監聽,建立TCP連接後,對該連接創造新的socket與線程
print(server)
Client端
#!/usr/bin/env python
#coding:utf-8
import socket,sys
HOST = '127.0.0.1'
PORT = 8998
ADDR =(HOST,PORT)
BUFSIZE = 1024
sock = socket.socket() #建立socket
try:
sock.connect(ADDR) #連接到server端的地址
print('This client have connected with server')
while True:
data = input('-> ') #讓client端輸入
if len(data)>0:
print('send',data + ' to server')
sock.sendall(data.encode('utf-8')) #傳資料到server端
recv_data = sock.recv(BUFSIZE) # 接收server端傳來的資料
print('receive',recv_data.decode('utf-8')+' from server')
else:
sock.close()
break
except Exception:
print('error')
sock.close()
sys.exit()
Last updated
Was this helpful?