我是靠谱客的博主 生动煎蛋,最近开发中收集的这篇文章主要介绍python网络聊天简单例子实际例子:,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 简单例子
  • 实际例子:

简单例子

sock.send(b'' 必须是二进制 )

socket.socket(
	family = socket.AF_UNIX UNIX通信| socket.AF_INET 服务器网络通信| AF_INET6 IPv6, 
	type = socket.SOCK_STREAM TCP| socket.SOCK_DGRAM UDP| socket.SOCK_RAW 原始套接字 | socket.SOCK_SEQPACKET 数据包服务,
	proto = 0(默认)
)

服务端

import socket
import threading
import time

def tcplink(sock, addr):
    print('接收来自' + str(addr) + '的请求连接')
    sock.send(b'welcome!') # 必须是 b二进制
    while True:
        data = sock.recv(1024) # 接收客户端发来的消息
        time.sleep(1) # 延迟一秒
        if not data or data.decode('utf-8') =='exit':
            break
        sock.send(('hello %s' % data.decode('utf-8')).encode('utf-8')) # 收到消息
    sock.close() # 关闭连接
    print(str(addr) + '的连接关闭了')

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET - 服务器网络通信
# socket.SOCK_STREAM - TCP连接
s.bind(('127.0.0.1', 8888)) # 监听本机端口
s.listen(5) # 连接数最大是5
print('等待客户端连接...')
while True:
    sock, addr = s.accept() # 接受一个新连接
    t = threading.Thread(target=tcplink, args=(sock, addr))
    t.start()

客户端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket.AF_INET - 服务器网络通信
# socket.SOCK_STREAM - TCP连接
s.connect(('127.0.0.1', 8888))
print(s.recv(1024).decode('utf-8'))
for data in [b'a', b'b', b'c']:
    s.send(data)
    print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

pack 详解:
https://blog.csdn.net/polyhedronx/article/details/81634902

实际例子:

服务端 和 客户端的网络聊天

服务端:

# Python 在线聊天 服务器端

import tkinter
import tkinter.font as tkFont
import socket
import threading
import time, sys

class ServerUI():
    local = '127.0.0.1'
    port = 5505
    global serverSock;
    flag = False

    # 初始化类的相关属性,类似于Java的构造方法
    def __init__(self):
        self.root=tkinter.Tk() # 窗口对象
        self.root.title('Python 在线聊天-服务器端 v1.0') # 窗口标题

        # 窗口面板,4个frame面板布局
        self.frame=[tkinter.Frame(), tkinter.Frame(), tkinter.Frame(), tkinter.Frame()]

        # 显示消息Text 右边的滚动条
        self.chatTextScrollBar=tkinter.Scrollbar(self.frame[0])
        self.chatTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y) # pack 布局管理

        # 显示消息 Text,并绑定上面的滚动条
        ft=tkFont.Font(family='Fixdsys',size=11)
        self.chatText=tkinter.Listbox(self.frame[0],width=70,height=18,font=ft) # 列表框
        self.chatText['yscrollcommand']=self.chatTextScrollBar.set # yscrollcommand 垂直滚动
        self.chatText.pack(expand=1,fill=tkinter.BOTH)
        self.chatTextScrollBar['command']=self.chatText.yview()
        self.frame[0].pack(expand=1,fill=tkinter.BOTH)

        #标签,分开消息显示 Text 和消息输入Text
        label=tkinter.Label(self.frame[1],height=2)
        label.pack(fill=tkinter.BOTH)
        self.frame[1].pack(expand=1,fill=tkinter.BOTH)

        #输入消息 Text 的滚动条
        self.inputTextScrollBar=tkinter.Scrollbar(self.frame[2])
        self.inputTextScrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)

        #输入消息 Text,并与滚动条绑定
        ft=tkFont.Font(family='Fixdsys',size=11)
        self.inputText=tkinter.Text(self.frame[2],width=70,height=8,font=ft)
        self.inputText['yscrollcommand']=self.inputTextScrollBar.set
        self.inputText.pack(expand=1,fill=tkinter.BOTH)
        self.inputTextScrollBar['command']=self.chatText.yview()
        self.frame[2].pack(expand=1,fill=tkinter.BOTH)

        # “发送”按钮
        self.sendButton = tkinter.Button(self.frame[3], text='发送', width=10,command=self.sendMessage) # self.sendMessage 单独写成函数
        self.sendButton.pack(expand=1, side=tkinter.BOTTOM and tkinter.RIGHT, padx=25, pady=5)

        # “关闭”按钮
        self.closeButton = tkinter.Button(self.frame[3], text='关闭', width = 10, command = self.close)
        self.closeButton.pack(expand = 1, side=tkinter.RIGHT, padx=25, pady=5)
        self.frame[3].pack(expand=1, fill=tkinter.BOTH)

    # 接收消息
    def receiveMessage(self):
        # 建立 Socket 连接
        self.serverSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.serverSock.bind((self.local, self.port))
        self.serverSock.listen(15)
        self.buffer = 1024
        self.chatText.insert(tkinter.END, '服务器已经就绪......') # insert 插入对应光标位置

        # 循环接受客户端的连接请求
        while True:
            self.connection, self.address = self.serverSock.accept()
            self.flag = True

            while True:
                # 接收客户端发送的消息
                self.cientMsg = self.connection.recv(self.buffer).decode('utf-8') # 接收消息
                if not self.cientMsg:
                    continue
                elif self.cientMsg == 'Y':
                    self.chatText.insert(tkinter.END, '服务器端已经与客户端建立连接......')
                    self.connection.send(b'Y')
                elif self.cientMsg == 'N':
                    self.chatText.insert(tkinter.END, '服务器端与客户端建立连接失败......')
                    self.connection.send(b'N')
                else:
                    theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    self.chatText.insert(tkinter.END, '客户端 ' + theTime + ' 说:n')
                    self.chatText.insert(tkinter.END, '  ' + self.cientMsg)

    # 发送消息
    def sendMessage(self):
        # 得到用户在Text中输入的消息
        message = self.inputText.get('1.0', tkinter.END) # '1.0' 不变

        # 格式化当前的时间
        theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

        self.chatText.insert(tkinter.END, '服务器 ' + theTime + ' 说:n')
        self.chatText.insert(tkinter.END, '  ' + message + 'n')

        if self.flag == True:
            # 将消息发送到客户端
            self.connection.send(message.encode())
        else:
            # Socket连接没有建立,提示用户
            self.chatText.insert(tkinter.END, '您还未与客户端建立连接,客户端无法收到您的消息n')

        # 清空用户在Text中输入的消息
        self.inputText.delete(0.0, message.__len__() - 1.0)

    #关闭消息窗口并退出
    def close(self):
        sys.exit()

    # 启动线程接收客户端的消息
    def startNewThread(self):
        # 启动一个新线程来接收客户端的消息
        thread = threading.Thread(target=self.receiveMessage, args = ())
        # receiveMessage函数不需要参数,就传一个空元组
        # args是传递给线程函数的参数

        thread.setDaemon(True)
        # 主线程运行结束时不对这个子线程进行检查而直接退出

        thread.start()

def main():
    server = ServerUI()
    server.startNewThread()
    server.root.mainloop() #  server.root.mainloop() = while True:

if __name__ == '__main__':
    main()

客户端:

# Python 在线聊天 客户端

import tkinter
import tkinter.font as tkFont
import socket
import sys
import threading
import time

class ClientUI():
    title = 'Python在线聊天-客户端V1.0'
    local = '127.0.0.1'
    port = 5505
    global clientSock;
    flag = False

    # 初始化类的相关属性,类似于Java的构造方法
    def __init__(self):
        self.root = tkinter.Tk()
        self.root.title(self.title)

        # 窗口面板,用4个面板布局
        self.frame = [tkinter.Frame(), tkinter.Frame(), tkinter.Frame(), tkinter.Frame()]

        # 显示消息Text 右边的滚动条
        self.chatTextScrollBar = tkinter.Scrollbar(self.frame[0])
        self.chatTextScrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)  # pack 布局管理

        # 显示消息 Text,并绑定上面的滚动条
        ft = tkFont.Font(family='Fixdsys', size=11)
        self.chatText = tkinter.Listbox(self.frame[0], width=70, height=18, font=ft)  # 列表框
        self.chatText['yscrollcommand'] = self.chatTextScrollBar.set  # yscrollcommand 垂直滚动
        self.chatText.pack(expand=1, fill=tkinter.BOTH)
        self.chatTextScrollBar['command'] = self.chatText.yview()
        self.frame[0].pack(expand=1, fill=tkinter.BOTH)

        # 标签,分开消息显示 Text 和消息输入Text
        label = tkinter.Label(self.frame[1], height=2)
        label.pack(fill=tkinter.BOTH)
        self.frame[1].pack(expand=1, fill=tkinter.BOTH)

        # 输入消息 Text 的滚动条
        self.inputTextScrollBar = tkinter.Scrollbar(self.frame[2])
        self.inputTextScrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)

        # 输入消息 Text,并与滚动条绑定
        ft = tkFont.Font(family='Fixdsys', size=11)
        self.inputText = tkinter.Text(self.frame[2], width=70, height=8, font=ft)
        self.inputText['yscrollcommand'] = self.inputTextScrollBar.set
        self.inputText.pack(expand=1, fill=tkinter.BOTH)
        self.inputTextScrollBar['command'] = self.chatText.yview()
        self.frame[2].pack(expand=1, fill=tkinter.BOTH)

        # “发送”按钮
        self.sendButton = tkinter.Button(self.frame[3], text='发送', width=10,command=self.sendMessage)  # self.sendMessage 单独写成函数
        self.sendButton.pack(expand=1, side=tkinter.BOTTOM and tkinter.RIGHT, padx=25, pady=5)

        # “关闭”按钮
        self.closeButton = tkinter.Button(self.frame[3], text='关闭', width=10, command=self.close)
        self.closeButton.pack(expand=1, side=tkinter.RIGHT, padx=25, pady=5)
        self.frame[3].pack(expand=1, fill=tkinter.BOTH)

    # 接收消息
    def receiveMessage(self):
        try:
            # 建立Socket连接
            self.clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.clientSock.connect((self.local, self.port))
            self.flag = True
        except:
            self.flag = False
            self.chatText.insert(tkinter.END, '您还未与服务器端建立连接,请检查服务器端是否已经启动')
            return

        self.buffer = 1024
        self.clientSock.send('Y'.encode())

        while True:
            try:
                if self.flag == True:
                    # 连接建立,接收服务器端消息
                    self.serverMsg = self.clientSock.recv(self.buffer).decode('utf-8')
                    if self.serverMsg == 'Y':
                        self.chatText.insert(tkinter.END, '客户端已经与服务器端建立连接......')
                    elif self.serverMsg == 'N':
                        self.chatText.insert(tkinter.END, '客户端与服务器端建立连接失败......')
                    elif not self.serverMsg:
                        continue
                    else:
                        theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                        self.chatText.insert(tkinter.END, '服务器端 ' + theTime + ' 说:n')
                        self.chatText.insert(tkinter.END, '  ' + self.serverMsg)
                else:
                    break
            except EOFError as msg:
                raise msg #  raise 允许程序自行引发异常
                self.clientSock.close()
                break

    # 发送消息
    def sendMessage(self):
        # 得到用户在Text中输入的消息
        message = self.inputText.get('1.0', tkinter.END)  # '1.0' 不变

        # 格式化当前的时间
        theTime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

        self.chatText.insert(tkinter.END, '服务器 ' + theTime + ' 说:n')
        self.chatText.insert(tkinter.END, '  ' + message + 'n')

        if self.flag == True:
            # 将消息发送到服务器端
            self.clientSock.send(message.encode())
        else:
            # Socket连接没有建立,提示用户
            self.chatText.insert(tkinter.END, '您还未与服务器建立连接,服务器无法收到您的消息n')

        # 清空用户在Text中输入的消息
        self.inputText.delete(0.0, message.__len__() - 1.0)

    # 关闭消息窗口并退出
    def close(self):
        sys.exit()

    # 启动线程接收客户端的消息
    def startNewThread(self):
        # 启动一个新线程来接收客户端的消息
        thread = threading.Thread(target=self.receiveMessage, args=())
        # receiveMessage函数不需要参数,就传一个空元组
        # args是传递给线程函数的参数

        thread.setDaemon(True)
        # 主线程运行结束时不对这个子线程进行检查而直接退出

        thread.start()

def main():
    client = ClientUI()
    client.startNewThread()
    client.root.mainloop()

if __name__ == '__main__':
    main()

最后

以上就是生动煎蛋为你收集整理的python网络聊天简单例子实际例子:的全部内容,希望文章能够帮你解决python网络聊天简单例子实际例子:所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部