2014-12-14 4 views
0

Я пытаюсь создать модель сервера Java для тестирования на своей собственной машине, это не будет использоваться для подключения внешних клиентов, так как сервер и клиент будут на одном компьютере. После того, как клиент подключится к указанному им порту, они должны отправить сообщение по своему выбору, которое будет отправлено обратно им, и любым другим клиентам, подключенным к одному и тому же порту.Connection Refused - Java Client/Server

Проблема, с которой я столкнулся, я получаю java.net.ConnectException: Connection refused: connect, когда это делается. Ниже находится клиент и сервер.

Редактировать: Я нашел время, чтобы гарантировать, что необходимые порты открыты, и даже отключил мой брандмауэр, но безрезультатно.

Сервер:

class MainServer { 
    // port that oir server is going to operate on 
    final static int port = 1234; 
    public static void main(String[] args) { 
     // this is going to model the server for the moment 
     System.out.println("Server has been started..."); 
     Buffer<Messages> store = new Buffer<Messages>(10); 
     new Writer(store).start(); 
     try { 
      ServerSocket serve = new ServerSocket(port); 
      while(true) { 
       // wait for server request 
       Socket socket = serve.accept(); 
       // start thread to service request 
       new ServerThread(socket,store).start(); 
      } 
     } catch(IOException e) {e.printStackTrace();} 
    } 
} 

class ServerThread extends Thread { 
    Socket socket; 
    Buffer<Messages> buffer; 

    public ServerThread(Socket s, Buffer<Messages> b) { 
     socket = s;buffer = b; 
    } 

    public void run() { 
     try { 
      DataInputStream in = new DataInputStream(socket.getInputStream()); 
      int port = in.readInt(); 
      System.out.println("Port: "+port); 
      Messages ms = new Messages(port); 
      // Read message as string from user 
      String message = in.readUTF(); 
      int k = in.readInt(); 

      while(k != -1) { 
       // Add message to array 
       // read next message 
       ms.add(message); 
       message = in.readUTF(); 
      } 
      // close connection 
      socket.close(); 
      // add message to buffer 
      buffer.put(ms); 

     } catch(IOException e) {e.printStackTrace();} 
    } 
} 

class Writer extends Thread { 
    Buffer<Messages> buffer; 

    public Writer(Buffer<Messages> m) {buffer = m;} 

    public void run() { 
     while(true) { 
      Messages dp = buffer.get(); 
      dp.write(); 
     } 
    } 
} 

class Buffer <E> { 
    /** 
    * Producer & Consumer Buffer 
    */ 

    private int max; 
    private int size = 0; 
    private ArrayList<E> buffer; 
    private Semaphore empty; //control consumer 
    private Semaphore full; // control producer 
    private Lock lock = new ReentrantLock(); 

    public Buffer(int s) { 
     buffer = new ArrayList<E>(); 
     max = s; 
     empty = new Semaphore(0); 
     full = new Semaphore(max); 
    } 

    // add data to our array 
    public void put(E x) { 
     try { 
      full.acquire(); 
     } catch(InterruptedException e) {} 
     // sync update to buffer 
     lock.lock(); 
     try { 
      buffer.add(x); 
      size++; 
      empty.release(); 
     } finally {lock.unlock();} 
    } 

    public E get() { 
     try { 
      empty.acquire(); 
     } catch(InterruptedException e) {} 
     // sync uodate on buffer 
     lock.lock(); 
     try { 
      E temp = buffer.get(0); 
      buffer.remove(0); 
      size--; 
      full.release(); 
      return temp; 
     } finally {lock.unlock();} 
    } 
} 

final class Messages { 

    private final int port; 
    private final ArrayList<String> data = new ArrayList<String>(); 

    public Messages(int p) {port = p;} 
    void add(String message) { 
     data.add(message); 
    } 
    void write() { 
     try { 

      Socket socket; 
      socket = new Socket(InetAddress.getLocalHost(),port); 
      DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
      // write message 
      out.write(data.size()); 

      for(String k : data) {out.writeUTF(k);} 
      out.flush(); 
      socket.close(); 
     } catch(IOException e) {e.printStackTrace();} 
    } 
} 

Клиент:

class Client { 

    final static int nPort = 1234; 
    static int serverPort; 

    public static void main(String[] args) { 
     // this class and those present in it 
     // will model the client for assignment 8 
     Scanner in = new Scanner(System.in); 

     System.out.println("Please enter the messageboard number: "); 
     serverPort = in.nextInt(); 


     System.out.println("Please type your message: "); 
     String msg = in.next(); 
     Listener lis = new Listener(serverPort); 
     lis.start(); 
     boolean go = true; 

     while(go) { 
      try { 
       Thread.sleep(2000); 
      } catch(InterruptedException e) {} 
      write(serverPort, msg); 
      System.out.println("Continue: 0/1"); 
      int x = in.nextInt(); 
      if(x == 0)go = false; 
     } 
     System.exit(0); 
    } 

    static void write(int port, String msg) { 
     try { 

      Socket socket; 
      socket = new Socket(InetAddress.getLocalHost(),port); 
      DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
      // send message to port 
      out.writeInt(port); 
      out.writeUTF(msg); 
      // write sentinal after message has been written and close socket 
      out.writeInt(-1); 
      out.flush(); 
      socket.close(); 
     } catch(IOException e) {System.out.println(e);} 
    } 
} 

class Listener extends Thread { 

    private int port; 
    volatile boolean go; 

    public Listener(int p) {p = port;} 

    public void run() { 

     try { 
      ServerSocket serversock = new ServerSocket(port); 
      while(go) { 
       Socket socket = serversock.accept(); 
       DataInputStream in = new DataInputStream(socket.getInputStream()); 
       // Read the message 
       while(in.available() > 0) { 
        String k = in.readUTF(); 
        System.out.print(k+" "); 
       } 
       System.out.println(); 
       socket.close(); 
      } 
     } catch(IOException e) {go = false;} 
    } 
} 
+0

«Connection Refused» означает, что никто не слушает с другой стороны. Вы уверены, что ваш сервер запущен и прослушивается на том же порту при запуске клиента? – Lolo

+0

Довольно уверен, сначала я запустил сервер, а затем подключил мой клиент. Сервер остается включенным, когда я получаю сообщение «Соединение отклонено». Что касается портов, я снова уверен, что они находятся на одном порту. – Zy0n

ответ

0

Имя хоста вы соединяетесь к localhost так что вы предполагаем, что сервер находится на той же машине. Если вам нужно подключиться к другой машине, вам нужно указать хост, к которому вы хотите подключиться.

+0

Я указал в своем сообщении, что сервер работает на одном компьютере, и он не будет обслуживать внешних клиентов. – Zy0n

+0

@ Соединение Zy0n Connection означает, что сервер не прослушивает порт, к которому вы пытаетесь подключиться. –

+0

Проблема решена, пожалуйста, обратитесь к моему ответу. – Zy0n

0

Try изменения

   socket = new Socket(InetAddress.getLocalHost(),port); 
в

   socket = new Socket(*IP OF SERVER (127.0.0.1 if same machine)*, port); 
+0

Пробовал это, не повезло, я боюсь, и да, сервер находится на той же машине, что и клиент. – Zy0n

+0

Попробуйте подключиться к серверу с помощью telnet, если он подключается к серверу на порту, то это означает, что клиент работает неправильно. Если нет, то это сервер. Вы также можете попробовать изменить порты. – Saad

1

Оказывается, я имел неправильное назначение в моем классе Listener. У меня было p = port вместо port = p.

Решено. Через мою собственную глупость.

+0

Я настоятельно рекомендую вам привыкнуть использовать то же имя параметра, что и имя переменной экземпляра, и писать 'this.port = port;' Тогда вы никогда не сможете снова эту проблему. – EJP

+0

Если вы ответили на свой вопрос решением, вы должны принять его, когда после того, как тайм-аут будет снят для других в будущем! :) – Rich

+0

Мне нужно подождать два дня, прежде чем я смогу это сделать. – Zy0n