【问题标题】:PHP/Python socket remote connection problemsPHP/Python 套接字远程连接问题
【发布时间】:2018-02-09 00:33:40
【问题描述】:

我有这个 python 代码:

from socket import *
import threading
import thread
import time
import json

def handler(clientsock,addr):
    while 1:
        time.sleep(2)
        data = clientsock.recv(65535);
        if not data:
            break
        object = json.loads(data)
        object['status'] = 1
        object['timestamp'] = time.time()
        output = json.dumps(object)        
        msg = output
        clientsock.send(msg)
    clientsock.close()

if __name__ == '__main__':
    HOST = '192.168.0.28'
    PORT = 5555
    BUFSIZ = 65535
    ADDR = (HOST, PORT)

    serversock = socket(AF_INET, SOCK_STREAM)
    serversock.bind(ADDR)
    serversock.listen(5)

    while 1:
        print 'waiting for connection...'
        clientsock, addr = serversock.accept()
        print '...connected from: ', addr
        thread.start_new_thread(handler, (clientsock, addr))

还有这个 PHP 代码:

<?php 
/**
 *
 * PHP JSON Echo Server client
 *
*/
// python server socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '192.168.0.28', 5555);
//Create a message, and send it to the server on $socket.
$data = array(
    'username' => 'sysadmin',
    'key' => '093ufj408xr0289u3r0x9u2m309x',
    'action' => 'login',
);
$json = json_encode($data);
socket_send($socket, $json, strlen($json), MSG_EOF);
$data = socket_read($socket, 65535);
$object = json_decode($data);
if($object->status) {
    echo '<p>Data received successfully.';
} else {
    echo '<p>Error. Data not read correctly!';
}
echo '<p>'.$data;
//Close the socket.
socket_close($socket);
?>

如果我在本地网络中运行它,它可以正常工作。但是当我在外部主机上执行 PHP 脚本时,它不再起作用了。我已将 IP 地址更改为我的 WAN IP 地址,甚至更改为 ISP 提供的 DNS。没有任何效果。

这是输出:

Warning: socket_connect(): unable to connect [111]: Connection refused in /home/usr/public_html/webclient.php on line 9

Warning: socket_send(): unable to write to socket [32]: Broken pipe in /home/usr/public_html/webclient.php on line 17

Warning: socket_read(): unable to read from socket [107]: Transport endpoint is not connected in /home/usr/public_html/webclient.php on line 18
Error. Data not read correctly!

我尝试使用此服务扫描开放端口:http://www.ipfingerprints.com/portscan.php 并且端口 5555 已打开。我还收到了来自服务器的消息:

waiting for connection...
...connected from:  ('5.79.68.210', 36080)

问题出在哪里?

【问题讨论】:

    标签: php python sockets


    【解决方案1】:

    关于此代码:

    print '...connected from: ', addr
    

    你不能使用这个代码,要知道你需要使用这个代码的开放端口:

    print '...connect from: ' + addr[0] + ':' + str(addr[1])
    

    只有这样

    而且你不能直接使用套接字:

    serversock = socket(AF_INET, SOCK_STREAM)
    

    使用它会更好:

    serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    

    【讨论】:

    • 但这不是解决方案。如果5555端口打开,为什么它没有连接到我的python服务器?
    • 你的套接字代码不正确:serversock = socket(AF_INET, SOCK_STREAM)
    • 使用此代码 serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    • AttributeError: type object '_socketobject' 没有属性 'socket'
    • 不要使用 from socket import * 直接使用 import socket
    猜你喜欢
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多