zoukankan      html  css  js  c++  java
  • 基于Python的Socket服务器和客户端通信(Pycharm)

    先说一下为什么要发这个随笔:

    最近在玩python,通过学习socket,就想试试服务器和客户端的通信。^_^

    ip和端口这俩有点东西,一顿乱整摸出点门路,也算是为我下学期的计算机网络打下了铺垫了^_^

    情景1:

    写了客户端和服务器的代码,先运行的客户端,一直在提示如下图

    相信都知道为什么了,服务器还没有先执行,都没有listen,所以出现了这种情况

    解决办法:先运行服务器的代码,再跑客户端

    情景2:

    这种情况是运行了两次服务器代码(眼神不好就不要乱运行!!)

    不要默认点运行的第一个按钮,要不总是运行的都是上一次的代码。以后一定注意。

    情景3:

    说说ip地址,通常客户端连接的是自己机器上的ipv4地址,服务器输入(0.0.0.0)就好了。

    Windows下查看在cmd中输入ipconfig

    Mac和Linux在终端中输入:ifconfig

    最后放两张运行成功的图片

    客户端:

    import socket
    client = socket.socket()
    client.connect(('10.211.55.31',8000))
    client.send("bobby".encode("utf8"))
    client.close
    服务器:

    import socket
    server= socket.socket()
    server.bind(('10.211.55.31',8000))
    server.listen()
    sock, addr = server.accept()
    data = ""
    while True:
        temp_data = sock.recv(1024)
        print(temp_data)
        if temp_data:
            data += temp_data.decode("utf8")
            if temp_data.decode("utf8").endswith("#"):
                break;
        else:
            break;
    print(data)
    sock.close

    后来改进的代码:

    客户端:

     1 import socket
     2 client = socket.socket()
     3 client.connect(('10.211.55.31',8000))
     4 
     5 while True:
     6     input_data = input()
     7     client.send(input_data.encode("utf8"))
     8     server_data = client.recv(1024)
     9     print("服务器响应:{}".format(server_data.decode("utf8")))
    10     server_data2 = client.recv(1024)
    11     print("服务器响应:{}".format(server_data2.decode("utf8")))
    12 client.close

    服务器:

     1 import socket
     2 import threading
     3 
     4 server= socket.socket()
     5 server.bind(('10.211.55.31',8000))
     6 server.listen()
     7 
     8 def hand1e_sock(sock,addr):
     9     temp_data = sock.recv(1024)
    10     print(temp_data.decode("utf8"))
    11     input_data = input()
    12     sock.send(input_data.encode("utf8"))
    13 #获取客户端的连接并启动线程去处理
    14 while True:
    15     #阻塞等待链接
    16     sock, addr = server.accept()
    17     #每当进来一个用户就启动一个线程去跟用户连接
    18     client_thread = threading.Thread(target=hand1e_sock,args=(sock,addr))
    19     client_thread .start()
    20     #注意:传递的是方法的名称而不是方法的调用
    21 data = ""
    22 while True:
    23     sock.send("welcome to server".encode("utf8"))
    24     temp_data = sock.recv(1024)
    25     print(temp_data.decode("utf8"))
    26     input_data = input()
    27     sock.send(input_data.encode("utf8"))
    28     #recv方法是阻塞的
    29     if temp_data:
    30         data += temp_data.decode("utf8")
    31         if temp_data.decode("utf8").endswith("#"):
    32             break;
    33     else:
    34         break;
    35 print(data)
    36 sock.close
     
     
     
     
     
  • 相关阅读:
    SpringCloud整合过程中jar依赖踩坑经验
    spring-boot-starter-parent的主要作用
    配置Setting.xml文件提高maven更新下载jar包速度
    剑指Offer-编程详解-二维数组中的查找
    Git 拉取Gitee仓库报错:“fatal: unable to access ''": Failed to connect to 127.0.0.1 port 1080: Connection refused”
    SpringBoot整合mybatis——配置mybatis驼峰命名规则自动转换
    SpringBoot 整合 Mybatis + Mysql——XML配置方式
    ES+open-falcon之nginx状态码监控报警自动化
    zabbix告警邮件美化
    基于Jenkins+Gitlab的自动化部署实战
  • 原文地址:https://www.cnblogs.com/liam-sliversucks/p/13234431.html
Copyright © 2011-2022 走看看