我想进入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),使用相同的内部和外部开始和结束端口并转发到我的计算机(它正在运行服务器),但尝试了远程连接的端口转发,但无济于事。每次连接超时,没有其他错误。
我的问题是:我的程序是否存在固有的错误,或者这更可能是路由器/防火墙问题?如果这是一个防火墙问题,我将如何解决它?任何帮助表示赞赏!
是否从不同的电脑工作在同一网络上? – immibis 2015-02-10 02:01:15
它可以在同一网络上的另一台计算机上工作,无需使用私有IP进行端口转发。使用本地主机和我的电脑的私有IP总是有效的:使用我的公共静态IP根本不起作用,即使是在同一台电脑上。 – cheeze 2015-02-10 02:44:26
如果它在同一网络中的另一台计算机上工作,那么它很可能是一个端口转发问题(因此对于SO来说是非题目)。 – immibis 2015-02-10 02:44:59