2015-10-20 65 views
0

我遇到了一个问题,我已经为此挣扎了3天。我需要根据不同本地网络之间的套接字连接创建服务器。在Java中创建服务器以进行全局访问

我发现了很多的例子是这样的:

import java.net.ServerSocket; 
import java.net.Socket; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.InputStreamReader; 
import java.io.BufferedReader; 

/** 
* Created by yar 09.09.2009 
*/ 
public class HttpServer { 

    public static void main(String[] args) throws Throwable { 
     ServerSocket ss = new ServerSocket(9999); 
     while (true) { 
      Socket s = ss.accept(); 
      System.err.println("Client accepted"); 
      new Thread(new SocketProcessor(s)).start(); 
     } 
    } 

    private static class SocketProcessor implements Runnable { 

     private Socket s; 
     private InputStream is; 
     private OutputStream os; 

     private SocketProcessor(Socket s) throws Throwable { 
      this.s = s; 
      this.is = s.getInputStream(); 
      this.os = s.getOutputStream(); 
     } 

     public void run() { 
      try { 
       readInputHeaders(); 
       writeResponse("<html><body><h1>Hello from Habrahabr</h1></body></html>"); 
      } catch (Throwable t) { 
       /*do nothing*/ 
      } finally { 
       try { 
        s.close(); 
       } catch (Throwable t) { 
        /*do nothing*/ 
       } 
      } 
      System.err.println("Client processing finished"); 
     } 

     private void writeResponse(String s) throws Throwable { 
      String response = "HTTP/1.1 200 OK\r\n" + 
        "Server: YarServer/2009-09-09\r\n" + 
        "Content-Type: text/html\r\n" + 
        "Content-Length: " + s.length() + "\r\n" + 
        "Connection: close\r\n\r\n"; 
      String result = response + s; 
      os.write(result.getBytes()); 
      os.flush(); 
     } 

     private void readInputHeaders() throws Throwable { 
      BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
      while(true) { 
       String s = br.readLine(); 
       if(s == null || s.trim().length() == 0) { 
        break; 
       } 
      } 
     } 
    } 
} 

但问题是: 我可以访问这个IP:只能从同一本地网络端口。如果我尝试从同一网络(从Android智能手机连接到具有相同网络IP的本地计算机)连接?所以在这种情况下,所有成功,但如果我试图运行相同的服务器示例代码,例如AWS(亚马逊网络服务器) 它不起作用:(

- >无法获得I/O代表连接到172.31.23.98(JAVA)

- > org.apache.http.conn.ConnectTimeoutException:连接到172.31.23.98:9999超时(常规)

我” m使用此服务器的示例代码:

public static void main(String[] args) throws IOException { 
     int portNumber = 9998; 
     BufferedOutputStream bos = null; 

     while (true) { 

      try (ServerSocket serverSocket = new ServerSocket(portNumber); 
       Socket clientSocket = serverSocket.accept(); 
       PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
       InputStream in = clientSocket.getInputStream(); 
       BufferedReader inWrapper = new BufferedReader(new InputStreamReader(in))) { 
       FileOutputStream fos = new FileOutputStream(new File("D:/BufferedAudio.wav")); 
       bos = new BufferedOutputStream(fos); 
       System.out.println("Connected with client"); 


       String inputLine, outputLine; 
       int bytesRead; 
       byte[] buffer = new byte[1024 * 1024]; 

       while ((bytesRead = in.read(buffer)) > 0) { 
        bos.write(buffer, 0, bytesRead); 
        System.out.println(new String(buffer, Charset.defaultCharset())); 
        bos.flush(); 
        out.println("Hello!!! I'm server"); 
       } 
       bos.close(); 

      } catch (IOException e) { 

       System.out.println("Exception caught when trying to listen on port " 
         + portNumber + " or listening for a connection"); 
       System.out.println(e.getMessage()); 
       throw e; 

      } 

      System.out.println("Upps, the loop was unexpectedly out"); 

     } 
    } 

这里的客户端代码:

public static void main(String[] args) throws IOException { 


     String IP = "172.31.23.98"; 
     int port = 9998; 

     try (
       Socket connectionSocket = new Socket(IP, port); 
       PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 
       BufferedReader in = new BufferedReader(
         new InputStreamReader(connectionSocket.getInputStream())) 
     ) { 
      BufferedReader stdIn = 
        new BufferedReader(new InputStreamReader(System.in)); 
      String fromServer; 
      String fromUser; 

      while ((fromServer = in.readLine()) != null) { 
       System.out.println("Server: " + fromServer); 

       fromUser = stdIn.readLine(); 
       if (fromUser != null) { 
        System.out.println("Client: " + fromUser); 
        out.println(fromUser); 
       } 
      } 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host " + IP); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for the connection to " + 
        IP); 
      System.exit(1); 
     } 
    } 

这些都是从网上的样品。

Amm如何修改此代码以便从不同网络的客户端访问服务器?

+1

这可能是一个防火墙问题。您的本地防火墙/路由器/ NAT可以阻止您在端口9998上打开连接到互联网,或者亚马逊AWS阻止端口9998上的传入连接。 – schneida

+0

我已经关闭了防火墙并且有相同的问题。 –

回答

1

IP范围172.16.0.0至172.31.255.255 is a private address space for use in local area networks。来自该范围的IP只在同一个专用LAN中有效。

当您在位于局域网之外的Internet上的主机上部署服务器软件时,需要将其替换为该主机的IP地址。我从来没有使用过AWS,但是当我想知道我租用的服务器的公共IP地址时,我会首先寻找的是基于Web的控制面板。当你有外壳访问服务器的时候,你也可以在Windows上找到ipconfig,在Unix上找到ifconfig

相关问题