我应该使用相同的端口进行基于tcp的服务器 - 客户端连接

时间:2015-07-24 10:50:48

标签: sockets tcp process port

我试图通过编写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

1 个答案:

答案 0 :(得分:0)

服务器侦听端口9090,因此客户端必须连接到端口9090.但是客户端不是“已分配”端口9090的情况。实际上当您在连接客户端后运行netstat时,您将看到客户端正在使用由系统分配的另一个端口。

当您打印'客户端连接到服务器'时,当new Socket(...)返回时,客户端已经连接。