前言

  最近学习了一下有关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库实现简易即时通讯小程序的更多相关文章

  1. Java---基于TCP协议的相互即时通讯小程序

    这是几年前,新浪的一个面试题~要求是3天之内实现~ 通过TCP 协议,建立一个服务器端. 通过配置服务器端的IP和端口: 客户端之间就可以相互通讯~ 上线了全部在线用户会收到你上线的通知. 下线了全部 ...

  2. Python底层socket库

    Python底层socket库将Unix关于网络通信的系统调用对象化处理,是底层函数的高级封装,socket()函数返回一个套接字,它的方法实现了各种套接字系统调用.read与write与Python ...

  3. 基于Android 平台简易即时通讯的研究与设计[转]

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

  4. python实现串口通讯小程序(GUI界面)

    python实现串口通讯小程序(GUI界面) 使用python实现串口通讯需要使用python的pyserial库来实现,这个库在安装python的时候没有自动进行安装,需要自己进行安装. 1.安装p ...

  5. websocket和基于swoole的简易即时通讯

    这里描述个基于swoole的websocket 匿名群聊 UI <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  6. 用Python快速实现一个垃圾分类APP|附带微信小程序

    最近北京开始实行垃圾分类,导致大家对垃圾的研究热度突然涨高,垃圾们也纷纷表示从来没有获得过这么高的关注度.其实,上海市去年已经开始实行,网上已经有不少成熟的教程了,像什么<垃圾分类从入门到精通& ...

  7. 网络编程-Python的socket库

    一.网络连接经常用到的函数 sk = socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)参数一:地址簇 socket.AF_INET IPv4(默认) ...

  8. 使用Python的Django和layim实现即时通讯

    看到Django和layim实现websocketde资料很少,自己就琢磨了下,顺便搭建出来了.自己要去找闲心大神授权呀. 先来看图  这是初次搭建的,今天一天就搞定.我自己接入了图灵机器人. Pyt ...

  9. Python的numpy库下的几个小函数的用法

    numpy库是Python进行数据分析和矩阵运算的一个非常重要的库,可以说numpy让Python有了matlab的味道 本文主要介绍几个numpy库下的小函数. 1.mat函数 mat函数可以将目标 ...

随机推荐

  1. PyQt(Python+Qt)学习随笔:QTableWidget的currentItem、rowCount、columnCount等部件状态属性访问方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 老猿将QTableWidget表格部件中反映部件当前情况的一些方法归类为部件状态访问方法,包括部件的 ...

  2. burp添加插件

    困扰了我很长时间的验证码,虽然迫使我早就找到了相关文章,但是由于一些原因,就推迟了验证码相关的东西.今天趁着晚上,好好的安装一下 下载地址 https://github.com/bit4woo/reC ...

  3. js之数组乱序

    这是最近面试遇到的,不过忘记了,之前也有印象刷到过这道题,就再次记录一下加深印象吧,听到最多的答案是利用sort方法,不过也有说这种方法不好,利用了快排和插入排序,那就整理下吧 <!DOCTYP ...

  4. Java中的Reference类使用

    Java 2 平台引入了 java.lang.ref 包,这个包下面包含了几个Reference相关的类,Reference相关类将Java中的引用也映射成一个对象,这些类还提供了与垃圾收集器(gar ...

  5. AcWing 195. 骑士精神

    双向BFS (广搜) \(O(8 ^ 7)\) 看到没有双向BFS的题解我就过来了 这道题也可以用双向\(BFS\)来做,时间复杂度与\(IDA*\)不相上下. 双向\(BFS\)的实现有多种: 把初 ...

  6. linux下安装Zookeeper 3.4.14

    1.下载Zookeeper 3.4.14(https://zookeeper.apache.org/) wget https://mirror.bit.edu.cn/apache/zookeeper/ ...

  7. 20201204-3 opp编程好处

    面向对象编程(Object-Oriented Programming )介绍 对于编程语言的初学者来讲, OOP不是一个很容易理解的编程方式,大家虽然都按老师讲的都知道0OP的三大特性是 继承.封装. ...

  8. 解决python3 ,ModuleNotFoundError: No module named 'pip'问题

    今天想要装一下PyYmal第三方库来写一下Python的desired_caps.yaml文件,候发现cmd窗口下无法执行pip命令, 出现了:ModuleNotFoundError: No modu ...

  9. JavaSE16-集合·其三

    1.Map集合 1.1 Map集合概述和特点 1 interface Map<K,V> K:键的类型:V:值的类型 Map集合的特点 键值对映射关系 一个键对应一个值 键不能重复,值可以重 ...

  10. Java IO流 BufferedInputStream、BufferedOutputStream的基本使用

    BufferedInputStream.BufferedOutputStream的基本使用 BufferedInputStream是FilterInputStream流的子类,FilterInputS ...