您的位置:首页 > 编程语言 > Python开发

Python socket 编程

2020-07-21 04:12 1051 查看

1、 服务器端

# -*- coding: UTF-8 -*-
import socket

serverSocket = socket.socket() #创建socket对象
'''
绑定  IP 和端口号
socket.gethostname() 为获取本机名,这里也可以直接写 IP 地址,因为测试在本人机器上,所以直接获取主机名
同样你应该也是测试在你的机器上,也可以用这种方法,也可以直接写你的 IP 地址
以后用在服务器上,直接写服务器 IP 地址,当然一般用配置文件读取(以我 20ml 水的经验来看,我的经验还没有半桶水)
注意客户端连接时,IP和端口号必须和这里一样,毕竟你要访问的服务器是这个
'''
serverSocket.bind((socket.gethostname(), 12345))
serverSocket.listen(5)  #开始监听有没有客户端连接
print '服务端开始监听'

while True:
conn, clientAdress = serverSocket.accept() #有客户端访问了,返回的是连接对象和客户端地址
print '这是连接的对象:', conn
print '这是客户端的地址:', clientAdress
dataFormClient = conn.recv(1024) #从客户端接收数据,如果客户端不发送数据,也可以不写这行代码
print '这是从客户端接收到的数据:', dataFormClient
conn.send('这是服务端给客户端发送的数据') #发送数据给客户端
print '服务端给客户端发送信息成功'
conn.close() #关闭连接
print '服务端停止监听'
 

  没有客户端连接时的运行结果 

服务端开始监听

  有客户端连接时的运行结果(当然你得先写客户端,直接看客户端代码吧)

服务端开始监听
这是连接的对象: <socket._socketobject object at 0x00000000031A4A70>
这是客户端的地址: ('10.190.20.65', 59788)
这是从客户端接收到的数据: 这是客户端发给服务端的数据
服务端给客户端发送信息成功

2、 客户端

# -*- coding: UTF-8 -*-
import socket

clientSocket = socket.socket() #创建socket对象
clientSocket.connect((socket.gethostname(), 12345)) #连接服务端,IP 和端口号需要和服务端相同
print '客户端正在运行'.decode('UTF-8') #用 UTF-8 编码这句话,因为我在cmd 运行,不编码输出为乱码
clientSocket.sendall('这是客户端发给服务端的数据') #发送数据给服务端
dataFromServer = clientSocket.recv(1024) #接收服务端发来的数据
print '从服务器接收的消息为:'.decode('UTF-8'), dataFromServer.decode('UTF-8') #原因同上
clientSocket.close() #关闭连接

  运行结果

客户端正在运行
从服务器接收的消息为: 这是服务端给客户端发送的数据

  温馨提示 : 1、 一般模拟服务端和客户端,我采用的方法是用 eclipse 运行服务端(你也可以用你的编译工具运行),再用 cmd 运行客户端,这样很形象就能看出来服务端和客户端的输出了。如果没有编译工具,那就用两个 cmd 运行嘛,但是得注意编码哟,如果代码中没有中文,那一切 OK ,如果用中文,那用我的那种办法 .decode('UTF-8') 就行了

        2、 服务端和客户端的 IP 和端口号 需要一致,否则客户端连接不到服务端,服务端接收不到客户端的连接

        3、服务器代码中有接收数据代码,那客户端就得有发送数据代码,否则服务端会一直等待接收数据(我第一次就这样,尴尬了)

        4、 因为bind()那一行导致运行错误出现错误,可以参考下面的常见错误,也提供了解决办法

常见错误 1:

socket.error: [Errno 10048] ͨ��ÿ���׽��ֵ�ַ(Э��/�����ַ/�˿�)

  本人理解错误原因为 : 服务器未正常关闭,再次重启(重新运行 .py 文件)时触发该异常,也就是没关闭服务器,再次运行该文件,导致 bind() 再次绑定IP 和端口号时触发异常

  本人解决办法 : 先关闭服务器后再运行。个人总结有两类情况

            1、 如果用的是编译工具,如 eclipse, 它有关闭按钮,看截图,点击一下,再次运行应该就可以了,如果还是启动不了,还是报错,那就关闭编译工具,然后再打开试一试,如果还不行,直接用 cmd 运行试一试,还不行,那我也不知道了,或许是你写错了代码,或许是别的原因,以我现在的水平解决不了。

            2、 如果直接用 cmd 运行,提示信息是这样子的,截图如下

          

          解决办法 : 总有一个地方已经打开了该服务,进行了 bind() 操作,所以你需要找到,然后停止它,可以尝试关闭 cmd 再次打开。总之原理就是服务已经在别的地方打开但没关闭,因此你得找到它关闭它,再重试。

 常见错误2 :

      错误提示 : 

TypeError: bind() takes exactly one argument (2 given)

      错误原因 : bind()只需要一个参数,给了两个

      解决办法 : bind((ipNumer, portNumber))  注意是两个括号,估计你少了一个

转载于:https://www.cnblogs.com/rainbow-tan/p/11358097.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: