基于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
 
 
 
 
 
原文地址:https://www.cnblogs.com/liam-sliversucks/p/13234431.html