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 模块,可以实现实时文本消息的发送和接收。

服务器代码:

  1. 使用 socket 模块创建套接字对象,绑定地址和端口,并监听连接请求。
  2. 使用 threading 模块创建一个线程,用于接收来自客户端的数据。
  3. 当有客户端连接时,使用 accept() 方法接收连接,并启动接收数据线程。
  4. 接收数据线程不断从套接字中读取数据,并将其显示在消息区域。

客户端代码:

  1. 使用 socket 模块创建套接字对象,连接到服务器。
  2. 使用 threading 模块创建一个线程,用于接收来自服务器的数据。
  3. 连接到服务器后,启动接收数据线程。
  4. 接收数据线程不断从套接字中读取数据,并将其显示在消息区域。

本示例代码只是一个简单的实现,可以进一步扩展和改进,例如增加用户登录、用户列表、私聊等功能。

Python TCP 聊天服务器和客户端实现

原文地址: https://www.cveoy.top/t/topic/oeum 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录