2017-06-23 2 views
1

Das sollte einfach genug sein, aber mir fehlt hier etwas. Ich habe zwei Spielzeugklassen: (a) einen Server, der Verbindungen erwartet und Dateien bereitstellt; und (b) ein Client, der eine Datei anfordert und sie auf der Standardausgabe ausgibt.Warum bekomme ich "Adresse bereits verwendet (Verbindung fehlgeschlagen)"?

Server Code:

package lp2.tarefa4; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import static java.lang.String.format; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class ServidorWeb implements Runnable { 

    private final String dirName; 

    public ServidorWeb(String dirName) { 
     this.dirName = dirName; 
    } 

    public static void main(String[] args) { 
     ServidorWeb srv = new ServidorWeb(args[0]); 
     srv.run(); 
    } 

    @Override 
    public void run() { 
     System.out.println("Server started. Waiting for connections..."); 

     while (true) { 
      try { 
       ServerSocket server = new ServerSocket(48080); 
       Socket socket = server.accept(); 
       proccessRequest(socket); 
      } 
      catch (IOException ex) { 
       System.err.println("!!! ERRO: " + ex.getMessage()); 
      } 
     } 
    } 

    private void proccessRequest(Socket socket) throws IOException { 
     DataInputStream in = new DataInputStream(socket.getInputStream()); 
     DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
     String fileName = in.readUTF(); 
     File inputFile = new File(dirName, fileName); 

     String msg = format("Request: %s:%d [%s]", 
       socket.getInetAddress(), 
       socket.getPort(), 
       inputFile.getPath()); 
     System.out.println(msg); 

     DataInputStream fin = new DataInputStream(new FileInputStream(inputFile)); 
     String s = fin.readUTF(); 
     while (s != null) { 
      out.writeUTF(s); 
      s = fin.readUTF(); 
     } 
     in.close(); 
     out.close(); 
     fin.close(); 
    } 

} 

Client-Code:

package lp2.tarefa4; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.net.Socket; 

public class ClienteWeb implements Runnable { 

    private final String host; 
    private final int port; 
    private final String fileName; 

    public ClienteWeb(String host, int port, String fileName) { 
     this.host = host; 
     this.port = port; 
     this.fileName = fileName; 
    } 

    public static void main(String[] args) { 
     ClienteWeb srv = new ClienteWeb(args[0], Integer.parseInt(args[1]), args[2]); 
     srv.run(); 
    } 

    @Override 
    public void run() { 
     try { 
      Socket socket = new Socket(host, port); 
      DataInputStream in = new DataInputStream(socket.getInputStream()); 
      DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
      out.writeUTF(fileName); 
      String s = in.readUTF(); 
      while (s != null) { 
       System.out.println(s); 
       s = in.readUTF(); 
      } 
      in.close(); 
      out.close(); 
      socket.close(); 
     } 
     catch (IOException ex) { 
      System.err.println("!!! ERRO: " + ex.getMessage()); 
     } 
    } 

} 

Ich versuche beides, Server und Client auf derselben Maschine zu laufen, aber jedes Mal, wenn ich versuche, Führen Sie den Client immer erhalten diese Nachricht vom Server:

!!! ERRO: Adresse bereits in Gebrauch (Bind gescheitert)

Muss ich etwas anders als die oben tun, um diesen Code ohne Fehler zu laufen?

Danke.

+0

In Ihrem Code sollten Sie auch ServerSocket schließen – zencv

Antwort

1

Der Fehler bedeutet normalerweise, dass der Port, den Sie zu öffnen versuchen, bereits von einer anderen Anwendung verwendet wird. Verwenden Sie netstat, um zu sehen, welche Ports geöffnet sind, und verwenden Sie dann einen verfügbaren Port.

Überprüfen Sie auch, wenn Sie an die richtige IP-Adresse verbindlich sind (ich nehme an, dass localhost würde) ein

netstat -tulpn ermöglicht die Prozess-ID, das zu finden, einen bestimmten Port verwendet.

Verwandte Themen