zoukankan      html  css  js  c++  java
  • Python--网络编程-----socket编程示例--打电话--加上通讯循环与bug修复

    一、服务端

     1 import socket
     2 
     3 
     4 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     5 phone.bind(('127.0.0.1', 8080))  # 0-65535:0-1024给操作系统使用
     6 phone.listen(5)
     7 
     8 print('starting.....')
     9 conn, client_addr = phone.accept()
    10 print(client_addr)
    11 
    12 while True:  # 通信循环
    13     data = conn.recv(1024)
    14     print('客户端的数据', data)
    15 
    16     conn.send(data.upper())
    17 
    18 conn.close()
    19 phone.close()

    二、客户端

     1 import socket
     2 
     3 
     4 # 1、买手机
     5 phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     6 # print(phone)
     7 
     8 # 2、拨号
     9 phone.connect(('127.0.0.1', 8080))
    10 
    11 # 3、发、收消息
    12 while True:
    13     msg = input('>>:').strip()
    14     phone.send(msg.encode('utf-8'))
    15     data = phone.recv(1024)
    16     print(data)
    17 
    18 # 4、关闭
    19 phone.close()

    客户端结果为:

    1 >>:he
    2 b'HE'
    3 >>:asdf
    4 b'ASDF'
    5 >>:

    服务端结果为:

    1 starting.....
    2 ('127.0.0.1', 64037)
    3 客户端的数据 b'he'
    4 客户端的数据 b'asdf'

    三、有时间运行服务端程序的时候,显示端口占用错误,这时候可以使用如下代码防止出现这种情况

    1 phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    四、当客户端输入为空时(也就是直接回车),按回车后,客户端一直横在那,

    原因分析:

    客户端发送空信息需要调用操作系统接口,把客户端程序内存中要发送的信息拷贝到操作系统内存中,如果为空的话,操作系统内存收不到数据,它也就不会发送给服务端,所以出现客户端横在那的现象

    解决方法:

    修改客户端代码:

    1 while True:
    2     msg = input('>>:').strip()
    3     if not msg:
    4         continue
    5     phone.send(msg.encode('utf-8'))
    6     data = phone.recv(1024)
    7     print(data)

    五、如果客户端意外断开连接发生中断,linux系统中,服务端会发生死循环,Windows系统中,服务端会直接报错

    解决方法:

    修改服务端代码:

     1 while True:  # 通信循环
     2     try:
     3         data = conn.recv(1024)
     4         if not data:  # 适用于linux操作系统
     5             break
     6         print('客户端的数据', data)
     7     
     8         conn.send(data.upper())
     9     except ConnectionResetError:  # 适用于windows操作系统
    10         break
  • 相关阅读:
    OEA框架学习:缓存
    2012年 博文整理
    技术支持经验总结
    OEA框架学习:元数据设计
    安装后新建Android出现“AndroidManifest.xml 系统找不到指定的文件”解决方案
    Android控件学习笔记之 GridView(实现九宫格)
    获取url地址中主机的域名
    C# 语音读取字符串
    JSON省市联动
    MOTO Droid手机自定义本地铃声设置方法
  • 原文地址:https://www.cnblogs.com/xudachen/p/8723982.html
Copyright © 2011-2022 走看看