Python socket C/S结构的聊天室应用实现?

在网络编程中,C/S(Client/Server)结构是一种常见的架构模式,在这种模式下,客户端和服务器端通过一个通信协议进行交互,本文将详细介绍如何使用Python的socket库来实现一个简单的聊天室应用,该应用基于C/S结构,包括服务器端和客户端两部分。

Python socket C/S结构的聊天室应用实现?

二、Python socket库简介

Python的socket库提供了标准的BSD Sockets API,可以使用它来创建TCP/IP套接字,这些套接字可以用于TCP或UDP连接,socket库提供了一些基本的网络服务功能,如:创建套接字、绑定地址和端口、监听连接、接收和发送数据等。

三、服务器端实现

服务器端的主要任务是监听客户端的连接请求,接收客户端发送的消息,并将消息广播给所有在线的客户端,以下是服务器端的实现步骤:

1. 导入socket库,并创建一个socket对象。

2. 绑定服务器的IP地址和端口号。

3. 调用listen方法开始监听客户端的连接请求。

4. 使用一个无限循环来接受客户端的连接请求,当有新的客户端连接时,创建一个新的线程来处理这个客户端的所有请求。

5. 在每个线程中,接收客户端发送的消息,并将消息广播给所有在线的客户端。

6. 关闭与客户端的连接。

四、客户端实现

客户端的主要任务是连接到服务器,发送消息,并接收其他客户端发送的消息,以下是客户端的实现步骤:

2. 连接到服务器的IP地址和端口号。

3. 使用一个无限循环来发送和接收消息。

4. 当用户输入消息时,将消息发送给服务器。

5. 接收服务器广播的消息,并显示在屏幕上。

6. 关闭与服务器的连接。

五、代码实现

以下是服务器端和客户端的代码实现:

服务器端代码:

```python

import socket

import threading

# 创建socket对象

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 绑定IP地址和端口号

server.bind(('localhost', 8080))

# 监听连接请求

server.listen(5)

clients = [] # 存储所有在线的客户端

nicknames = [] # 存储所有在线的客户端昵称

def broadcast(message):

"""广播消息"""

Python socket C/S结构的聊天室应用实现?

for client in clients:

client.send(message)

def handle(client):

"""处理客户端请求"""

while True:

try:

msg = client.recv(1024)

broadcast(msg)

except:

index = clients.index(client)

clients.remove(client)

client.close()

nickname = nicknames[index]

nicknames.remove(nickname)

broadcast(f'{nickname} left the chat!'.encode('ascii'))

break

while True:

client, address = server.accept()

print(f'Connected with {str(address)}')

clients.append(client)

nickname = input('Choose a nickname: ')

nicknames.append(nickname)

client.send('NICK ' + nickname.encode('ascii'))

thread = threading.Thread(target=handle, args=(client,))

thread.start()

```

客户端代码:

import sys

from termcolor import colored

Python socket C/S结构的聊天室应用实现?

from time import sleep

from getpass import getpass

sys.stdout.write(colored('Welcome to Chat Room!', 'green'))

sys.stdout.write('

')

sys.stdout.flush()

nickname = input('Choose a nickname: ')

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client.connect(('localhost', 8080))

client.send('NICK ' + nickname.encode('ascii'))

def receive():

"""接收消息"""

msg = client.recv(1024).decode('ascii')

if msg == 'NICK':

nick = client.recv(1024).decode('ascii')

print(f'Nickname of the user is {nick}!')

elif msg == 'left the chat!':

print('Someone left the chat!')

sys.exit()

else:

print(msg)

print('An error occured!')

sys.exit()

def write(): """发送消息""" while True: msg = f'{nickname}: {input("")}' client.send(msg.encode('ascii')) if msg == 'bye': break receive() sleep(0.1) threading.Thread(target=write).start() client.close() # 启动接收和发送消息的线程 # 如果用户输入"bye",则退出程序 # 关闭与服务器的连接 # 主函数 def main(): print('Connecting...') sys.stdout.write(colored('Connecting...', 'green')) sys.stdout.write('

') sys.stdout.flush() nick = getpass('Enter your nickname: ') sys.stdout.write(colored('Connecting...', 'green')) sys.stdout.write('

') sys.stdout.flush() sys.stdout.write(colored('Connecting...', 'green')) sys.stdout.write('

') sys.stdout.flush() print('Connected!') sys.stdout.write(colored('Connected!', 'green')) sys.stdout.write('

') sys.stdout.flush() print('You are connected to the server!') sys.stdout.write(colored('You are connected to the server!', 'green')) sys.stdout.write('

') sys.stdout.flush() main() # 运行主函数 return main() if __name__ == '__main__': main() # 如果当前模块是主模块,则运行主函数;否则不执行任何操作。

# -*- coding: utf-8 -*-
# Python program for implementation of chat room using socket library in python
# Created on Sun Jan 19 13:57:59 2020 by guest
# @guest
# This program creates a simple chat room application based on Client-Server architecture using Python socket library and threads for handling multiple clients at the same time, where each client can send and receive messages from other clients connected to the server simultaneously over a network (LAN or Internet). The server listens for connection requests from clients, accepts them, and then creates a new thread for each client to handle their requests separately, allowing multiple clients to connect and communicate with each other simultaneously without any delay or lag in communication between them due to concurrency issues caused by handling multiple clients at once using threads instead of processes which would be more resource-intensive than necessary for this simple chat room application scenario involving only text-based messages being exchanged between clients over a network connection established through socket programming interface provided by Python standard library for network programming purposes such as file transfer protocol (FTP), email sending/receiving protocols like IMAP/POP3 etcetera...

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/3170.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2023-11-05 04:00
Next 2023-11-05 04:08

相关推荐

  • java如何调用http接口

    Java调用HTTP接口的方式有多种,其中一种是使用JDK网络类Java.net.HttpURLConnection。还有common封装好的HttpClient和Apache封装好的方式 。这些方式都可以用来调用HTTP接口。

    2024-01-02
    0209
  • c语言中set函数

    setsockopt函数简介setsockopt函数是C语言中用于设置套接字选项的函数,它允许应用程序在创建或已经创建的套接字上设置各种选项,这些选项可以影响套接字的行为,例如超时、重用地址等,setsockopt函数的原型如下:include <sys/socket.h>int setsockopt(in……

    2023-12-23
    0148
  • 为什么ssh密码输入不了文字

    为什么SSH密码输入不了?SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络环境中保护数据的安全,在使用SSH时,我们需要通过输入用户名和密码来验证身份,有时候我们会遇到无法输入密码的问题,这可能是由以下几个原因导致的:1、键盘布局问题我们的键盘布局可能与服务器的设置不匹配,导致无法输入密码,这种情况下,我……

    2024-01-19
    099
  • 服务器端返回的http状态码有哪些

    一、HTTP状态码简介HTTP状态码,又称为“状态响应码”,是服务器对客户端请求的响应结果进行描述的一种方式,它是由3位数字组成,第一位表示响应的类别,第二位表示具体的状态,第三位表示0-9的附加信息,通过查看HTTP状态码,我们可以了解到请求的处理情况,从而判断是否成功获取到了所需的资源。二、常见的HTTP状态码1、1xx:信息性状……

    2023-12-10
    0129
  • java的udp框架怎么使用

    Java的UDP框架使用UDP是一种无连接的、不可靠的、基于数据报的传输层协议,在Java中,我们可以使用java.net包中的DatagramSocket和DatagramPacket类来实现UDP通信,本文将详细介绍如何使用Java的UDP框架进行通信,我们需要创建一个DatagramSocket对象,用于接收和发送数据报,可以使用以下构造方法创建DatagramSocket对象:1、Da

    2023-12-22
    0126
  • Zabbix服务器端未能正常运行的解决方案 (zabbix服务器端未运行)

    Zabbix是一个开源的分布式监控系统,可以监控服务器、网络设备、虚拟机等,在使用Zabbix的过程中,可能会遇到一些问题,其中之一就是Zabbix服务器端未能正常运行,本文将详细介绍如何解决这一问题。1、检查Zabbix服务是否启动我们需要确认Zabbix服务是否已经启动,在Linux系统中,我们可以使用以下命令来检查Zabbix服……

    2024-03-08
    0369

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入