前言

套接字(Sockets)是双向通信信道的端点。 套接字可以在一个进程内,在同一机器上的进程之间,或者在不同主机的进程之间进行通信,主机可以是任何一台有连接互联网的机器。

套接字可以通过多种不同的通道类型实现:Unix域套接字,TCP,UDP等。 套接字库提供了处理公共传输的特定类,以及一个用于处理其余部分的通用接口。

socket模块:

要创建套接字,必须使用套接字模块中的socket.socket()函数,该函数具有一般语法

s = socket.socket (socket_family, socket_type, protocol = 0)
参数 描述
socket_family 它的值可以是:AF_UNIX或AF_INET,如前所述。
socket_type 它的值可以是:SOCK_STREAM或SOCK_DGRAM。
protocol 这通常被省略,默认为0。

常用方法:

序号 方法 描述
1 s.bind() 此方法将地址(主机名,端口号对)绑定到套接字。
2 s.recvfrom() 此方法接收UDP消息,返回值是一对(字节, 地址) ,其中字节是代表接收到的数据的字节对象,而地址是发送数据的套接字的地址
3 s.sendto() 此方法发送UDP消息,将数据发送到套接字。该套接字不应连接到远程套接字,因为目标套接字是由address指定的
4 s.close() 此方法关闭套接字,套接字对象上所有以后的操作都将失败。远端将不再接收任何数据(在清除排队的数据之后)。套接字在被垃圾回收时会自动关闭
5 socket.gethostname() 返回主机名,返回一个字符串,其中包含当前正在执行Python解释器的计算机的主机名。

示例1

服务器端

#sever.py
import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 8088
s.bind((host,port))
try:
while True:
receive_data,addr = s.recvfrom(1024)
print("来自服务器" + str(addr) + "的消息:")
print(receive_data.decode('utf-8'))
msg = input('please input send to msg:')
s.sendto(msg.encode('utf-8'),addr)
except:
s.close()

客户端

#client.py
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
try:
while True:
host = socket.gethostname()
port = 8088
send_data = input('please input msg:')
s.sendto(send_data.encode('utf-8'),(host,port))
msg,addr = s.recvfrom(1024)
print("来自服务器" + str(addr) + "的消息:")
print(msg.decode('utf-8'))
except:
s.close()

服务端示例



客户端示例



简易的UDP聊天实现了,下面我们来优化一下示例。

示例2

服务端:

#server.py
import socket
import logging def main():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 创建socket对象 addr = ('127.0.0.1', 9999)
s.bind(addr) # 绑定地址和端口 logging.info('UDP Server on %s:%s...', addr[0], addr[1]) user = {} # 存放字典{addr:name}
while True:
try:
data, addr = s.recvfrom(1024) # 等待接收客户端消息存放在2个变量data和addr里
if not addr in user: # 如果addr不在user字典里则执行以下代码
for address in user: # 从user遍历数据出来address
s.sendto(data + ' 进入聊天室...'.encode('utf-8'), address) # 发送user字典的data和address到客户端
user[addr] = data.decode('utf-8') # 接收的消息解码成utf-8并存在字典user里,键名定义为addr
continue # 如果addr在user字典里,跳过本次循环 if 'EXIT'.lower() in data.decode('utf-8'):#如果EXIT在发送的data里
name = user[addr] #user字典addr键对应的值赋值给变量name
user.pop(addr) #删除user里的addr
for address in user: #从user取出address
s.sendto((name + ' 离开了聊天室...').encode(), address) #发送name和address到客户端
else:
print('"%s" from %s:%s' %(data.decode('utf-8'), addr[0], addr[1]))
for address in user: #从user遍历出address
if address != addr: #address不等于addr时间执行下面的代码
s.sendto(data, address) #发送data和address到客户端 except ConnectionResetError:
logging.warning('Someone left unexcept.') if __name__ == '__main__':
main()

客户端:

#clinet.py
import socket
import threading def recv(sock, addr):
'''
一个UDP连接在接收消息前必须要让系统知道所占端口
也就是需要send一次,否则win下会报错
'''
sock.sendto(name.encode('utf-8'), addr)
while True:
data = sock.recv(1024)
print(data.decode('utf-8')) def send(sock, addr):
'''
发送数据的方法
参数:
sock:定义一个实例化socket对象
server:传递的服务器IP和端口
'''
while True:
string = input('')
message = name + ' : ' + string
data = message.encode('utf-8')
sock.sendto(data, addr)
if string.lower() == 'EXIT'.lower():
break def main():
'''
主函数执行方法,通过多线程来实现多个客户端之间的通信
'''
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server = ('127.0.0.1', 9999)
tr = threading.Thread(target=recv, args=(s, server), daemon=True)
ts = threading.Thread(target=send, args=(s, server))
tr.start()
ts.start()
ts.join()
s.close() if __name__ == '__main__':
print("-----欢迎来到聊天室,退出聊天室请输入'EXIT(不分大小写)'-----")
name = input('请输入你的名称:')
print('-----------------%s------------------' % name)
main()

支持多人的简易聊天室示例,多个客户端通过一个服务器进行之间通信







Python基于Socket实现简易多人聊天室的更多相关文章

  1. Python实现网络图形化界面多人聊天室 - Windows

    Python实现网络图形化界面多人聊天室 - Windows 项目名称:网络多人聊天室图形界面版本 项目思路: server.py 服务端文件,主进程中,创建图形化界面,询问地址(主机名,端口),点击 ...

  2. Python实现网络图形化界面多人聊天室 - Linux

    网络图形化界面多人聊天室 - Linux Windows版本:https://www.cnblogs.com/noonjuan/p/12078524.html 在Python实现网络多人聊天室基础上, ...

  3. 利用socket.io实现多人聊天室(基于Nodejs)

    socket.io简单介绍 在Html5中存在着这种一个新特性.引入了websocket,关于websocket的内部实现原理能够看这篇文章.这篇文章讲述了websocket无到有,依据协议,分析数据 ...

  4. java 用socket制作一个简易多人聊天室

    代码: 服务器端Server import java.io.*; import java.net.*; import java.util.ArrayList; public class Server{ ...

  5. python从socket做个websocket的聊天室server

    下面的是server端:把IP改成自己的局域网IP: #coding:utf8 import socket,select import SocketServer import hashlib,base ...

  6. Python实现网络多人聊天室

    网络多人聊天室 文件结构: chatroom ├── client.py  # 客户端代码 ├── language.py  # 语言文件 ├── server.py  # 服务端代码 └── set ...

  7. 与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室

    原文:与众不同 windows phone (31) - Communication(通信)之基于 Socket UDP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  8. 与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室

    原文:与众不同 windows phone (30) - Communication(通信)之基于 Socket TCP 开发一个多人聊天室 [索引页][源码下载] 与众不同 windows phon ...

  9. 基于tcp和多线程的多人聊天室-C语言

    之前在学习关于网络tcp和多线程的编程,学了知识以后不用一下总绝对心虚,于是就编写了一个基于tcp和多线程的多人聊天室. 具体的实现过程: 服务器端:绑定socket对象->设置监听数-> ...

随机推荐

  1. 假如把Redis服务器们拉到一个群,看看他们是怎么工作的?

    我是Redis,一个叫Antirez的男人把我带到了这个世界上. 那天,Redis基友群里,许久未见的大白发来了一条消息··· 于是,大白拉了一个新的群 以后的日子中,咱们哥仨相互配合,日常工作中最多 ...

  2. 安装 Homebrew&iterm2&Oh My Zsh

    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/instal ...

  3. Python+Django实现微信扫码支付流程

    Python+Django实现微信扫码支付流程 关注公众号"轻松学编程"了解更多. 获取源码可以加我微信[1257309054],文末有二维码. [微信公众号支付官网]https: ...

  4. Django项目之打分系统

    打分系统 关注公众号"轻松学编程"了解更多. 项目GitHub地址:https://github.com/liangdongchang/VoteSys.git 1.开发需求 a. ...

  5. [Luogu P1122]最大子树和 (简单树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...

  6. Charles使用part5——模拟慢网络

    一.配置参数解析: bandwidth -- 带宽,即上行.下行数据传输速度utilisation -- 带宽可用率,大部分modern是100%round-trip latency -- 第一个请求 ...

  7. CF1320C World of Darkraft: Battle for Azathoth

    线段树 又是熟悉的感觉,又是E题写完了,没调完,不过还好上了紫 CF1295E 可以发现可以打败怪兽的关系类似二维偏序 那么首先考虑第一维(武器)以攻击值($a_{i}$)进行排序 把所有的怪兽以防御 ...

  8. C++ 数据结构 1:线性表

    1 数据结构 1.1 数据结构中基本概念 数据:程序的操作对象,用于描述客观事物. 数据的特点: 可以输入到计算机 可以被计算机程序处理 数据是一个抽象的概念,将其进行分类后得到程序设计语言中的类型. ...

  9. 数据采集与融合第四次作业:多线程以及scrapy框架的使用

    数据采集第四次作业:多线程以及scrapy框架的使用 任务一:单多线程的使用 单线程代码: from bs4 import BeautifulSoup from bs4 import UnicodeD ...

  10. c++与c

    const char* c_str ( ) const; Get C string equivalent Generates a null-terminated sequence of charact ...