基于python3的socket聊天编程

阶段一:最简易的聊天系统

缺点:程序不够完善,只能一来一回,且没人每次只能说一句话

server端:

import socket
HostPort = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
#print('Connecting by : %s ' % addr)
while 1:
    data = conn.recv(1024).decode()
    print (data)
    user_input = input('>>>')
    conn.send(user_input.encode('utf8'))
    #conn.close()
s.close()

client端:

import socket
hostport = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)

while 1:
    user_input = input('>>> ').strip()
    s.send(user_input.encode('utf-8'))
    if len(user_input) == 0:
        continue
    if user_input == 'quit':
        s.close()
        break
    server_reply = s.recv(1024).decode()
    print (server_reply)

注意事项:在python 3中,bytes和str是两个不同的概念,send和recv的数据都是bytes,而str转化成bytes是通过encode('utf8')实现,bytes转化成str,是通过decode()实现;

在该阶段,服务十分不稳定,经常会断开,所以有下一个阶段,且每人每次可以发送多条消息;


阶段二  多线程并发聊天系统

       在阶段一中,服务器端和客户的通信只能一发一收,不能实现服务器端和客户端双方的自由消息发送,所以,我们引用多线程,我们将消息的接收单独开一个线程,这样便可以服务器端和客户端实现同时发送多条消息,并不影响接收;

       开始上代码:

server端:

import socket
import threading                                                # 导入多线程模块
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)            # 创建socket实例
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
true=True
addr = str(addr)
print('Connecting by : %s ' %addr )
def Receve(conn):                                               # 将接收定义成一个函数
    global true                                                 # 声明全局变量,当接收到的消息为quit时,则触发全局变量 true = False,则会将socket关闭
    while true:
        data = conn.recv(1024).decode('utf8')          
        if data == 'quit':
            true=False
        print("you have receve: "+data+" from"+addr)            # 当接收的值为'quit'时,退出接收线程,否则,循环接收并打印
thrd=threading.Thread(target=Receve,args=(conn,))               # 线程实例化,target为方法,args为方法的参数 
thrd.start()                                                    # 启动线程
while true:
    user_input = input('>>>')
    conn.send(user_input.encode('utf8'))                        # 循环发送消息
    if user_input == 'quit':                                    # 当发送为‘quit’时,关闭socket
        true = False
    #conn.close()
s.close()

client 端

import socket
import threading
hostport = ('127.0.0.1',9999)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(hostport)
true = True
def Receve(s):
    global true
    while true:
        data = s.recv(1024).decode('utf8')
        if data == 'quit':
            true = False
        print('recevie news:\033[5;37;46m%s\033[0m' % data )
thrd=threading.Thread(target=Receve,args=(s,))
thrd.start()
while true:
    user_input = input('>>>')
    s.send(user_input.encode('utf8'))
    if user_input == 'quit':
        true = False
s.close()

效果展示(紫色字体为接收消息,白色字体为发送消息,双方任意一方输入'quit',即可退出)

1、服务器端:(原来只能服务器端先接收消息后才能发送消息,现在没有这种限制,可以随时主动发送)

基于python3的socket聊天编程_第1张图片

 

2、客户端     

基于python3的socket聊天编程_第2张图片


你可能感兴趣的:(python,项目)