基本Python客户端套接字示例

duk*_*bur 61 python sockets networking

我一直试图围绕套接字如何工作,我一直试图挑选一些我在这个页面找到的示例代码,用于一个非常简单的客户端套接字程序.由于这是基本的示例代码,我认为它没有错误,但是当我尝试编译它时,我收到以下错误消息.

文件"client.py",第4行,在client_socket.connect中(('localhost',5000))文件"",第1行,在连接socket.error中:[Errno 111]连接被拒绝

我已经搜索了这个错误的每个部分,并且有类似问题的人似乎已经通过更改端口号,使用'connect'而不是'bind'和其他一些东西得到了帮助,但没有一个他们适用于我的情况.非常感谢任何帮助,因为我对网络编程非常新,而且对python来说还是新手.

顺便说一句,这是代码,以防链接因任何原因无效.

#client example
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 5000))
while 1:
    data = client_socket.recv(512)
    if ( data == 'q' or data == 'Q'):
        client_socket.close()
        break;
    else:
        print "RECIEVED:" , data
        data = raw_input ( "SEND( TYPE q or Q to Quit):" )
        if (data <> 'Q' and data <> 'q'):
            client_socket.send(data)
        else:
            client_socket.send(data)
            client_socket.close()
            break;
Run Code Online (Sandbox Code Playgroud)

Dav*_*vid 125

这是最简单的python套接字示例.

服务器端:

import socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind(('localhost', 8089))
serversocket.listen(5) # become a server socket, maximum 5 connections

while True:
    connection, address = serversocket.accept()
    buf = connection.recv(64)
    if len(buf) > 0:
        print buf
        break
Run Code Online (Sandbox Code Playgroud)

客户端:

import socket

clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientsocket.connect(('localhost', 8089))
clientsocket.send('hello')
Run Code Online (Sandbox Code Playgroud)
  • 首先运行SocketServer.py,并确保服务器已准备好侦听/接收某事
  • 然后客户端将信息发送到服务器;
  • 服务器收到后,它终止

  • 使用python3的小问题.在客户端,由于2.x和3.x之间的字符串不同,您需要将发送更改为`clientsocket.send(bytes('hello','UTF-8'))`(或其他编码).(见[这里](http://stackoverflow.com/a/5471351/4009370)) (7认同)
  • 这个`socket`不应该被关闭,而不是仅仅使用`break`吗? (3认同)

小智 24

这是一个非常简单的套接字程序.这和套接字一样简单.

用于客户端程序(CPU 1)

import socket

s = socket.socket()
host = '111.111.0.11' # needs to be in quote
port = 1247
s.connect((host, port))
print s.recv(1024)
inpt = raw_input('type anything and click enter... ')
s.send(inpt)
print "the message has been sent"
Run Code Online (Sandbox Code Playgroud)

您必须将第4行中的111.111.0.11替换为第二个计算机网络设置中的IP号.

对于服务器程序(CPU 2)

import socket

s = socket.socket()
host = socket.gethostname()
port = 1247
s.bind((host,port))
s.listen(5)
while True:
    c, addr = s.accept()
    print("Connection accepted from " + repr(addr[1]))

    c.send("Server approved connection\n")
    print repr(addr[1]) + ": " + c.recv(1026)
    c.close()
Run Code Online (Sandbox Code Playgroud)

运行服务器程序,然后运行客户端程序.

  • 我已编辑您的答案以更正端口号.下次您可以使用问题左下角的**编辑**链接自行完成此操作. (2认同)

ick*_*fay 20

它试图连接到它在端口5000上运行的计算机,但连接被拒绝.您确定要运行服务器吗?

如果没有,您可以netcat用于测试:

nc -l -k -p 5000
Run Code Online (Sandbox Code Playgroud)

某些实现可能要求您省略该-p标志.

  • 成功了!谢谢。我对网络编程很陌生。我没有意识到服务器必须监听客户端才能运行。现在看来这是理所当然的,但出于某种原因,我假设客户端可以自行运行。非常感谢! (2认同)