Python TCP 聊天服务器和客户端实现
import tkinter as tk
import tkinter.scrolledtext
import socket
import threading
win = tk.Tk()
win.title('TCP聊天服务器')
win.geometry('500x320')
# ------------------------------------
# msgArea : 消息(字符串)显示文本区
# 插入消息到文本区末尾:msgArea.insert(tk.END, string)
# 设置文本区可修改: msgArea['state'] = tk.NORMAL
# 设置文本区不可修改: msgArea['state'] = tk.DISABLED
msgvar = tk.StringVar(value='hello')
msgArea = tk.scrolledtext.ScrolledText(win,bg='white',state = tk.DISABLED)
msgArea.place(x=10, y=10, width=480, height = 240)
# ------------------------------------
# 服务器IP、Port配置
host = None
port = 8000
serverAddr = None
serverSocket = None
server = None
clickAddr = None
# ------------------------------------
sendvar = tk.StringVar(value = '')
sendEntry = tk.Entry(win,textvariable = sendvar)
sendEntry.place(x=10, y=260, width=380, height = 20)
# 发送数据 :
def send():
# 需完善代码
data = sendvar.get()
bytes = data.encode('utf-8')
serverSocket.send(bytes)
sendvar.set('')
data = ('本机(%s):
'% host) + data + '
'
#在文本域中插入字符串
msgArea['state'] = tk.NORMAL
msgArea.insert(tk.END,data)
msgArea['state'] = tk.DISABLED
sendBtn = tk.Button(win,text='发送',command=send)
sendBtn.place(x=410, y=260, width=80, height=20)
serverIPLabel = tk.Label(win,text='服务器')
serverIPLabel.place(x=10, y=290, width=50, height=20)
# 服务器IP地址:自动获取、显示本机IP
serverIPVar = tk.StringVar(win, value=host)
serverIPEntry = tk.Entry(win, textvariable=serverIPVar)
serverIPEntry.place(x=80, y=290, width=100, height=20)
# 服务器Port端口:默认值,不可修改
serverPortVar = tk.StringVar(win, value = f'{port}')
serverPortEntry = tk.Entry(win, textvariable=serverPortVar)
serverPortEntry.place(x=200, y=290, width=60, height=20)
def recv():
while True:
data = serverSocket.recv(1024)
data = data.encode('utf-8')
data = ('客户端(%s):
'%clickAddr[0]) + data + '
'
#在文本域中插入字符串
msgArea['state'] = tk.NORMAL
msgArea.insert(tk.END,data)
msgArea['state'] = tk.DISABLED
# --------------------------------------------------------------------------
# 创建线程,等待与一个客户端连接
def netConn():
global host,serverAddr,consocket,serverSocket,clientAddr
host = serverIPVar.get().strip()
serverAddr = (host,port)
#创建socket项目
consocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
consocket.bind(serverAddr)
#监听
consocket.listen()
#接收连接
serverSocket,clientAddr = consocket.accept()
#发送
threading.Thread(target= recv).start()
def startNetConn():
# 创建线程去连接
threading.Thread(target=netConn).start()
listenBtn = tk.Button(win,text='监听',command=startNetConn)
listenBtn.place(x=410, y=290, width=80, height=20)
# ------------------------------------
win.mainloop()
import tkinter as tk
import tkinter.scrolledtext
import socket
import threading
win = tk.Tk()
win.title('TCP聊天客户端')
win.geometry('500x320')
# ------------------------------------
# msgArea : 消息(字符串)显示文本区
# 插入消息到文本区末尾:msgArea.insert(tk.END, string)
# 设置文本区可修改: msgArea['state'] = tk.NORMAL
# 设置文本区不可修改: msgArea['state'] = tk.DISABLED
msgvar = tk.StringVar(value='hello')
msgArea = tk.scrolledtext.ScrolledText(win,bg='white',state = tk.DISABLED)
msgArea.place(x=10, y=10, width=480, height = 240)
# ------------------------------------
# 服务器IP、Port配置
host = 'localhost'
port = 8000
serverAddr = None
clientSocket = None
server = None
# ------------------------------------
sendvar = tk.StringVar(value = '')
sendEntry = tk.Entry(win,textvariable = sendvar)
sendEntry.place(x=10, y=260, width=380, height = 20)
# 发送数据 :
def send():
# 需完善代码
data = sendvar.get()
bytes = data.encode('utf-8')
clientSocket.send(bytes)
sendvar.set('')
data = ('本机(%s):
'% host) + data + '
'
#在文本域中插入字符串
msgArea['state'] = tk.NORMAL
msgArea.insert(tk.END,data)
msgArea['state'] = tk.DISABLED
sendBtn = tk.Button(win,text='发送',command=send)
sendBtn.place(x=410, y=260, width=80, height=20)
serverIPLabel = tk.Label(win,text='服务器')
serverIPLabel.place(x=10, y=290, width=50, height=20)
# 服务器IP地址:自动获取、显示本机IP
serverIPVar = tk.StringVar(win, value=host)
serverIPEntry = tk.Entry(win, textvariable=serverIPVar)
serverIPEntry.place(x=80, y=290, width=100, height=20)
# 服务器Port端口:默认值,不可修改
serverPortVar = tk.StringVar(win, value = f'{port}')
serverPortEntry = tk.Entry(win, textvariable=serverPortVar)
serverPortEntry.place(x=200, y=290, width=60, height=20)
def recv():
while True:
data = clientSocket.recv(1024)
data = data.decode('utf-8')
data = ('服务器(%s):
'%serverAddr[0]) + data + '
'
#在文本域中插入字符串
msgArea['state'] = tk.NORMAL
msgArea.insert(tk.END,data)
msgArea['state'] = tk.DISABLED
# --------------------------------------------------------------------------
# 创建线程,连接服务器
def netConn():
global host,serverAddr,clientSocket
host = serverIPVar.get().strip()
serverAddr = (host,port)
#创建socket对象
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接服务器
clientSocket.connect(serverAddr)
#接收
threading.Thread(target= recv).start()
def startNetConn():
# 创建线程去连接
threading.Thread(target=netConn).start()
connectBtn = tk.Button(win,text='连接',command=startNetConn)
connectBtn.place(x=410, y=290, width=80, height=20)
# ------------------------------------
win.mainloop()
代码实现了一个简单的 TCP 聊天服务器和客户端,使用 Python 的 tkinter 库和 socket 模块,可以实现实时文本消息的发送和接收。
服务器代码:
- 使用
socket模块创建套接字对象,绑定地址和端口,并监听连接请求。 - 使用
threading模块创建一个线程,用于接收来自客户端的数据。 - 当有客户端连接时,使用
accept()方法接收连接,并启动接收数据线程。 - 接收数据线程不断从套接字中读取数据,并将其显示在消息区域。
客户端代码:
- 使用
socket模块创建套接字对象,连接到服务器。 - 使用
threading模块创建一个线程,用于接收来自服务器的数据。 - 连接到服务器后,启动接收数据线程。
- 接收数据线程不断从套接字中读取数据,并将其显示在消息区域。
本示例代码只是一个简单的实现,可以进一步扩展和改进,例如增加用户登录、用户列表、私聊等功能。
原文地址: https://www.cveoy.top/t/topic/oeum 著作权归作者所有。请勿转载和采集!