实现功能:

  启动“服务器”、通过“客户端1”连接“服务器”,然后互发消息。在此过程中,有“客户端2”连接到“服务器”,此时,“客户端2”处于占线状态,必须要等“客户端1”退出之后才能与“服务器”互发消息。

知识点:

  s = socket.socket(family,type)  声明一个socket类型,同时创建连接(套接字),一般默认就可以

 family 参数:

  socket.AF_UNIX # 只能够用于单一的Unix系统进程间通信

  socket.AF_INET # IPV4 服务器之间网络通信

  socket.AF_INET6 # IPV6

 type 参数:

  socket.SOCK_STREAM # 流式socket 用于 TCP

  socket.SOCK_DGRAM # 数据报式socket 用于 UDP

主要方法:

  s.send(以字节类型发送,要发送的信息),返回值为要发送的字节数量,可能小于要发送的字节数。

  s.sendall(以字节类型发送,要发送的信息),发送所有。实际是内部递归调用send,发送所有内容。

  s.setblocking(True/False) accept或recv时是否阻塞,等待连接。若False,在接收时无数据,则会报错。

  s.recv(指定最多可以接收的字节数) 接收信息,以字符串形式返回

  s.recvfrom(指定最多可以接收的字节数) 接收信息,返回2个值(要接收的字符串,发送信息的地址)

  s.settimeout(多少秒)  设置等待多长时间之后端口连接,单位秒

  s.sendfile() 发送文件

  s.getpeername() 返回连接的远程地址:ip,端口

  s.getsockname() 返回自己的地址:ip,端口

  s.close() 关闭连接

  s.bind(address) 绑定地址,一般情况是元组形式:(ip,端口)

  s.listen(最大连接数) 开始监听传入连接,连接数不能无限大

  s.accept() 接收连接(阻塞式),并返回2个值(新的连接对象,连接地址),同时等待连接的到来。

  s.connect(address)  连接到指定地址(服务器)

  s.connect_ex(address)  连接到指定地址(服务器),连接成功返回0,否者返回错误代码

服务器端流程:声明、绑定监听、获取连接、接收、发送、关闭

1、创建连接(套接字)

2、绑定要监听的ip(本地)、端口

3、开始监听连接

4、连接客户端请求

5、接收客户端信息

6、给客户端发送信息

7、关闭连接

客户端流程:声明、连接、发送、接收、关闭

1、创建连接(套接字)

2、通过ip、端口连接服务器

3、给服务器端发送信息

4、接收服务器端信息

5、关闭连接

整体流程:服务器监听连接,客户端发送连接请求,服务器接收请求,互发信息

具体代码:

  1. #!/user/bin env python
  2. # author:Simple-Sir
  3. # time:2020/7/22 17:01
  4. import socket
  5.  
  6. # 服务器端
  7. s = socket.socket() # 声明一个socket类型,同时创建连接(套接字)
  8. s.bind(('10.108.226.140', 6969)) # 绑定要监听的ip、端口
  9. s.listen(5) # 开始监听连接
  10. print('等待连接...')
  11. while 1:
  12. conn,address = s.accept() # 连接客户端请求(筛选连接对象,在服务器端生产新的连接)
  13. ip_c, port_c = conn.getsockname() # 本地IP
  14. ip_s, port_s = conn.getpeername() # 远程IP
  15. print('{0}:{1}已连接上了。'.format(ip_s,port_s))
  16. while 1:
  17. data2 = conn.recv(1024) # 接收信息,字符串
  18. if not data2:
  19. print('客户端{0}:{1}已断开连接。'.format(ip_s,port_c))
  20. break
  21. print('客户端 {0}:{1}:{2}'.format(ip_s,port_s,data2.decode('utf-8')))
  22. while 1:
  23. info = input('服务器 {0}:{1}:'.format(ip_c, port_c))
  24. if len(info) == 0:
  25. print('不能输入空值,请重新输入!')
  26. else:
  27. break
  28. conn.send(info.encode('utf-8')) # 发送信息,字节
  29. s.close() # 关闭连接

服务器端

  1. #!/user/bin env python
  2. # author:Simple-Sir
  3. # time:2020/7/22 17:35
  4. import socket
  5.  
  6. # 客户端
  7. c = socket.socket() # 定义协议类型、链接对象
  8. c.connect(('10.108.226.140',6969))
  9. while 1:
  10. ip_c,port_c = c.getsockname() # 本地IP
  11. ip_s,port_s = c.getpeername() # 远程IP
  12. info = input('客户端 {0}:{1}:'.format(ip_c,port_c))
  13. if len(info) == 0:
  14. continue
  15. c.send(info.encode('utf-8'))
  16. data1 = c.recv(1024)
  17. print('服务器 {0}:{1}:{2}'.format(ip_s,port_s,data1.decode('utf-8')))
  18. c.close()

客户端

运行结果:

启动“服务器”:

启动客户端1:

客户端1和服务器互发消息:

此时客户端2“呼叫”服务器,服务器还在与客户端1连接中,无法“接通”客户端2,客户端2处于等待状态:

客户端1与服务器断开连接,客户端2接通:

其他连接情况:

初识python:scoket 单用户互发消息的更多相关文章

  1. netty-2.客户端与服务端互发消息

    (原) 第二篇,客户端与服务端互发消息 与第一篇的例子类似,这里服务端需要三个类,客户端也需要三个类. 服务端关键代码如下:MyServer与上一个例子中的TestServer 差多,这里只列举不同的 ...

  2. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解

    MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android. ...

  3. Handler具体解释系列(四)——利用Handler在主线程与子线程之间互发消息

    MainActivity例如以下: package cc.c; import android.app.Activity; import android.os.Bundle; import androi ...

  4. QQ互发消息

    private NewsData data; private void button3_Click(object sender, EventArgs e) //发送 { string x = text ...

  5. udp 内网穿透 互发消息

    还差实现内网终端,向服务器发送请求,要对方的内网连接自己,实现打洞.在同一网段,或者公网运行,可以相互聊天. 没有实现检测客户端下线功能. 1,服务器代码 package router; import ...

  6. 通过GUI制作一个简单的消息对话框互发消息

    public class LTS extends JFrame { private JPanel contentPane; private JTextField textField; private ...

  7. java Socket通信,客户端与服务端相互发消息

    1.通信过程 网络分为应用层,http.ssh.telnet就是属于这一类,建立在传输层的基础上.其实就是定义了各自的编码解码格式,分层如下: 2.Socket连接 上述通信都要先在传输层有建立连接的 ...

  8. 我们使用 Kafka 生产者在发消息的时候我们关注什么(Python 客户端 1.01 broker)

    之前使用 Kafka 的客户端消费者比较多一点,而且也是无脑订阅使用也没有深入了解过具体的参数.总的来说使用不够细节. 这次公司项目活动期间暴露非常多的问题,于是有了这篇文章. 首先我们来拆解一下 K ...

  9. 利用python itchat给女朋友定时发信息

    利用itchat给女朋友定时发信息 涉及到的技术有itchat,redis,mysql,最主要的还是mysql咯,当然咯,这么多东西,我就只介绍我代码需要用到的,其他的,如果需要了解的话,就需要看参考 ...

随机推荐

  1. Dubbo应用到web工程

    一.创建提供者03-provider-web (1) 创建工程 创建Maven的web工程,然后创建实现类. (2) 导入依赖 Spring的版本为4.3.16 需要的依赖有: dubbo2.7.0版 ...

  2. liunx 安装ActiveMQ 及 spring boot 初步整合 activemq

    源码地址:  https://gitee.com/kevin9401/microservice.git 一.安装 ActiveMQ: 1. 下载 ActiveMQ wget  https://arch ...

  3. Mockito 简介

    Mockito 是一种 Java Mock 框架,主要是用来做 Mock 测试,它可以模拟任何 Spring 管理的 Bean.模拟方法的返回值.模拟抛出异常等等,在了解 Mockito 的具体用法之 ...

  4. 【Java 多线程】Java线程池类ThreadPoolExecutor、ScheduledThreadPoolExecutor及Executors工厂类

    Java中的线程池类有两个,分别是:ThreadPoolExecutor和ScheduledThreadPoolExecutor,这两个类都继承自ExecutorService.利用这两个类,可以创建 ...

  5. Linux 文件属性及详细操作

    目录 Linux 文件属性 文件属性信息组成 文件属性概念说明 文件软硬链接说明 硬链接 软链接 补充知识 存储数据相关-inode/block inode: block: 读取文件原理图 Linux ...

  6. [BUUCTF]REVERSE——Youngter-drive

    Youngter-drive 附件 步骤: 例行查壳儿,32位程序,upx壳儿 利用网上找的upx脱壳儿工具脱完壳扔进ida,首先检索程序里的字符串,发现了有关flag的字样,跟进,当source=T ...

  7. 联盛德 HLK-W806 (九): 软件SPI和硬件SPI驱动ST7789V液晶LCD

    目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...

  8. 调配资源(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 当资源过度分配了,肿么办? 比如前面的例子,某吃货甲,一天之内给他分配了9.6个工时的吃量,这怎么可以呢,让人加班是不厚道 ...

  9. 1、学习算法和刷题的框架思维——Go版

    前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...

  10. java 数据类型:枚举类enum、对比方法compreTo()、获取名字.name()、获取对应值的枚举类Enum.valueOf()、包含构造方法和抽象方法的enum;实现接口;

    问题引入 为了将某一数据类型的值限定在可选的合理范围内,比如季节只有四个:春夏秋冬. 什么是枚举类 Java5之后新增了enum关键字(他与class,interface关键字地位相同)用来定义枚举类 ...