2015-02-10 110 views
0

我想进入Java网络一段时间了,基于Java网络教程,我创建了自己的服务器和客户端。代码:简单的Java服务器不工作

package com.gmail.dudewithtude42.projectfilos; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.net.UnknownHostException; 
import java.util.Scanner; 

public class ProjectFilos { 
    public static void main(String[] args) { 
     System.out.println("Main Menu\n1. Host Game\n2. Join Game"); 
     Scanner localScanner=new Scanner(System.in); 
     int port; 
     inputLoop:while (true){ 
      String choice=localScanner.nextLine(); 
      switch (choice){ 
      case "1": 
       System.out.println("What port do you want to use?"); 
       port=localScanner.nextInt(); 
       try{ 
        System.out.println("Generating socket..."); 
        ServerSocket serverSocket = new ServerSocket(port); 
        System.out.println("Connecting socket..."); 
        Socket clientSocket=serverSocket.accept(); 
        System.out.println("Creating server output..."); 
        PrintWriter serverOutput=new PrintWriter(clientSocket.getOutputStream(),true); 
        System.out.println("Creating server input..."); 
        BufferedReader serverInput=new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
        System.out.println("All systems operational."); 
        String inputLine; 
        while ((inputLine=serverInput.readLine())!=null){ 
         serverOutput.println(inputLine); 
         System.out.println(inputLine); 
        } 
        serverSocket.close(); 
       }catch (IOException serverException) { 
        serverException.printStackTrace(); 
       } 
       break inputLoop; 
      case "2": 
       System.out.println("What is the IP address of the server?"); 
       InetAddress serverAddress=null; 
       try{ 
        serverAddress=InetAddress.getByName(localScanner.nextLine()); 
       }catch (UnknownHostException ipException) { 
        ipException.printStackTrace(); 
       } 
       System.out.println("What port do you want to connect to?"); 
       port=localScanner.nextInt(); 
       try{ 
        System.out.println("Generating socket..."); 
        Socket connectionSocket=new Socket(serverAddress,port); 
        System.out.println("Creating output..."); 
        PrintWriter clientOutput=new PrintWriter(connectionSocket.getOutputStream(),true); 
        System.out.println("Creating server input..."); 
        BufferedReader clientInput=new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
        System.out.println("Creating standard/local input..."); 
        BufferedReader clientStandardInput=new BufferedReader(new InputStreamReader(System.in)); 
        System.out.println("All systems operational."); 
        String userInput; 
        while ((userInput=clientStandardInput.readLine())!=null){ 
         clientOutput.println(userInput); 
         System.out.println("echo: "+clientInput.readLine()); 
        } 
        connectionSocket.close(); 
       }catch (IOException clientException){ 
        clientException.printStackTrace(); 
       } 
       break inputLoop; 
      default: 
       break; 
      } 
     } 
     localScanner.close(); 
    } 
} 

此代码既是服务器又是客户端在一个程序中的用户可访问性。但是,我无法完全正确地工作。该代码

-Works在localhost精细

-Works罚款时,连接到我的电脑的专用IP

试图从不同的路由器

我有连接时-Doesn't工作尝试通过一个端口转发TCP/UDP端口(本例中为42424),使用相同的内部和外部开始和结束端口并转发到我的计算机(它正在运行服务器),但尝试了远程连接的端口转发,但无济于事。每次连接超时,没有其他错误。

我的问题是:我的程序是否存在固有的错误,或者这更可能是路由器/防火墙问题?如果这是一个防火墙问题,我将如何解决它?任何帮助表示赞赏!

+0

是否从不同的电脑工作在同一网络上? – immibis 2015-02-10 02:01:15

+0

它可以在同一网络上的另一台计算机上工作,无需使用私有IP进行端口转发。使用本地主机和我的电脑的私有IP总是有效的:使用我的公共静态IP根本不起作用,即使是在同一台电脑上。 – cheeze 2015-02-10 02:44:26

+0

如果它在同一网络中的另一台计算机上工作,那么它很可能是一个端口转发问题(因此对于SO来说是非题目)。 – immibis 2015-02-10 02:44:59

回答

0

要测试它是否是配置问题,首先要做的就是使用tcpdump或wireshark进行测试。检查TCP SYN消息是否到达服务器,如果是,我们放弃与端口转发有关的配置问题。 然后检查SYN消息是否被来自服务器的SYN/ACK响应。如果没有响应,可能是由于本地防火墙阻塞连接。

我不知道客户端尝试连接时是否超时。它发生在这里吗?

Socket connectionSocket=new Socket(serverAddress,port); 

后你解决这个问题,你必须考虑这种与服务器的通信:How to read all of Inputstream in Server Socket JAVA

+0

我相信这是一个端口转发问题。在端口转发后,我发现并使用了显示所有活动TCP端口转发的命令“netstat -anp tcp”,并发现即使将端口转发到我的计算机后,它也没有显示在netstat下。这意味着这是一个端口转发问题,因此被认为是StackOverflow的主题。不过,感谢您的帮助。 – cheeze 2015-02-12 22:05:13

+0

@cheeze,如果你运行我提到的工具,你可以有更多的细节。在这些可能性中,问题可能是实际接收到SYN,但由于某种原因不会返回SYN/ACK。在这种情况下,您将看不到活动的TCP连接,而端口转发可以正确设置,并且问题在其他地方。这是可能性之一。祝你好运。 – rodolk 2015-02-13 14:47:08