题目描述:
本文主要介绍使用Python搭建服务器实现两个Android客户端间收发消息的完整攻略,包含以下内容:
- 简介
- 搭建TCP服务器
- 实现消息收发
- 示例代码
- 总结
简介
本文主要是介绍如何使用Python Socket模块搭建一个TCP服务器,并实现Android客户端和服务器之间的实时消息通信。
搭建TCP服务器
Python Socket模块是实现网络编程最常用的模块之一。首先我们需要在Python中引入Socket模块。
import socket
创建一个TCP服务器,以下是创建服务器的代码示例:
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 9999)) # 绑定 IP地址端口号
server_socket.listen(5) # 监听服务端口,可以接收的客户端连接数为5
解释一下上述代码:
- 使用 socket.socket() 创建了一个 socket 对象,AF_INET 参数是使用IPv4协议。SOCK_STREAM 参数指定了这个 socket 是基于TCP协议的。
- bind() 方法可以绑定一个 IP 地址和端口号来监听,这里我们监听所有IP地址的9999端口号。
- listen() 方法是监听客户端连接请求。参数是5,指定在拒绝新连接之前,服务器将收到的连接请求排队的最大数量为5.
实现消息收发
我们再来看以下如何实现Android客户端和服务器之间的实时消息通信。以下是服务器端收发消息的代码示例:
while True:
# 接收客户端连接请求
client_socket, client_address = server_socket.accept()
client_socket.settimeout(180)
try:
# 向客户端发送欢迎信息
client_socket.send("Welcome, Client!Please send your message!".encode('gb2312'))
while True:
try:
# 接收客户端消息
data = client_socket.recv(1024).decode('gb2312')
# 将接收到的消息发送给所有其它连接到服务器的客户端
for c in client_sockets:
if c != client_socket:
c.send("{} said: {}".format(str(client_address), data).encode('gb2312'))
except socket.timeout:
# 客户端连接超时
print("{} connect timeout".format(client_address))
break
解释一下上方代码:
- 进入一个无限循环,任何时候都有可能有客户端连接请求发过来,接收请求后继续循环等待。
- 使用 accept() 方法接收客户端的请求。此时会返回一个 client_socket 对象和客户端的地址信息;
- 向客户端发送欢迎信息,接下来进入一个无限循环,等待客户端发送消息;
- 如果有客户端发送消息,我们遍历所有连接到服务器的客户端,然后将这个消息发送给其它连接到服务器的客户端。
以下是Android客户端发送消息的代码示例:
Socket socket = new Socket("192.168.1.100", 9999);
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out.println("Hello Server!");
String response = in.readLine();
解释一下上方代码:
- 首先创建 TCP Socket 对象,指定服务器IP地址和端口号;
- 然后使用 PrintWriter 对象将消息发送给服务器;
- 阻塞式等待服务器的返回结果,即返回读取到的消息。
示例代码
以下是一个完整的示例代码:
import socket
import threading
def handle_client(client_socket, client_sockets, address):
client_socket.settimeout(180)
client_sockets.append(client_socket)
try:
client_socket.send("Welcome, Client!Please send your message!".encode('gb2312'))
while True:
try:
data = client_socket.recv(1024).decode('gb2312')
if not data or data == "exit": break
for c in client_sockets:
if c != client_socket:
c.send("{} said: {}".format(str(address), data).encode('gb2312'))
except socket.timeout:
print("{} connect timeout".format(address))
break
except:
pass
finally:
client_sockets.remove(client_socket)
client_socket.close()
if __name__ == "__main__":
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 9999))
server_socket.listen(5)
client_sockets = []
while True:
client_socket, address = server_socket.accept()
print("{} connected to the server".format(address))
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_sockets,address))
client_thread.start()
Java Android 客户端的示例代码
Socket socket = null;
BufferedReader input = null;
PrintWriter output = null;
StringBuilder sb = null;
try {
socket = new Socket("192.168.1.100", 9999);
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
output = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
output.println("Hello Server, I am a new Android!");
//读取服务器返回的消息
sb = new StringBuilder();
String line = null;
while ((line = input.readLine()) != null) {
sb.append(line);
}
Log.i(TAG, "Received from server: " + sb.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (input != null) input.close();
if (output != null) output.close();
if (socket != null) socket.close();
}catch (IOException e) {
e.printStackTrace();
}
}
总结
通过编写Python服务器程序,我们可以实现多个Android客户端之间的实时消息通信,这对于一些即时通讯、聊天系统等程序来说非常有用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python搭建服务器实现两个Android客户端间收发消息 - Python技术站