2015-07-24 4 views
0

Я пытаюсь понять тему создания сетей, написав java-программы (обучение на практике). Я написал клиент и сервер в java, используя java.net.Socket. Клиент - это класс, а сервер - класс. Затем я создал два класса в одном Main-классе. Приложение java запускается на моем компьютере. Когда я назначаю один и тот же порт клиенту и серверу, тогда я не получаю ошибки (например: порт 80). Но когда я назначаю разные порты (например, порт 80 на сервер и порт 9090 для клиента), я получаю сообщение об ошибке. Должен ли я использовать тот же порт для tcp-соединения? Я хочу понять, почему я получаю сообщение об ошибке. здесь весь мой код положить в одном Java-пакет:Должен ли я использовать один и тот же порт для подключения к серверу-клиенту tcp

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

Возможно, вы захотите ознакомиться с основами сокетов. Вы также можете указать соответствующий код и фактические сообщения об исключениях. В основном сервер _listens_ на порту, клиент _connects_ на тот же порт. – CodeCaster

+0

Вы не можете использовать один и тот же порт на одном и том же IP-адресе, что делает ваше заявление о том, что трудно поверить. Без кода мы не можем ответить. Закрытие пока. – usr

+0

У меня есть основы (теоретический фон), но я никогда не писал программы по этим темам. Итак, я делаю это сейчас: :) – amitakCs

ответ

0

Сервер прослушивает порт 9090, поэтому клиент должен подключиться к порту 9090. Но это не тот случай, когда клиент назначается порт 9090. Фактически при запуске netstat после подключения клиента вы увидите, что клиент использует другой порт, выделенный системой.

NB к моменту печати «клиент подключается к серверу» клиент уже подключен, когда возвращается new Socket(...).

+0

ok, Это логично, что вы говорите. спасибо – amitakCs