客户端与服务器连接后, 可同时向对方发送消息, 不干扰
时间: 2023-09-30 09:03:31 浏览: 79
可以使用多线程来实现客户端与服务器连接后,可以同时向对方发送消息,而不干扰。具体实现步骤如下:
1. 客户端连接服务器,并创建两个线程分别用于发送和接收消息。
```python
import socket
import threading
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))
def send_message():
while True:
message = input(">> ")
client_socket.send(message.encode())
def receive_message():
while True:
message = client_socket.recv(1024)
print(message.decode())
send_thread = threading.Thread(target=send_message)
receive_thread = threading.Thread(target=receive_message)
send_thread.start()
receive_thread.start()
```
在这个例子中,客户端创建了一个`socket`对象,并连接到服务器。然后,客户端创建了两个线程,一个用于发送消息,一个用于接收消息。这两个线程都是死循环,分别通过`input()`和`recv()`函数来获取用户输入和服务器发送过来的消息。
2. 服务器监听客户端连接,并创建两个线程分别用于发送和接收消息。
```python
import socket
import threading
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)
def handle_client(client_socket):
def send_message():
while True:
message = input(">> ")
client_socket.send(message.encode())
def receive_message():
while True:
message = client_socket.recv(1024)
print(message.decode())
send_thread = threading.Thread(target=send_message)
receive_thread = threading.Thread(target=receive_message)
send_thread.start()
receive_thread.start()
while True:
client_socket, client_address = server_socket.accept()
print('New connection from', client_address)
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
```
在这个例子中,服务器通过`accept()`函数接收客户端连接。然后,服务器创建了两个线程,一个用于发送消息,一个用于接收消息。这两个线程都是死循环,分别通过`input()`和`recv()`函数来获取用户输入和客户端发送过来的消息。
注意,在这个例子中,每个新的客户端连接都会创建一个新的线程来处理它的请求。因此,这个服务器程序可以同时处理多个客户端请求,每个客户端都会在独立的线程中被处理。
完整的代码如下:
客户端:
```python
import socket
import threading
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))
def send_message():
while True:
message = input(">> ")
client_socket.send(message.encode())
def receive_message():
while True:
message = client_socket.recv(1024)
print(message.decode())
send_thread = threading.Thread(target=send_message)
receive_thread = threading.Thread(target=receive_message)
send_thread.start()
receive_thread.start()
```
服务器:
```python
import socket
import threading
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(5)
def handle_client(client_socket):
def send_message():
while True:
message = input(">> ")
client_socket.send(message.encode())
def receive_message():
while True:
message = client_socket.recv(1024)
print(message.decode())
send_thread = threading.Thread(target=send_message)
receive_thread = threading.Thread(target=receive_message)
send_thread.start()
receive_thread.start()
while True:
client_socket, client_address = server_socket.accept()
print('New connection from', client_address)
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)