13 網絡編程案例——基於TCP的在線聊天程序(1)

#!/usr/bin/env python
# coding: utf-8

1 關鍵技術

1、互聯網TCP/IP協議

2、IP協議和端口

·IP協議
·端口

3、TCP協議和UPD協議

4、Socket:網絡編程的一個抽象概念
# 把客戶端發過來的字符串加上“Hello”再發回去
import socket, time
import threading

def tcplink(sock, addr):
    print('接收一個來自%s:%s連接請求' % addr)
    sock.send(b'welcome!')
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
            break
        sock.send(('Hello, %s' % data.decode('utf-8')).encode('utf-8'))
        
    sock.close()
    
    print('來自%s:%s連接關閉了' % addr)


# In[ ]:


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('127.0.0.1', 8887)) # 可以綁定到所有地址!設置爲0.0.0.0即可!
# 一個端口被一個socket(網絡編程)綁定之後,就不能再被其他socket綁定了!!
# 端口號小於1024需要管理員權限才能綁定!
s.listen(5)
print('等待客戶端連接...')
while True:
    sock, addr = s.accept()
    
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()




# 下面是客戶端!




import socket,time

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8887))

print(s.recv(1024).decode('utf-8'))# 打印出welcome!表示連接服務器成功!

for data in [b'Micheal', b'Tracy', b'Sarah']:
    s.send(data)
    print(s.recv(1024).decode('utf-8')) # 你發給服務器,服務器就有一個應答!
    
s.send(b'exit')
s.close()

2 多線程編程

import threading
import time

exitFlag = 0

class myThread(threading.Thread): # 繼承父類threading.Thread
    # 重寫__init__方法和run方法 創建 線程對象
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        
        self.threadID = threadID
        self.name = name
        self.counter = counter
        
    def run(self):
        print('Starting ' + self.name)
        
        print_time(self.name, self.counter, 5)
        
        print('Exiting ' + self.name)
        
def print_time(threadName, delay, counter):
    while counter:
        if exitFlag:
            thread.exit()
        time.sleep(delay)
        print('%s: %s' % (threadName, time.ctime(time.time())))
        counter -= 1



# 創建新線程
thread1 = myThread(1, 'Thread-1', 1)
thread2 = myThread(2, 'Thread-2', 2)

# 開啓線程
thread1.start()
thread2.start()
print('\nExiting Main Thread')
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章