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()