2014-10-11 4 views
0

Я пытаюсь реализовать многопоточное приложение чата сервера в Java.
Эта программа создала поток и ждет подключения клиента. Как только клиент подключен, он создает другой поток и ждет, пока другой клиент подключится.Создание многопоточного приложения Java Chat Chat.

Это мой ChatServer.java

package com.chat.server; 



import java.io.InputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.InetAddress; 
import java.net.ServerSocket; 



/** 
* <p>The chat server program</p> 
* This class is a Thread that recieves connection 
* from different clients and handles them is separate 
* Thread. 
* 
* @author Aditya R.Singh 
* @version 1.0.0 
* @since 1.0.0 
*/ 
class ChatServer extends Thread { 

    private int port;     // The port number to listen at. 
    private String ip;     // To store the IP address. 
    private Socket socket;    // Socket connection with different clients. 
    private InetAddress inet;   // Handling Client Address. 
    private ServerSocket serverSocket; // The server socket used by clients to connect. 



    /** 
    * This is solely intended for instantiation purpose. 
    * 
    * @param PORT - The port number to listen for client requests 
    */ 
    ChatServer(final int PORT) { 


     /* Initiallizing all instance variables to null. */ 
     ip = null; 
     inet = null; 
     socket = null; 
     serverSocket = null; 

     /* Initiallizing the port number. */ 
     port = PORT; 
    } 



    /** 
    * This method creates a connection between server and client. 
    * 
    * @throws java.io.IOException 
    */ 
    private void createConnection() throws IOException { 

     serverSocket = new ServerSocket(port); // Listen to the required port. 
     socket = serverSocket.accept();   // Accept the client connection. 
    } 



    /** 
    * This method sets the IP address. 
    */ 
    private void setIP() { 

     inet = socket.getInetAddress(); 
     ip = new String(inet.getHostAddress()); 
    } 



    /** 
    * This method returns the IP address. 
    * 
    * @return IP address. 
    */ 
    public String getIP() { 

     return ip; 
    } 



    /** 
    * This method checks if the socket has been connected 
    * with any client. 
    * 
    * @return True if the client has been connected, else false 
    */ 
    public boolean isConnected() { 

     if(socket == null) 
      return false; 
     return true; 
    } 



    /** 
    * This method returns the InputStream 
    * from the Socket. 
    * 
    * @return InputStream if Socket has been connected to the client, else null 
    * @see java.io.InputStream 
    */ 
    public InputStream getInputStream() throws IOException { 

     if(socket == null) 
      return null; 
     return socket.getInputStream(); 
    } 



    @Override 
    public void run() { 

     try { 

      createConnection(); 
      setIP(); 
     } catch(IOException exception) { 

      exception.printStackTrace(); 
     } 
    } 
} 

И это мой Server.java:

package com.chat.server; 



/** 
* <p>The Server app</p> 
* This is the controller for accepting connections. 
* 
* @author Aditya R.Singh 
* @version 1.0.0 
* @since 1.0.0 
*/ 
public class Server { 


    /** 
    * The port at which clients will connect. 
    */ 
    public static final int PORT = 6005;   



    /** 
    * For instantiation purpose. 
    */ 
    public Server() { 


    } 



    public static void main(String[] args) { 


     /* Keep accepting connections. */ 
     while(true) { 

      ChatServer chat = new ChatServer(PORT); // Connecting port. 
      chat.start(); 

      while(!chat.isConnected()) 
       /* This is a false loop. Intended to keep running unless another client is not requesting to connect. */; 

      System.out.println("We connected to: "+chat.getIP()); 
     } 
    } 
} 

Код компилируется нормально.
На выполнение кода, как:

java com.chat.server.Server 

, кажется, что программа прослушивает клиент для подключения. Но после подключения к клиенту ожидается печать IP-адреса клиента, а затем создание другого потока для другого клиента. Но он не печатает IP-адрес клиента.

Это мой Client.java:

package com.chat.client; 



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



public class Client { 

    public static void main(String[] args) { 

     Socket socket = null; 


     try { 

      socket = new Socket("127.0.0.1", 6005); 
      System.out.println("Socket connected."); 
     } catch(IOException ex) { 

      ex.printStackTrace(); 
     } 
    } 
} 

Клиентские те подключается к серверу, необходимо распечатать Socket connected. Клиент делает это. Клиент отлично работает:

java com.chat.client.Client 
Socket connected. 

Но серверное приложение не печатает IP-адрес клиента. Почему так?

+0

Это [код] (http://stackoverflow.com/a/25778305/3857942) может дать вам представление о том, как сделать сервер чата. –

ответ

1

Это не полный код

package demo; 

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 



public class MultithreadedServer { 

    public static final int PORT = 10000; 

    public static void main(String[] args) { 
     try(ServerSocket server = new ServerSocket(PORT)) { 
      while(true){ 
       Socket connection = server.accept(); 
       Thread client = new ClientThread(connection); 
       client.start(); 
      } 
     } catch (IOException ex) { 
      System.out.println("Error start server"); 
     } 
    } 

} 

class ClientThread extends Thread { 
    private Socket connection; 

    public ClientThread(Socket connection) { 
     this.connection = connection; 
    } 

    @Override 
    public void run(){ 
     //Do communication with client 
    } 

} 
+0

эй вау. эта работа сработала. большое спасибо –

1

Это состояние гонки. Строка socket = serverSocket.accept(); приводит к завершению цикла while(!chat.isConnected()) до вызова метода setIP(). Быстрый способ проверить, что это является причиной проблемы является изменение этого метода:

public boolean isConnected() { 
    if(socket == null) 
     return false; 
    return true; 
} 

к

public boolean isConnected() { 
    if(socket == null || ip == null) 
     return false; 
    return true; 
} 

Для того, чтобы исправить эту проблему, вы должны убедиться, что код, который устанавливает IP и код, который проверяет, подключен ли он, используйте ключевое слово synchronized. Также обратите внимание, что цикл while(!chat.isConnected()) работает без пауз, а это значит, что потребуется столько же CPU, сколько доступно ... что определенно не очень хорошо.

Ознакомьтесь с ссылкой, которую @Michael Petch опубликовал для правильной реализации чат-сервера.