2015-11-25 192 views
0

我想連接電腦中不在我的局域網中。我想連接真正的IP。Python套接字連接

我的服務器代碼

import json 
import os 
import select 
import socket 
import sys 
import urllib 
import urllib.request 
from optparse import OptionParser 

ip = json.loads(urllib.request.urlopen('http://httpbin.org/ip').read().decode("utf-8"))['origin'] 
print(ip) 


def isAlive(ip): 
    ret = os.system("ping -o -c 3 -W 3000 " + ip) 
    if ret != 0: 
     return True 
    return False 


HOST = socket.gethostname() 

SOCKET_LIST = [] 
RECV_BUFFER = 1024 
PORT = 1993 

def chat_server(): 
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    server_socket.bind((HOST, PORT)) 
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    server_socket.listen(10) 

    # add server socket object to the list of readable connections 
    SOCKET_LIST.append(server_socket) 

    print("Chat server started on port " + str(PORT), "on Host " + str(HOST)) 
    print(SOCKET_LIST) 
    while True: 
     ready_to_read, ready_to_write, in_error = select.select(SOCKET_LIST, [], [], 0) 

     for sock in ready_to_read: 
      if sock == server_socket: 
       sockfd, addr = server_socket.accept() 
       SOCKET_LIST.append(sockfd) 
       print("Client (%s, %s) connected" % addr) 
       broadcast(server_socket, sockfd, "[%s:%s] entered our chatting room\n" % addr) 
      else: 
       try: 
        data = sock.recv(RECV_BUFFER) 
        recvString = data.decode("utf-8") 
        print(recvString) 
        if data: 
         broadcast(server_socket, sock, "\r" + '[' + str(sock.getpeername()) + '] ' + data) 
        else: 
         if sock in SOCKET_LIST: 
          SOCKET_LIST.remove(sock) 
         broadcast(server_socket, sock, "Client (%s, %s) is offline\n" % addr) 
       except: 
        broadcast(server_socket, sock, "Client (%s, %s) is offline\n" % addr) 
        continue 

    server_socket.close() 


def broadcast(server_socket, sock, message): 
    for socket in SOCKET_LIST: 
     if socket != server_socket and socket != sock: 
      try: 
       socket.send(message) 
      except: 
       socket.close() 
       if socket in SOCKET_LIST: 
        SOCKET_LIST.remove(socket) 





if __name__ == "__main__": 
    sys.exit(chat_server()) 

連接代碼

import socket 

print(socket.getaddrinfo("localhost", 80, 0, 0, socket.SOL_TCP)) 
try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    print("Socket successfully created") 
    print(socket.gethostbyname(socket.gethostname())) 
except socket.error as err: 
    print("socket creation failed with error %s" % (err)) 

port = 1993 
host_ip = '193.140.109.2' 
s.connect((host_ip, port)) 

while True: 
    getGet = input("Send Data: ") 
    s.sendall(bytearray(getGet, 'utf8')) 

    if getGet == '-': 
     s.close() 

我寫了這個代碼,但我無法連接我的電腦。我有一些疑問。 1-插座僅用於LAN連接嗎? 2-如何連接不同的電腦?

+2

我認爲你對於套接字是什麼以及它們是如何使用有一個基本的誤解。也許你應該[進一步閱讀套接字](https://en.wikipedia.org/wiki/Network_socket)和[Python網絡教程](http://www.tutorialspoint.com/python/python_networking.htm)第一。 – skrrgwasme

+0

謝謝你的評論,但我已經看到這個鏈接。而這個鏈接並沒有告訴我如何連接非本地電腦 –

+0

這是我的觀點。您正在尋找關於如何做X的教程,但是您錯過了解釋難以實現的基本概念。服務器必須實際監聽您爲套接字連接提供的端口。你當然可以通過互聯網使用套接字,但HTTPS可能更合適。你是否控制你要連接的服務器?你確定它正在監聽套接字連接嗎?當你運行這個腳本時發生了什麼?如果您有異常,請將完整的回溯添加到您的問題中。 – skrrgwasme

回答

0
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM, 0) 
port = 1993 
host_ip = 'fe80::d862:a887:2f4c:53d0%12' 

解決了我的問題。