Python socket的聊天程序

用Python实现点对点的聊天,2个程序,一个是client.py,一个是server.py,通过本机地址127.0.0.1连接进行通信,利用多线程把发送消息和接收消息分开独立进行。

client代码:

import socket
import sys
import threading
import time


class client():
    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())
        except ConnectionError:
            print('connect error')
            sys.exit(-1)
        except:
            print('unexpect error')
            sys.exit(-1)

    def send_sth(self):
        while True:
            sth = input('say something:\n')
            try:
                self.s.sendall(sth.encode('utf-8'))
            except ConnectionError:
                print('connect error')
                sys.exit(-1)
            except:
                print('unexpect error')
                sys.exit(-1)

    def receive(self):
        while True:
            try:
                r = self.s.recv(1024)
                print('get message:' + r.decode('utf-8'))
            except ConnectionError:
                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


def server():
    def bind():
        HOST = '127.0.0.1'
        s.bind((HOST, 8888))
        print("bind ok")

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

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

    def recv(conn):
        while True:
            try:
                data = conn.recv(1024)
                data2 = data.decode('utf-8')
                print('get message:' + data2)
            except ConnectionError:
                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
class client(threading.Thread):
    def __init__(self,sth):
        threading.Thread.__init__(self)
        self.sth=sth
    def run(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()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值