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

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

情景1:

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

出现这种情况具体是因为,服务器还没有先执行,都没有listen(监听端口),所以出现了这种情况。

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

情景2:

这种情况是运行了两次服务器代码,多次占用一个端口号,而Python只有一个端口号(眼神不好就不要乱运行!!)

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

情景3:

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

Windows下查看在cmd中输入ipconfig

Mac和Linux在终端中输入:ifconfig

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

最后:

上代码:

客户端:

1
2
3
4
5
import socket
client = socket.socket()
client.connect(('10.211.55.31',8000))
client.send("bobby".encode("utf8"))
client.close

服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
客户端:

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
2
3
4
5
6
7
8
9
10
11
12
13
14
 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 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

复制代码

总结与反思:

1,本机的ip环路地址通常可以设成127.0.0.1 或者是 0.0.0.0 或者是localhost,如果装有虚拟机的话,虚拟机会再创建一个ip地址。根据实际情况来看,0.0.0.0不是很常用,并且在cmd中ping的话也是不能用的,貌似只有在Python中才能起作用,具体情况还需要具体分析。

2,启动pycharm,假如有import scrapy,类似的包导入错误原因有如下两点。

1,没有安装scrapy,解决:在cmd中输入pip install scrapy

2,Python的虚拟运行环境没有更换。或者虚拟环境配置错误。 解决:点击pycharm – file – settings – 输入interpreter,更换虚拟环境。

z