Python3 socket编程,利用多线程完成最简单的聊天室 TCP和UDP

Python3利用多线程完成最简单聊天室


UDP发送信息


UDP发送信息就像写信,只需要收件信息,也就是只需要收方的IP地址和端口号

from socket import *

# 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)  # SOCK_DGRAM udp数据报套接字
# 发送数据
data_info = input('请输入需要发送的消息')
dest_ip = input('请输入对方的IP')
dest_port = int(input('请输入端口号')) # 端口号不能是字符串类型
dest_adr = (dest_ip,dest_port)
udp_socket.sendto(data_info.encode('gb2312'),dest_adr)
udp_socket.close()

UDP接收信息


UDP接收信息需要绑定IP信息和端口号

from socket import *
# 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)  # SOCK_DGRAM udp 数据报套接字
# 绑定本地ip信息
udp_socket.bind(('',8081))  # ''表示绑定所有的IP
# 接收数据
recv_data,dest_ip = udp_socket.recvfrom(1024) #1024 表示接收最大字节  防止内存溢出
print(recv_data.decode('gb2312'))
udp_socket.close()

多线程整合UDP接收和发送,完成聊天客户端


from socket import *
from threading import Thread

def recv_msg():
    while True:
        recv_data,dest_ip = udp_socket.recvfrom(1024)  # 1024 表示接收最大字节  防止内存溢出
        print(dest_ip, recv_data.decode("gb2312"))

def send_msg():
    while True:
        data_info = input('请输入内容')
        udp_socket.sendto(data_info.encode('gb2312'), (dest_ip, dest_port))


udp_socket = socket(AF_INET, SOCK_DGRAM)
udp_socket.bind(('', 4567))

dest_ip = input("对方的ip:")
dest_port = int(input('请输入对方端口号'))

thread_rece = Thread(target=recv_msg)
thread_send = Thread(target=send_msg)

thread_rece.start()
thread_send.start()

thread_rece.join()
thread_send.join()

TCP客户端收发信息


from socket import *
# 1、创建套接字
tcp_socket_client = socket(AF_INET,SOCK_STREAM)
# 2、创建链接
dest_ip = input('请输入对方ip')
dest_port = int(input('请输入对方端口'))
tcp_socket_client.connect((dest_ip,dest_port))
# 3、发送数据
data_info = input('请输入内容')
tcp_socket_client.send(data_info.encode('gbk'))
# 3、2接收数据
data_re = tcp_socket_client.recv(1024)
print(data_re.decode('gbk'))
# 4、关闭
tcp_socket_client.close()

TCP服务端


from socket import *

# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)  # 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)
# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动,这样就可以接收别人的连接了
tcpSerSocket.listen(128)
# 如果又新的客户端来连接服务器,那么就产生一个新的套接字专门为这个客户端服务器
# newSocket用来为这个客户端服务
# tcpSerSocket就可以省下来专门等待其他客户端的连接
newSocket, clientAddr = tcpSerSocket.accept()

# 接收对方发送过来的数据,最大接收1024个字节
recvData = newSocket.recv(1024)
print('接收到的数据为:', recvData.decode('gbk'))

# 发送一些数据到客户端
newSocket.send('thank you!'.encode("gbk"))

# 关闭这个客户端服务的套接字,只要关闭了,就意味着不能再为这个客户端服务器了,如果还需要服务,只能再次重新连接
newSocket.close()

# 关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收到任何新的客户端的连接
tcpSerSocket.close()

多线程整合TCP接收和发送,服务端及客户端

服务端


from socket import *
from threading import Thread

def recv():
    while True:
        recv_data= newSocket.recv(1024)
        print('>客户端:', recv_data.decode('gbk'))

def send_msg():
    while True:
        msg = input('>')
        newSocket.send(msg.encode('gbk'))

# 创建socket
tcpSerSocket = socket(AF_INET, SOCK_STREAM)
# 绑定本地信息
address = ('', 7788)
tcpSerSocket.bind(address)
tcpSerSocket.listen(128)
newSocket, clientAddr = tcpSerSocket.accept()

thread_rece = Thread(target=recv)
thread_send = Thread(target=send_msg)

thread_rece.start()
thread_send.start()

thread_rece.join()
thread_send.join()

# 关闭这个客户端服务的套接字,只要关闭了,就意味着不能再为这个客户端服务器了,如果还需要服务,只能再次重新连接
newSocket.close()

# 关闭监听套接字,只要这个套接字关闭了,就意味着整个程序不能再接收到任何新的客户端的连接
tcpSerSocket.close()

客户端

from socket import *
from threading import Thread

def recv():
    while True:
        data_recv = tcp_socket_client.recv(1024)
        print('>服务端:', data_recv.decode('gbk'))

def send_msg():
    while True:
        msg = input('>')
        tcp_socket_client.send(msg.encode('gbk'))


# 1、创建套接字
tcp_socket_client = socket(AF_INET,SOCK_STREAM)
# 2、创建链接
dest_ip = input('请输入服务端ip')
dest_port = int(input('请输入服务端端口'))
tcp_socket_client.connect((dest_ip,dest_port))

thread_rece = Thread(target=recv)
thread_send = Thread(target=send_msg)

thread_rece.start()
thread_send.start()

thread_rece.join()
thread_send.join()
# 4、关闭
tcp_socket_client.close()

猜你喜欢

转载自blog.csdn.net/wwg413411142/article/details/81747305
今日推荐