目录
- 简单例子
- 实际例子:
简单例子
sock.send(b'' 必须是二进制 )
复制代码
1
2
3
4
5
6socket.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(默认) )
服务端
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27import 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()
客户端
复制代码
1
2
3
4
5
6
7
8
9
10
11
12import 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
实际例子:
服务端 和 客户端的网络聊天
服务端:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135# 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()
客户端:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144# 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网络聊天简单例子实际例子内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复