我应该为基于 tcp 的服务器客户端连接使用相同的端口吗
should I use the same port for tcp-based server-client-connection
我试图通过编写 java 程序(边做边学)来理解网络主题。我使用 java.net.Socket 在 java 中编写了一个客户端和一个服务器。客户端是 class,服务器是 class。然后我在一个 Main-class 中实例化了两个 classes。我电脑上的 java-Application 运行。当我为客户端和服务器分配相同的端口时,我没有收到任何错误(例如:端口 80)。但是当我分配不同的端口时(例如:端口 80 到服务器和端口 9090 到客户端)然后我得到一个错误。我应该为 tcp 连接使用相同的端口吗?
我想了解为什么会出现错误。
这是我的整个代码放在一个 java-package:
package client_server;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.*;
import java.util.Date;
public class Server {
ServerSocket server;
Server(){
System.out.println("server starts");
try{
//server runs on port 9090
server=new ServerSocket(9090);
}catch(IOException e){
e.printStackTrace();
}
}
void listen(){
Socket socket = null;
try {
System.out.println("server is listining");
socket=server.accept();
PrintWriter out =new PrintWriter(socket.getOutputStream(), true);
out.println(new Date().toString());
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package client_server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.*;
public class Client {
Socket clientSocket;
Client(){
System.out.println("Client starts");
final String server_ip_adress="127.0.0.1";
try {
clientSocket = new Socket(server_ip_adress,80);
} catch (IOException e) {
e.printStackTrace();
}
}
void connectToServer(){
try{
System.out.println("client connects to server");
InputStream clientInput=clientSocket.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(clientInput));
String answer = input.readLine();
System.out.println(answer);
}catch(IOException e){
e.printStackTrace();
}
}
}
package client_server;
public class Main {
public static void main(String [] args){
Server server = new Server();
Client client = new Client();
server.listen();
client. connectToServer();
}
}
理论上它应该可以工作,因为每个进程(服务器进程和客户端进程)都会被分配一个端口,进程间通信是否发生在不同的端口上并不重要。
但就我而言,我只有一个过程。因此,当我分配不同的端口时,它会抛出错误。我的分析正确吗?
我收到此错误:地址已在使用中:JVM_Bind
服务器监听9090端口,所以客户端必须连接到9090端口。但是客户端并不是'assigned'9090端口。实际上当你运行netstat
连接客户端后,你会看到客户端正在使用另一个端口,由系统分配。
注意当你打印 'client connects to server' 客户端已经连接,当 new Socket(...)
returns.
我试图通过编写 java 程序(边做边学)来理解网络主题。我使用 java.net.Socket 在 java 中编写了一个客户端和一个服务器。客户端是 class,服务器是 class。然后我在一个 Main-class 中实例化了两个 classes。我电脑上的 java-Application 运行。当我为客户端和服务器分配相同的端口时,我没有收到任何错误(例如:端口 80)。但是当我分配不同的端口时(例如:端口 80 到服务器和端口 9090 到客户端)然后我得到一个错误。我应该为 tcp 连接使用相同的端口吗? 我想了解为什么会出现错误。 这是我的整个代码放在一个 java-package:
package client_server;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.*;
import java.util.Date;
public class Server {
ServerSocket server;
Server(){
System.out.println("server starts");
try{
//server runs on port 9090
server=new ServerSocket(9090);
}catch(IOException e){
e.printStackTrace();
}
}
void listen(){
Socket socket = null;
try {
System.out.println("server is listining");
socket=server.accept();
PrintWriter out =new PrintWriter(socket.getOutputStream(), true);
out.println(new Date().toString());
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package client_server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.*;
public class Client {
Socket clientSocket;
Client(){
System.out.println("Client starts");
final String server_ip_adress="127.0.0.1";
try {
clientSocket = new Socket(server_ip_adress,80);
} catch (IOException e) {
e.printStackTrace();
}
}
void connectToServer(){
try{
System.out.println("client connects to server");
InputStream clientInput=clientSocket.getInputStream();
BufferedReader input = new BufferedReader(new InputStreamReader(clientInput));
String answer = input.readLine();
System.out.println(answer);
}catch(IOException e){
e.printStackTrace();
}
}
}
package client_server;
public class Main {
public static void main(String [] args){
Server server = new Server();
Client client = new Client();
server.listen();
client. connectToServer();
}
}
理论上它应该可以工作,因为每个进程(服务器进程和客户端进程)都会被分配一个端口,进程间通信是否发生在不同的端口上并不重要。
但就我而言,我只有一个过程。因此,当我分配不同的端口时,它会抛出错误。我的分析正确吗? 我收到此错误:地址已在使用中:JVM_Bind
服务器监听9090端口,所以客户端必须连接到9090端口。但是客户端并不是'assigned'9090端口。实际上当你运行netstat
连接客户端后,你会看到客户端正在使用另一个端口,由系统分配。
注意当你打印 'client connects to server' 客户端已经连接,当 new Socket(...)
returns.