socket通讯必须有服务端和客户端

创建服务端:

【第一步】:先创建一个socket类型的对象s:

s=socket.socket(familly,type)

family参数可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(用于IPV4协议的TCP和 UDP)。

type参数一般为SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字),很少用SOCK_RAW(raw套接字)。可以简单的认为:

SOCK_STREAM :能确保数据达到,用于发送文件数据。

SOCK_DGRAM  :不能确保数据到达,用于局域网广播消息。

SOCK_RAW        :需要自定义IP包,暂不解释。

其实后面还有参数proto用来指明要接收的协议包?fileno参数大概是内存地址一类的东西?默认都不填。

【第二步】:调用socket对象里的bind方法绑定IP和端口:

s.bind((host,port))

bind只有一个tuple(元组)类型的参数,host为客户端的ip,0.0.0.0表示任何ip,本地测试也可以用127.0.0.1,端口最好大于1024。

【第三步】:设置监听数:

s.listen( )

参数填最大监听的连接数。

【第四步】:accept方法接收客户端的连接:

connect , address = s.accept( )

无参数,程序进入阻塞模式直到有客户端连接,接收到连接后会返回一个元组形式的参数:connect为新产生的socket对象,address为客户端的ip。

【第五步】:收发数据及关闭连接:

必须使accept返回的新socket对象connect来收发数据,connect里的send和recv方法

connect.send(" string ".encode('utf8'))

connect.recv(size).decode('utf8')

send方法在Python2里参数是字符串,在Python3里参数是二进制对象,所以必须先用encode('utf8')将字符串重新编码

recv方法参数为读取的缓冲区大小size,与send方法同理,接收到数据后必须用decode('utf8')将数据解码成可读的字符串

最后会话结束s.close()关闭连接

创建客户端:

【第一步】:先创建一个socket类型的对象s:

s=socket.socket(familly,type)

与服务端同理

【第二步】:连接服务端:

s.connect((host,port))

host为服务端主机的ip,端口为服务端定义的端口。

【第三步】:收发数据及关闭连接:

与服务端同理的send和recv方法

s.send()、s.recv()、s.close()

具体代码(必须在CMD里运行,每次服务端或客户端仅能发送一条信息,if内代码可精简):

服务端:

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.bind(("127.0.0.1",1234))

s.listen(2)

sock,addr=s.accept()

while True:

t=sock.recv(1024).decode('utf8') #服务端先接收信息

if t == "exit":

break

print(t)

t=input()

if t == "exit":

break

sock.send(t.encode('utf8'))

s.close()

客户端:

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(("127.0.0.1",1234))

while True:

t=input()

s.send(t.encode('utf8')) #客户端先发送信息

if t == "exit":

break

t=s.recv(1024).decode("utf8")

if t == "exit":

break

print(t)

s.close()

由于input函数的阻塞作用,以上的代码发完一条信息,只能等待另一端的信息发过来才能继续发送。

这时就要考虑将输入与接收分开来,将接收的函数(或方法)从主线程里抓出来丢到另一个线程里单独运行,为实现这一功能,必须引入多线程。

多线程的使用别人的教程写得都太杂乱,什么select都来了……,其实很简单,Python里两句话搞定,需要import  threading

接收的方法为recv,就把s.recv()写到其他函数里,然后主函数里让它自己跑起来:

trd=threading.Thread(target=rec,args=(sock,))

trd.start()

target参数为需要跑起来的函数名,仅函数名,不需要括号,args为传递到target函数里的参数(元组类型),这里仅传入收发数据用的socket对象即可

改良后的代码(须在CMD里运行):

服务端:

import socket

import threading

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.bind(("127.0.0.1",9999))

s.listen(2)

sock,addr=s.accept()

true=True

def rec(sock):

global true

while true:

t=sock.recv(1024).decode('utf8') #函数的核心语句就一条接收方法

if t == "exit":

true=False

print(t)

trd=threading.Thread(target=rec,args=(sock,))

trd.start()

while true:

t=input()

sock.send(t.encode('utf8'))

if t == "exit":

true=False

s.close()

客户端:

import socket

import threading

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.connect(("127.0.0.1",9999))

true=True

def rec(s):

global true

while true:

t=s.recv(1024).decode("utf8") #客户端也同理

if t == "exit":

true=False

print(t)

trd=threading.Thread(target=rec,args=(s,))

trd.start()

while true:

t=input()

s.send(t.encode('utf8'))

if t == "exit":

true=False

s.close()

python远程聊天_python 实现实时聊天相关推荐

  1. THINKPHP聊天软件H5实时聊天室自动分配账户全开源商业源码

    介绍: THINKPHP聊天软件H5实时聊天室,自动分配账户,全开源商业源码 都是去年买的,很多买的源码基本都下架了, 源码的优点: 运营版本的聊天室,可以添加好友,建立群组,私聊,禁言功能 H5+T ...

  2. python 远程关机_Python 远程开关机

    本文目标远程开机原理 Python 远程开机代码实现 Python 关机说明 Python 开机 关于用程序来开机,是怎么做到的呢?这就是 WOL 技术 Wake-On-Lan, 利用计算机在关机或休 ...

  3. python远程聊天_python实现简单聊天室功能 可以私聊

    本文实例为大家分享了python实现简单聊天室功能的具体代码,供大家参考,具体内容如下 公共模块 首先写一个公共类,用字典的形式对数据的收发,并且进行封装,导入struct解决了TCP的粘包问题,并在 ...

  4. python读取输入流_Python读取实时数据流教程

    今天小编就为大家分享一篇Python读取实时数据流示例,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.#coding:utf-8 chose = [ ('foo',1,2), ( ...

  5. python太阳代码_python实现实时太阳跟踪

    获取太阳的方位俯仰信息,需要知道观测点的时间及坐标(经度纬度). 以西安为例:经度109°,纬度34°:西安用的是北京时间,比世界时间UTC早八个小时. 获取信息. 需要ephem库和time库,前者 ...

  6. 找不到实时聊天软件?给你推荐电商企业都在用的!

    关键词:实时聊天工具.跨境电商插件.用户运营 随着对实时聊天集成的需求不断增加,以及为您的客户支持部门节省时间和金钱的好处,实时聊天选项是您可以集成到电子商务网站的最佳应用程序之一. 在这篇文章中,了 ...

  7. 跨境电商如何通过实时聊天服务改善客户体验?

    关键词:跨境电商,实时聊天,客户服务 实时聊天是客户从跨境电商卖家那里获得即时帮助的沟通渠道.它促进了客户与跨境电商品牌人工代理之间的实时1:1交互,以解决客户问题. 企业通常在其网站上嵌入实时聊天支 ...

  8. 研究了11种实时聊天软件,我发现都具备这些功能…

    关键词:聊天插件功能.自动化聊天机器人.用户运营 查看最新和最好的电子商务企业实时聊天软件工具列表,从免费聊天应用程序到一体化平台. 根据 TechJury 的数据,四分之三的客户称他们更喜欢实时聊天 ...

  9. python远程聊天_Python实现多人在线匿名聊天的小程序

    最近看到好多设计类网站,都提供了多人在线匿名聊天的小功能,感觉很有意思,于是基于python的django框架自己写了一个,支持手动实时更名,最下方提供了完整的源码. 在线聊天地址(无需登录,开一个窗 ...

最新文章

  1. 关于mybatis的参数2个使用经验(类似于struts2的通配所有页面的action配置,xmlsq语句参数类型为基本类型时的快捷指定办法)...
  2. Java中设计模式之工厂模式-4
  3. 配置单节点伪分布式Hadoop
  4. fill in icon logic
  5. 哪些房产不能抵押做贷款?
  6. Android成长日记-Android布局优化
  7. 集成学习中的随机森林
  8. 使用actuator优雅地停止SpringBoot应用
  9. 匹配区县代码_北京各区县代码都是多少?
  10. CrossAPP第一课
  11. bing搜索崩溃无法访问?别慌,我来教你各大搜索引擎的选择
  12. C# WPF如何设置oxyplot的折线图禁止鼠标滚轮缩放
  13. Centos7 出现xxx不在sudoers文件中的解决方案
  14. YBTOJ反素数洛谷P1463(数论)
  15. ApacheCN 计算机视觉译文集 20210218 更新
  16. android转ios 王者荣耀,王者荣耀怎么转移号
  17. 504 gateway timeout解决方法
  18. 6月20日打卡50个单词
  19. TenorFlowJS-激活函数
  20. 使用WebClient实现文件下载

热门文章

  1. 唐太宗大喝一声:来人,给朕上云!
  2. solidworks渲染材质库_solidworks渲染材质参数
  3. 出现身份验证错误 要求的函数不受支持(可能是由于CredSSP加密数据库修正) Windows Server 服务器远程连接错误
  4. C++ 进制转换器:二进制、十进制、十六进制
  5. java基础知识总结---黑马程序员
  6. seo优化什么意思?
  7. 【视觉高级篇】23 # 如何模拟光照让3D场景更逼真?(上)
  8. 数据分析面试:Excel必考知识点!
  9. Python 可视化--Matplotlib 安装和pyplot
  10. kube-controller-manager源码分析(三)之 Informer机制