Search code examples
javasocketschat

I am trying to develop a chat application using socket Programming in single server and multiple Clients


MainServer.java

import java.net.*;
import java.io.*;

public class MainServer{

public static int PORT=1234;

public static void main(String args[]) {

ServerSocket serverSocket=null;
Socket socket=null;

try{

serverSocket=new ServerSocket(PORT);

}catch(Exception e){
System.out.println("Error is :"+e);

}

while(true){
socket=serverSocket.accept();
SubServer sub=new SubServer(socket);
sub.start();
}
serverSocket.close();

  }
}

SubServer.java

import java.net.*;
import java.io.*;
public class SubServer extends Thread {

private Socket socket=null;
String receiveData;

public SubServer(Socket socket){
this.socket=socket;
}

public void run(){

DataInputStream dis=new DataInputStream(socket.getInputStream());
receiveData=dis.readLine();
System.out.println("client Message: "+receiveData);

  }
}

The error is :

MainServer.java:27: error: unreachable statement
serverSocket.close();
^
MainServer.java:23: error: unreported exception IOException; must be caught or declared to be thrown
socket=serverSocket.accept();
                          ^
MainServer.java:27: error: unreported exception IOException; must be caught or declared to be thrown
serverSocket.close();
                  ^
Note: ./SubServer.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
3 errors

I saw many tutorial and reference but i can not solve my problem.Single server and single clients working fine but multiple client can not communicate in a single server. I use a Thread class to handle a multiple client but it gives a above error. Where is my mistake i can not find.Thanks in advance.


Solution

  • Here :

    while(true){
      socket=serverSocket.accept();
      SubServer sub=new SubServer(socket);
      sub.start();
    }
    

    You wrote an infinite loop : while(true){...}. So, any statement after the while statement is not reachable.

    Whereas the compilation error :

    MainServer.java:27: error: unreachable statement serverSocket.close();

    serverSocket.close(); should not required or should make part of a hook shutdown such as :

    Runtime.getRuntime().addShutdownHook(new Thread(t-> serverSocket.close()));
    

    These two other compilation errors :

    MainServer.java:23: error: unreported exception IOException; must be caught or declared to be thrown socket=serverSocket.accept();

    MainServer.java:27: error: unreported exception IOException; must be caught or declared to be thrown serverSocket.close();

    refer to the checked exception IOException that is not handled (caught or thrown).

    As Thread.run() doesn't declare any exception, you have to catch it :

    public void run(){
    
      try {
         DataInputStream dis = new DataInputStream(socket.getInputStream());
         receiveData = dis.readLine();
         System.out.println("client Message: " + receiveData);
       } catch (IOException e) {
         // handling of the exception : logging and probably end of execution of 
            the current thread
        }
    }
    

    As a side note, invoking the deprecated readLine() method of DataInputStream object is not a good idea. Prefer a BufferedReader to :

    This method does not properly convert bytes to characters. As of JDK 1.1, the preferred way to read lines of text is via the BufferedReader.readLine() method.