实现功能:

  启动“服务器”、通过“客户端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、关闭连接

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

具体代码:

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

服务器端

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

客户端

运行结果:

启动“服务器”:

启动客户端1:

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

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

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

其他连接情况:

最新文章

  1. [Asp.net 5] Caching-缓存架构与源码分析
  2. spring boot servlet 注入
  3. Mysql触发器示例
  4. sqlserver字段类型
  5. HTML5的文档结构和新增标签
  6. call与apply基础用法告诉你
  7. 20145320《Java程序设计》第9周学习总结
  8. 获取手机通讯录--ios
  9. 运行Maven是报错:No goals have been specified for this build
  10. C#:WiFi
  11. 理解css 中的position五个属性
  12. Android学习总结——Activity状态保存和恢复
  13. C/C++的mem函数和strcpy函数的区别和应用
  14. 怎么在Vue的某个组件中根据组件tag标签名获取到对应的VueComponent实例呢
  15. MongoDB的数据库导出和导入以及备份
  16. 6.2 集合和映射--集合Set->底层基于链表实现
  17. intent和手势探测
  18. 【mysql】Mgr实现数据库高可用架构
  19. zabbix监控Windows-server
  20. js正则表达式只能是数字、字母或下划线

热门文章

  1. 使用 IntelliJ IDEA 远程调试 Tomcat
  2. postman 中get传参数
  3. [特征工程] GBDT
  4. 03 - Vue3 UI Framework - 首页
  5. 1、Redis简介
  6. Java中方法和类的深入分析
  7. pipeline groovy
  8. CPU进程优先级
  9. CPU状态信息us,sy等含义
  10. 任务关联的类型(Project)