通过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函数可以将目标 ...
随机推荐
- 第4.2节 神秘而强大的Python生成器精讲
一. 生成器(generator)概念 生成器是一个特殊的迭代器,它保存的是算法,每次调用next()或send()就计算出下一个元素的值,直到计算出最后一个元素,没有更多的元素时,抛出StopIte ...
- 老猿学5G扫盲贴:中国移动网络侧CHF主要功能及计费处理的主要过程
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...
- XML文件格式
首行是需要对xml版本声明<?xml version="1.0" ecoding="UTF-8"?> 语言可根据需要修改 在编写xml的几个注意点 ...
- 最简单的Go Dockerfile编写姿势,没有之一!
1. Dockerfile一些额外注意点 选择最简单的镜像 比如alpine,整个镜像5M左右 设置镜像时区 RUN apk add --no-cache tzdata ENV TZ Asia/Sha ...
- AcWing 404. 婚礼
大型补档计划 题目链接 根据题意,显然只有新郎这边可能存在矛盾,考虑这边怎么放即可,新娘那边的放法与这边正好相反且一一对应. 显然对于两个约束条件是一对矛盾,开始我以为可以用并查集,后来发现输出方案的 ...
- CentOS配置Nginx官方的Yum源
由于yum源中没有我们想要的nginx,那么我们就需要创建一个"/etc/yum.repos.d/nginx.repo"的文件,其实就是新增一个yum源. [root@niaoyu ...
- sqli-labs less32-37(宽字节注入)
less-32 Bypass addslashes() less-33 Bypass addslashes() less-34 Bypass Add SLASHES less-35 addslashe ...
- 【操作系统】页面置换算法(最佳置换算法)(C语言实现)
[操作系统]页面置换算法(最佳置换算法)(C语言实现) (编码水平较菜,写博客也只是为了个人知识的总结和督促自己学习,如果有错误,希望可以指出) 1.页面置换算法: 在地址映射过程中,若在页面中发现所 ...
- 圆周率PI
import math import time scale=30 s,m,=1,2 total,s,n,t=0.0,1,1.0,1.0 print("执行开始".center(sc ...
- MobaXterm无法退格删除
MobaXterm退格删除出现^H,总是要取消输入重新敲语句,很麻烦 解决方法:打开MobaXterm-->settings-->Configuration,把"Backspac ...