通过python的socket库实现简易即时通讯小程序
前言
最近学习了一下有关tcp协议和socket有关的知识,看到许多socket实战都喜欢教如何做一个聊天程序,于是想着试试能不能不看教程自己写一个。当然我没太多时间做一个像qq一样的ui界面,所以做了个命令行程序。
下面是我写好的代码:
server代码
import socket
import threading serveraddr = ('0.0.0.0', 8080)#定义server的ip和地址 class Server:#server类
def __init__(self):
self.user={}
self.addr={}
self.server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.server.bind(serveraddr)
self.server.listen(128) def add_user(self,name,addr):
self.user[name]=addr
self.addr[addr[0]+str(addr[1])]=name def get_user(self,name):
return self.user[name] def main_thread(server,client,address):#主线程函数
datalist = client.recv(1024).decode('utf-8').split(' ', 3)
if datalist[1] == 'login':#登录
server.add_user(datalist[2],address)
client.send(str(address[1]).encode('utf-8'))
print('用户'+datalist[2]+'已录入',server.user[datalist[2]])
elif (datalist[1] == 'send' and len(datalist) == 4):#发送
if(datalist[2] in server.user.keys()):
target = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
target.connect(server.get_user(datalist[2]))
target.send(('用户'+datalist[0]+'发来一条信息:'+datalist[3]).encode('utf-8'))
client.send('success'.encode('utf-8'))
print('用户'+datalist[0]+'给用户'+datalist[2]+'发送了一条信息:'+datalist[3])
target.close()
else:
client.send(('用户'+datalist[2]+'不存在').encode('utf-8'))
print('用户'+datalist[2]+'不存在')
elif datalist[1] == 'close':#退出
print('已删除用户'+datalist[0])
client.send('success'.encode('utf-8'))
del server.user[datalist[0]]
else:#其他
client.send('格式有误'.encode('utf-8'))
client.close() def server_thread(server):#服务端
print('服务器已开启')
while(True):
client, address = server.server.accept()
threading.Thread(target=main_thread, args=(server,client,address)).start() if __name__ == "__main__":
server = Server()
threading.Thread(target=server_thread, args=(server,)).start()
while(True):
put = input()
if(put=='close'):
server.close()
break
else:
print('无效指令')
client代码
import socket
import threading serveraddr = ('127.0.0.1', 8080)#定义server的ip和地址 def client_thread(client,port):#客户端
client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
client.bind(('127.0.0.1', port))
client.listen(1)
while(True):
clientsocket, address = client.accept()
print(clientsocket.recv(1024).decode('utf-8')) if __name__ == "__main__":
#login指令
target = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
target.connect(serveraddr)
id = input('请输入你的用户名: ')
target.send(('none login '+id).encode('utf-8'))
port = int(target.recv(1024).decode('utf-8'))
print('链接成功')
target.close()
#启动客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
threading.Thread(target=client_thread, args=(client,port)).start()
#开始发送指令
while(True):
put = id+' '+input()
target = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
target.connect(serveraddr)
target.send(put.encode('utf-8'))
callback = target.recv(1024).decode('utf-8')
if(callback!='success'):
print(callback)
target.close()
if put.split(' ')[1] == 'close':#关闭客户端
break
client.close()
运行效果

client有三种命令,login,send,close,login只有且必须在client刚开启时使用,send就是发消息指令,close就是退出指令。
server只有close指令,用来停止server。
因为手上没有服务器的缘故只能在本机上完成,无法测试不同主机的效果,不过理论上应该可以(别打脸)。只需要把python文件的ip地址和端口改下就行,server放到云服务器开启,client在主机上使用,就可以模拟出简单的即时通讯了。
GitHub地址:https://github.com/modifyGB/mysocket
通过python的socket库实现简易即时通讯小程序的更多相关文章
- Java---基于TCP协议的相互即时通讯小程序
这是几年前,新浪的一个面试题~要求是3天之内实现~ 通过TCP 协议,建立一个服务器端. 通过配置服务器端的IP和端口: 客户端之间就可以相互通讯~ 上线了全部在线用户会收到你上线的通知. 下线了全部 ...
- Python底层socket库
Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...
- 基于Android 平台简易即时通讯的研究与设计[转]
摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...
- python实现串口通讯小程序(GUI界面)
python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...
- websocket和基于swoole的简易即时通讯
这里描述个基于swoole的websocket 匿名群聊 UI <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- 用Python快速实现一个垃圾分类APP|附带微信小程序
最近北京开始实行垃圾分类,导致大家对垃圾的研究热度突然涨高,垃圾们也纷纷表示从来没有获得过这么高的关注度.其实,上海市去年已经开始实行,网上已经有不少成熟的教程了,像什么<垃圾分类从入门到精通& ...
- 网络编程-Python的socket库
一.网络连接经常用到的函数 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)参数一:地址簇 socket.AF_INET IPv4(默认) ...
- 使用Python的Django和layim实现即时通讯
看到Django和layim实现websocketde资料很少,自己就琢磨了下,顺便搭建出来了.自己要去找闲心大神授权呀. 先来看图 这是初次搭建的,今天一天就搞定.我自己接入了图灵机器人. Pyt ...
- Python的numpy库下的几个小函数的用法
numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...
随机推荐
- 牛客巅峰赛S2第6场题解
牛客编程巅峰赛S2第6场 A-StringⅡ 题目 题目描述 给出一个仅包含小写字母的字符串s,你最多可以操作k次,使得任意一个小写字母变为与其相邻的小写字母(ASCII码差值的绝对值为1),请你求出 ...
- urllib.request.urlopen(req).read().decode解析http报文报“utf-8 codec can not decode”错处理
老猿前期执行如下代码时报"'utf-8' codec can't decode byte"错,代码及错误信息如下: >>> import urllib.reque ...
- Monkey 部署环境
Monkey的介绍 它是Android系统自带一个命令行工具,可以运行在模拟器里或者真是设备中运行. Monkey是发送伪随机用户事件的工具. Monkey向系统发送伪随机的用户事件流,实现对正在开发 ...
- 题解-CF802C Heidi and Library (hard)
题面 CF802C Heidi and Library (hard) 有一个大小为 \(k\) 的空书架.有 \(n\) 天和 \(n\) 种书,每天要求书架中有书 \(a_i\).每天可以多次买书, ...
- AcWing 311 .月之谜
大型补档补了一年 题目链接 考虑枚举月之数的数列和,然后展开dp预处理 设当前模数为 \(P\) \(f[i][j][k]\) 表示一共有 i 位数字,数位和为 j,数值和 % P 的值为 K \(f ...
- 容器编排系统之Kubectl工具的基础使用
前文我们了解了k8s的架构和基本的工作过程以及测试环境的k8s集群部署,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/14126750.html:今天我们主要来 ...
- centos 7 配置 mysql 5.7 主从复制
centos 7 配置 mysql 5.7 主从复制 主库:192.168.12.3 从库:192.168.12.2 1. 主库从库所在服务器关闭防火墙Systemctl stop firewalld ...
- UML—20—003
博客班级 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 作业要求 https://edu.cnblogs.com/campus/fzzcxy/2018SE ...
- Exception in thread "main" java.lang.NoSuchMethodError: scala.collection.immutable.HashSet$.empty()Lscala/collection/immutable/HashSet;
注意spark的Scala版本和java版本 修改后为官方指定的版本正常运行 Error:scalac: Error: object FloatRef does not have a member c ...
- Django使用channels实现Websocket连接
简述: 需求:消息实时推送消息以及通知功能,采用django-channels来实现websocket进行实时通讯.并使用docker.daphne启动通道,保持websocket后台运行 介绍Dja ...