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()