PythonTCP服務器與客戶端

PythonTCP服務器與客戶端

參考網上代碼整理出來的。

服務器

慎用gethostname()方法獲取本地連接名稱,如果系統中有多張網卡,可能獲取到的IP不對!!!

import socket
import time
def main():
    tcpServerSocket=socket.socket(socket.AF_INET, socket.SOCK_STREAM)#創建socket對象
    host = socket.gethostname()#獲取本地主機名
    port=5533#設置端口
    tcpServerSocket.bind(('', port))#將地址與套接字綁定,且套接字要求是從未被綁定過的
    tcpServerSocket.listen(5)#代辦事件中排隊等待connect的最大數目
    #建立客戶端連接,接受connection,返回兩個參數,c是該connection上可以發送和接收數據的新套接字對象
    #addr是與connection另一端的套接字綁定的地址
    c, addr = tcpServerSocket.accept()       
    print ('連接地址:', addr)
    while True:
        try:
            msg = c.recv(256)
            msg_de = msg.decode('utf-8')
            print("[%s] len:%d" %(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), len(msg_de)))
            print(msg_de)

            str='message from python server.'
            c.send(str.encode())
        except:
            print('exception.')
            c.shutdown()
            c.close()
        #套接字在垃圾收集garbage-collected時會自動close
        #close關閉該connection上的資源但不一定馬上斷開connection
        #想要立即斷開connection,要先調用shutdown再close
    c.shutdown()
    c.close() # 關閉連接

if __name__ == "__main__":
    main()

客戶端

import socket
import time
def main():
    # 1.創建tcp_client_socket 套接字對象
    tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 作爲客戶端,主動連接服務器較多,一般不需要綁定端口

    # 2.連接服務器
    tcp_client_socket.connect(("192.168.123.80",5533))
    while True:
        """無限循環可以實現無限聊天"""
        # 3.向服務器發送數據
        meg = 'hello world!\n'
        tcp_client_socket.send(meg.encode()) 
        # 在linux中默認是utf-8編碼
        # 在udp協議中使用的sendto() 因爲udp發送的爲數據報,包括ip port和數據,
        # 所以sendto()中需要傳入address,而tcp爲面向連接,再發送消息之前就已經連接上了目標主機

        # 4.接收服務器返回的消息
        recv_data = tcp_client_socket.recv(1024)  # 此處與udp不同,客戶端已經知道消息來自哪臺服務器,不需要用recvfrom了

        if recv_data:
            print("返回的消息爲:",recv_data.decode('gbk'))
        else:
            print("對方已離線。。")
            break
        time.sleep(1)

    tcp_client_socket.close()

if __name__ == "__main__":
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章