1. 程式人生 > >python聊天程式(socket+多執行緒)

python聊天程式(socket+多執行緒)

用Python實現點對點的聊天,2個程式,一個是client.py,一個是server.py,通過本機地址127.0.0.1連線進行通訊,利用多執行緒把傳送訊息和接收訊息分開獨立進行。

client程式碼:

import socket
import sys
import threading
import time

classclient():
    def __init__(self):
        self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.ip = "127.0.0.1"

    def
connect(self): try: self.s.connect((self.ip,8888)) print("connect success") print('connect time: '+time.ctime()) exceptConnectionError: print('connect error') sys.exit(-1) except: print('unexpect error') sys.
exit(-1) defsend_sth(self): while True: sth=input('say something:\n') try: self.s.sendall(sth.encode('utf-8')) exceptConnectionError: print('connect error') sys.exit(-1) except: print
('unexpect error') sys.exit(-1) defreceive(self): while True: try: r=self.s.recv(1024) print ('get message:'+r.decode('utf-8')) exceptConnectionError: print('connect error') sys.exit(-1) except: print('unexpect error') sys.exit(-1) c1 = client() c1.connect() threading._start_new_thread(c1.receive,()) c1.send_sth()

server程式碼:

import socket
import sys
import threading
import time

defserver():
    defbind():
        HOST='127.0.0.1'
        s.bind((HOST,8888))
        print("bind ok")

    deflisten():
        s.listen(10)
        print ('Socket now listening')

    defsend_sth(conn):
        while True:
            try:
                sth=input('say something:\n')
                conn.sendall(sth.encode('utf-8'))
            exceptConnectionError:
                print('connect error')
                sys.exit(-1)
            except:
                print('unexpect error')
                sys.exit(-1)

    defrecv(conn):
         while True:
            try:
                data=conn.recv(1024)
                data2=data.decode('utf-8')
                print('get message:'+data2)
            exceptConnectionError:
                print('connect error')
                sys.exit(-1)
            except:
                print('unexpect error')
                sys.exit(-1)

    s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    bind()
    listen()
    conn,addr=s.accept()
    print("connect success")
    print('connect time: '+time.ctime())
    threading._start_new_thread(recv,(conn,))
    send_sth(conn)

if __name__=='__main__':
    server()

開啟多執行緒有2種方法,上面2個程式都是用函式的方法,還有一種方法是用類繼承threading類

程式碼:

import socket
import threading
classclient(threading.Thread):
    def __init__(self,sth):
        threading.Thread.__init__(self)
        self.sth=sth
    defrun(self):
        s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        ip="127.0.0.1"
        try:
            s.connect((ip,8888))
        except :
            print('con error')
            exit()
        #print("connect success")
        s.sendall(self.sth.encode('utf-8'))
        #print("send success")
        try:
            r=s.recv(1024)
        except:
            print('recv error')
            exit()
        print (r.decode('utf-8'))
c1=client('hello 1')
c1.start()
c2=client('hello 2')
c2.start()