通过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函数可以将目标 ...
随机推荐
- MongoEngine模块
今儿,接到老的的要求,要把新功能的数据存放在Mongo里.虽然一直都有听过Mango的鼎鼎大名,但是那也只是见过没用过,跟个小白没啥区别.在加上功能急需,没办法只能赶鸭子上架先上再说.下面这篇就是我赶 ...
- Java之选择排序(正序、逆序)
public class SelectSort { public static void main(String[] args) { /** * @author JadeXu * @// TODO: ...
- moviepy用VideoFileClip加载视频时报UnicodeDecodeError: utf-8 codec cant decode byte invalid start byte错误
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 使用moviepy用: clip1 = Video ...
- System.out.println();快捷键
不同开发工具的输出快捷键是不一样的-System.out.println(); eclipse&my eclipse中是syso +(alt+/) idea 是sout +tab 或者sout ...
- 第七篇 Scrum 冲刺博客
一.站立式会议 1. 会议照片 2. 工作汇报 团队成员名称 昨日完成的工作 今天计划完成的工作 工作中遇到的困难 陈锐基 - 封装消息组件- 我的关注和我的粉丝页面布局- 强化表白墙组件并和详情页对 ...
- Day6 Scrum 冲刺博客
一.站立式会议# 1. 会议照片 2. 工作进度+燃尽图 团队成员 昨日完成工作 今日工作计划 遇到的困难 周梓波 将方块旋转变形 添加键盘监听事件 不熟悉监听事件的操作 纪昂学 左右 ...
- AT2688 [ARC080C] Young Maids
一道挺有意思的题目,在这里记录一下. 题目大意 给你一个长度为 \(n\) 的排列,每一次你可以取出相邻的两个数将其放在答案序列的开头,最后问你字典序最小的答案序列是什么. 题解 由于最后是求字典序最 ...
- 题解-洛谷P4724 【模板】三维凸包
洛谷P4724 [模板]三维凸包 给出空间中 \(n\) 个点 \(p_i\),求凸包表面积. 数据范围:\(1\le n\le 2000\). 这篇题解因为是世界上最逊的人写的,所以也会有求凸包体积 ...
- 传输层-Transport Layer(下):UDP与TCP报头解析、TCP滑动窗口、TCP拥塞控制详解
第六章 传输层-Transport Layer(下) 上一篇文章对传输层的寻址方式.功能.以及流量控制方法做了简短的介绍,这一部分将介绍传输层最重要的两个实例:TCP协议和UDP协议,看一看之前描述的 ...
- 云小课 | 需求任务还未分解,该咋整!项目管理Scrum项目工作分解的心酸谁能知?
温馨提醒:本文约3000字,需要阅读5分钟,共分为8个部分,建议分段阅读! 软件开发过程中,从产品概念形成到产品规划.往往要做详细的需求分析和项目规划等,因此,选对一款项目管理工具对开发者就显得尤为重 ...