如何使我的Java服务器在全球范围内可访问?

huangapple 未分类评论47阅读模式
英文:

How can I make my Java server being available from all over the world?

问题

以下是您提供的服务器和客户端代码的翻译部分:

服务器端代码:

package zwei;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	
	public static int Port = 55571;
	
	static ServerSocket ServerSocket;
	static Socket ClientSocket;
	
	static PrintWriter out;
	static BufferedReader in;

	public static void main(String[] args) throws IOException{
		handleConnection(Port);
	}
	
	static void handleConnection(int port) throws IOException {
		ServerSocket = new ServerSocket(port);
		System.out.println("等待连接...");

		ClientSocket = ServerSocket.accept();
		System.out.println("已连接到客户端!");

		out = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
		in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));

		while(true) {
			try {
				char[] buffer = new char[200];
				int AnzahlZeichen = in.read(buffer, 0, 200);
				String message = new String(buffer, 0, AnzahlZeichen);
				System.out.println("[客户端] " + message); 
				
				out.print("亲爱的客户端,我收到了你的消息![ -" + message + "- ]");
				out.flush();
				
				if (message.equals("DISCONNECT")) {
					System.out.println("客户端已断开连接");
					ServerSocket.close();
					ClientSocket.close();
					handleConnection(Port);
				}
			}
			catch(Exception e) {
				System.out.println("客户端已断开连接");
				ServerSocket.close();
				ClientSocket.close();
				handleConnection(Port);
			}
		}
	}
}

客户端代码:

package zwei;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Client extends JFrame{
	
	static int port = 55570;
	static String ServerAdress = ""; // 在这里输入服务器所在计算机的 IP 地址
	
	static Socket ClientSocket;
	
	static PrintWriter out;
	static BufferedReader in;
	
	JTextField EnterMessage;
	JButton SendMessage;
	
	Client(){
		this.setLayout(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		this.setResizable(false);
		this.setSize(700, 700);
		 
		EnterMessage = new JTextField();
		EnterMessage.setBounds(50, 50, 500, 50);
		this.add(EnterMessage);
		 
		SendMessage = new JButton("发送");
		SendMessage.setBounds(50, 150, 100, 100);
		SendMessage.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					SendMessageToServer(EnterMessage.getText());
					ReceiveMessageFromServer();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}});
		this.add(SendMessage);
	}
	
	private void connectToServer(String ServerAdress, int port) throws IOException {
		try {
			this.ClientSocket = new Socket(ServerAdress, port);
			System.out.println("成功连接到位于端口 " + port + " 的服务器。");
		}
		catch(Exception e) {
			System.out.println("尝试连接服务器时出现错误!");
			System.out.println("");
			e.printStackTrace();
		}
	}
	
	private void SendMessageToServer(String Nachricht) throws IOException {
		out = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
		out.print(Nachricht);
		out.flush();
	}
	
	private void ReceiveMessageFromServer() throws IOException{
		in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
		char[] buffer = new char[200];
		int AnzahlZeichen = in.read(buffer, 0, 200);
		String message = new String(buffer, 0, AnzahlZeichen);
		System.out.println("[服务器] " + message); 
	}
	
	public static void main(String[] args) throws Exception { 
		Client client = new Client();
		client.connectToServer(ServerAdress, port);
	}
}

请注意,代码中可能存在一些注释和排版差异,但我已经尽量保持代码的原始结构和逻辑。

英文:

I am new to all that networking stuff. I have recently been working on a client and a server in Java.
The client connects to the server as it should and also gets a response from the server. Everything is working fine as long as client and server are running on computers in the same network. When I try to connect to the server from a computer that is not in the same network as the server the client just does not find the server.

What can I do so that the client can connect to the server from another network? And does that mean I can connect to the server from all over the world?

Here you can find my server code:

    package zwei;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	
	public static int Port = 55571;
	
	static ServerSocket ServerSocket;
	static Socket ClientSocket;
	
	static PrintWriter out;
	static BufferedReader in;

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

	}
	
	
	static void handleConnection(int port) throws IOException {
		ServerSocket = new ServerSocket(port);
		System.out.println("Waiting for connections...");
		
		ClientSocket = ServerSocket.accept();
		System.out.println("Connected to Client!");
		
		out = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
		in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
		
		while(true) {
			try {
					char[] buffer = new char[200];
					int AnzahlZeichen = in.read(buffer, 0, 200);
					String message = new String(buffer, 0, AnzahlZeichen);
					System.out.println("[Client] " + message); 
					
					out.print("Dear Client, I got your message! [ -" + message + "- ]");
					out.flush();
					
					if (message.equals("DISCONNECT")) {
						System.out.println("Client disconnected");
						ServerSocket.close();
						ClientSocket.close();
						handleConnection(Port);
					}
				}
			catch(Exception e) {
				System.out.println("Client disconnected");
				ServerSocket.close();
				ClientSocket.close();
				handleConnection(Port);
			}

		}

	}

}

And here you can find the code of the client:

package zwei;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Client extends JFrame{
	
	static int port = 55570;
	static String ServerAdress = ""; //Here I put the IP-Adress of the computer the server is running on
	
	static Socket ClientSocket;
	
	static PrintWriter out;
	static BufferedReader in;
	
	JTextField EnterMessage;
	JButton SendMessage;
	
	Client(){
		 this.setLayout(null);
		 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		 this.setVisible(true);
		 this.setResizable(false);
		 this.setSize(700, 700);
		 //this.setTitle("Vokabeltrainer");
		 
		 EnterMessage = new JTextField();
		 EnterMessage.setBounds(50, 50, 500, 50);
		 this.add(EnterMessage);
		 
		 SendMessage = new JButton("send");
		 SendMessage.setBounds(50, 150, 100, 100);
		 SendMessage.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					SendMessageToServer(EnterMessage.getText());
					ReceiveMessageFromServer();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
				
			}});
		 this.add(SendMessage);
	}
	
	private void connectToServer(String ServerAdress, int port) throws IOException {
		
		try {
			this.ClientSocket = new Socket(ServerAdress,port);
			System.out.println("Successfully established a connection to the server on port " + port + " .");
			}
		
		catch(Exception e) {
			System.out.println("An error occured while trying to connect to the server!");
			System.out.println("");
			e.printStackTrace();
		}
	}
	
	private void SendMessageToServer(String Nachricht) throws IOException {
		out = new PrintWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
		out.print(Nachricht);
		out.flush();
	}
	
	private void ReceiveMessageFromServer() throws IOException{
		in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
		char[] buffer = new char[200];
		int AnzahlZeichen = in.read(buffer, 0, 200);
		String message = new String(buffer, 0, AnzahlZeichen);
		System.out.println("[Server] " + message); 
	}
	
	public static void main(String[] args) throws Exception { 
		Client client = new Client();
		client.connectToServer(ServerAdress, port);
		//in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
		

	}

}

答案1

得分: 0

如你所知,每台计算机都有一个IP地址和一个端口号,服务器是计算机的一种类型。如果你希望你的应用程序正常运行,你需要一个可以运行Java的服务器;如果你只是需要进行测试,你的计算机需要拥有静态IP地址。

这样,你的客户端应用程序总是知道应该使用哪个端口和哪个IP地址来连接到服务器应用程序。

如果你想进行测试,又不想为服务器或静态IP地址付费,在客户端应用程序中获取用户提供的IP地址和端口,我认为你可以在两台不同的计算机上运行你的应用程序。但值得注意的是,你的路由器设置可能会影响你的连接。

英文:

As you know, every computer has an ip address and a port number and server is a type of computer. if you want to your application work, you should have a server that can run java or if you just need test you should have static ip for your computer.
This way, your client app always knows which port and which IP address should use to connect to your server app.
If you want to test and you do not want to pay for server or static Ip address, give Ip address and port from user in client app and I think that you can run your apps on 2 different computers, but worth mentioning that settings of your rooter may have impact on your connection.

huangapple
  • 本文由 发表于 2020年4月7日 18:55:50
  • 转载请务必保留本文链接:https://java.coder-hub.com/61078395.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定