我试图通过编写java程序(从实践中学习)来理解网络的主题。我使用java.net.Socket在java中编写了一个客户端和一个服务器。客户端是一个类,服务器是一个类。然后我在一个Main-class中实例化了这两个类。 java-Application在我的计算机上运行。当我将相同的端口分配给客户端和服务器时,我没有得到任何错误(例如:端口80)。但是,当我分配不同的端口(例如:端口80到服务器和端口9090到客户端),然后我收到一个错误。我应该使用相同的端口进行tcp连接吗? 我想知道为什么我会收到错误。 这是我的整个代码放在一个java包中:
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
答案 0 :(得分:0)
服务器侦听端口9090,因此客户端必须连接到端口9090.但是客户端不是“已分配”端口9090的情况。实际上当您在连接客户端后运行netstat
时,您将看到客户端正在使用由系统分配的另一个端口。
当您打印'客户端连接到服务器'时,当new Socket(...)
返回时,客户端已经连接。