这可能是一个愚蠢的问题,但在这里。我正在编写这个聊天程序,其中有一个服务器和可以连接到它的客户端。我想在程序中实现私人消息传递,但我不知道如何让客户端直接相互连接。对于服务器,我使用了在单个端口上运行的 ServerSocket。为了让它工作,我需要将一个端口转发到服务器。有没有办法让客户端等待连接,而不向他们转发端口?
谢谢
这可能是一个愚蠢的问题,但在这里。我正在编写这个聊天程序,其中有一个服务器和可以连接到它的客户端。我想在程序中实现私人消息传递,但我不知道如何让客户端直接相互连接。对于服务器,我使用了在单个端口上运行的 ServerSocket。为了让它工作,我需要将一个端口转发到服务器。有没有办法让客户端等待连接,而不向他们转发端口?
谢谢
TCP/IP 的全部意义在于单个客户端连接到服务器上的预定义端口。所以是的,您还需要ServerSocket
在客户端上有一个将接受直接连接的客户端。您几乎总是会在端口转发等方面遇到麻烦,这就是有一天 UPnP 被发明出来的原因。
您正在尝试做的是“点对点”连接,也就是 P2P,根据其定义,它总是受到防火墙问题的困扰。因此,通常,特别是对于聊天,更容易将中央服务器用作“总机”服务器并中继私人消息。
我不久前写了一个multiple client - server
应用程序模板,它可能会帮助您解决问题。我认为@Niels 已经回答了您的其余问题;)
import java.net.*;
import java.io.*;
class ServeConnection extends Thread {
private Socket socket = null;
private BufferedReader in = null;
private PrintWriter out = null;
public ServeConnection(Socket s) throws IOException {
// init connection with client
socket = s;
try {
in = new BufferedReader(new InputStreamReader(
this.socket.getInputStream()));
out = new PrintWriter(this.socket.getOutputStream(), true);
} catch (IOException e) {
System.err.println("Couldn't get I/O.");
System.exit(1);
}
start();
}
public void run() {
System.out.println("client accepted from: " + socket.getInetAddress()
+ ":" + socket.getPort());
// get commands from client, until is he communicating or until no error
// occurs
String inputLine, outputLine;
try {
while ((inputLine = in.readLine()) != null) {
System.out.println("request: " + inputLine);
outputLine = inputLine;
out.println("I've recived "+outputLine);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("server ending");
out.close();
try {
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Server {
public static void svr_main(int port) throws IOException {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
System.err.println("Could not listen on port: " + port);
System.exit(1);
}
System.out.println("Server ready");
try {
while (true) {
Socket socket = serverSocket.accept();
try {
new ServeConnection(socket);
} catch (IOException e) {
System.err.println("IO Exception");
}
}
} finally {
serverSocket.close();
}
}
}
class Client {
static Socket echoSocket = null;
static PrintWriter out = null;
static BufferedReader in = null;
public static void cli_main(int port, String servername) throws
IOException {
try {
echoSocket = new Socket(servername, port);
out = new PrintWriter(echoSocket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(
echoSocket.getInputStream()));
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + servername);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for " + servername);
System.exit(1);
}
System.out.println("Client ready!");
while (true) {
inputLine = (in.readLine().toString());
if (inputLine == null) {
System.out.println("Client closing!");
break;
}
// get the input and tokenize it
String[] tokens = inputLine.split(" ");
}
out.close();
in.close();
echoSocket.close();
System.out.println("Client closing");
}
}
public class MyClientServerSnippet{
public static void main(String[] args) throws IOException {
if (args.length == 0) {
System.err.println("Client: java snippet.MyClientServerSnippet<hostname> <port>");
System.err.println("Server: java snippet.MyClientServerSnippet<port>");
System.exit(1);
}
else if (args.length > 1) {
System.out.println("Starting client...\n");
Client client = new Client();
client.cli_main(3049, "127.0.0.1");
} else {
System.out.println("Starting server...\n");
Server server = new Server();
server.svr_main(3049);
}
}
}