[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?