码迷,mamicode.com
首页 > 编程语言 > 详细

python socket模块

时间:2018-07-20 16:41:22      阅读:267      评论:0      收藏:0      [点我收藏+]

标签:ip地址   wait   pytho   bind   基本   上下文   most   shutdown   send   

1、socket定义:为上层软件提供TCP/IP通讯的软件模块

socket模块工作流程,服务器端启动socket,accept,即自身创建一个连接实例维护连接状态,获取一个客户端连接实例,等待连接。客户端调用socket,进行连接connect即创建一个连接实例。

2、在本地模拟客户端连接过程,见下例。

首先遇到常见错误

import socket
serversock = socket.socket()
 
#serversock.bind((‘192.168.148.212‘,9999,))#注意这里的端口需要int
serversock.bind((127.0.0.0,9999,))
serversock.listen(3)#启动监听排队
coninstance,ipadd = serversock.accept()
print (ipadd,o---o,coninstance)
 
 
>>> 
 RESTART: C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/sersock.py 
Traceback (most recent call last):
  File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35-32/sersock.py", line 7, in <module>
    serversock.bind((127.0.0.0,9999,))
OSError: [WinError 10049] 在其上下文中,该请求的地址无效。

-*-* OSError: [WinError 10049] 在其上下文中,该请求的地址无效。

实际是由于IP地址写的不正确导致,那么如何查看IP和开放的端口呢?
a)ipconfig /all 查看本机IP地址

b) netstat -an 查看开放的IP端口

若果使用127.0.0.1 端口 5037 可能看到这样的错误

-*-* OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

这可能是由于这个端口已经被占用导致,更换一个不常用的port,9999,不再提示此类错误。

 -*-* ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

    当使用ftp测试时,关闭ftp使用命令quit。因为一旦开启ftp 使用任务管理器或是直接关闭cmd,都是不生效的。

 a)检查window 的server是否开启。未开启将其开启。右键我的电脑 - 管理 - 服务 - server

 b) 检查window的telnet服务是否开启(socket模块 基于tcp协议),未开启将其开启,控制面板-程序-打开或关闭window功能-telnet客户端和服务端

问题根因不明确 规避办法 使用python27 问题软件 python 3.5.1

python的2.7解释器可能也有问题只能正常执行一次client,当第二次执行时会报10061。[WinError 10061] 由于目标计算机积极拒绝,无法连接。

     想看出客户端和服务端连接的效果可以分别在两个CMD命令窗口中执行server代码和client代码。

server代码

import socket
server = socket.socket()
 
server.bind((127.0.0.1,9000))
server.listen(5)
print (wait ...)
while True:   
    conn,address= server.accept()
    print (address,o---o,conn)

client 代码

import socket
import time
cli = socket.socket()
 
print (cli)
 
cli.connect((127.0.0.1,9000))
print (2)
time.sleep(1)
#cli.close()

3、模拟网络聊天时报错,排查:1 对循环进行排查,正常 2 将sendall()中字符串加str()处理,仍然显示错误。

注意:recv和服务端的accept都是等待输入,即如果对端无输入,将一直等待。而且当recv处于循环中时,break循环,recv为收到输入,循环终止,则recv会报错。

         socket.error: [Errno 10053]

基本确定是在server端,server.recv(1024)处错误

-*-*[Errno 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数 

server端

import socket
import sys
import time
server = socket.socket()
 
server.bind((127.0.0.1,9000))
server.listen(5)
print (wait ...)
while True:   
    conint,address= server.accept()
    conint.sendall(hello,welcome)
    print (address,o---o,conint)
    while True:
        #serrecv = server.recv(1024)
        ‘‘‘if serrecv == ‘remote shutdown‘:
            sys.exit(0)
        else:            
            server.sendall(serrecv+‘good‘)‘‘‘
        time.sleep(2)
        server.sendall(str(server.recv(1024)+good))

client端

import socket
import time
cli = socket.socket()
 
print (cli)
 
cli.connect((127.0.0.1,9000))
print (2)
sercon = cli.recv(1024)
print sercon
while True:
    time.sleep(1)
    inp = raw_input(pleaes input:)
    if inp != quit:
         
        cli.sendall(str(inp))
        print cli.recv(1024)
    else:
        break
cli.close()

错误原因:server.sendall(str(server.recv(1024)+‘good‘))

这里应该使用server.accept()建立的与客户端连接实例  作为对象,即conint,进行conint.recv()。

python socket模块

标签:ip地址   wait   pytho   bind   基本   上下文   most   shutdown   send   

原文地址:https://www.cnblogs.com/zxmbky/p/9341938.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!