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
     
     
     
     
     
  • 相关阅读:
    BZOJ 3205 [Apio2013]机器人 ——斯坦纳树
    BZOJ 3782 上学路线 ——动态规划 Lucas定理 中国剩余定理
    HDU 1423 Greatest Common Increasing Subsequence ——动态规划
    BZOJ 3309 DZY Loves Math ——莫比乌斯反演
    POJ 1038 Bugs Integrated, Inc. ——状压DP
    POJ 3693 Maximum repetition substring ——后缀数组
    POJ 2699 The Maximum Number of Strong Kings ——网络流
    POJ 2396 Budget ——有上下界的网络流
    BZOJ 4650 [Noi2016]优秀的拆分 ——后缀数组
    源码安装python
  • 原文地址:https://www.cnblogs.com/liam-sliversucks/p/13234431.html
Copyright © 2011-2022 走看看