通过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函数可以将目标 ...
随机推荐
- Python爬虫实战案例:取喜马拉雅音频数据详解
前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...
- 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也
正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜. 在写标题时,本来想写"正则表达式小结",后来想了想,百度了一下, ...
- 第十四章 web前端开发小白学爬虫
老猿从事IT开发快三十年了,接触互联网也很久了,但自己没有做过web前端开发,只知道与前端开发相关的一些基本概念,如B/S架构.html标签.js脚本.css样式.xml解析.cookies.http ...
- Docker环境复现利用Redis未授权访问漏洞 >> 批量扫描检测利用
关于Redis Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...
- FHQ简要笔记
前言 原文写于 XJ 集训day2 2020.1.19. 现在想想那时候连模板都还没写,只是刚刚理解就在那里瞎yy--之前果然还是太幼稚了. 今天刷训练指南发现全是 Treap 和 Splay ,不想 ...
- 配置nginx支持THINKPHP的PATH_INFO
ThinkPHP支持通过PATHINFO和URL rewrite的方式来提供友好的URL,但是Nginx中默认是不支持PATHINFO的,所以我们需要修改nginx.conf文件. location ...
- Java8新特性探索之新日期时间库
一.为什么引入新的日期时间库 Java对日期,日历及时间的处理一直以来都饱受诟病,尤其是它决定将java.util.Date定义为可修改的以及将SimpleDateFormat实现成非线程安全的. 关 ...
- Object.assign 之后 点对象 找不到
export function CopyObject(val) { return JSON.parse(JSON.stringify(val)); }
- .NET Core集成CorrelationId实现全链路日志输出
.NET Core集成CorrelationId实现全链路日志输出 一,链路追踪 随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当 ...
- 日期格式化:推荐使用SimpleDateFormat
一.主题 日期格式化成字符串:SimpleDateFormat > DateFormatUtils 二.code public void DateFormat(){ SimpleDateForm ...