if separately
Client —send message to—> Server : works fine!
if separately
Server —send message to—> Client : works fine!
But when both together:
Client —send message to—> Server
Server —send message to—>
Client
Nothing work!
Here is the ServerSide:
import java.io.*;
import java.net.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
public class MyServer
{
private final static int port = 8000;
private static String hostname = "";
private static String hostIP ="";
public static void main(String[] args )
{
ServerSocket serverSocket=null;
try {
// get host information
hostname = InetAddress.getLocalHost().getHostName();
hostIP = InetAddress.getLocalHost().getHostAddress();
// display server information
System.out.println("MyServer started on "+hostname+" with IP: "+hostIP + " on the port number: " + port);
serverSocket = new ServerSocket(port);
}
catch(IOException e)
{
e.printStackTrace();
}
while(true)
{
ClientWorker w;
try
{
w = new ClientWorker(serverSocket.accept());
Thread t = new Thread(w);
t.start();
}
catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
}
class ClientWorker implements Runnable
{
Socket incoming;
public ClientWorker(Socket incoming)
{
this.incoming = incoming;
}
public void run()
{
String request = null;
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
try {
request = in.readLine();
System.out.println("request =" + request);
} catch (IOException e) {
e.printStackTrace();
}
PrintWriter out = null;
try {
out = new PrintWriter(incoming.getOutputStream(),true);
} catch (IOException e) {
e.printStackTrace();
}
out.println("The command is not readable");
}
}
Here is ClientSide:
import java.io.*;
import java.net.*;
public class MyClient2
{
public static void main(String[] args)
{
String answer = null;
if (args.length != 1){
System.out.println("Usage: MyClient serverHostname");
System.exit(0);
}
try
{
Socket socket = new Socket (args[0], 8000);
PrintWriter out = new PrintWriter(socket.getOutputStream(),true);
out.print("TIME");
System.out.println("Request has been send");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
answer = in.readLine();
System.out.println("The answer is: "+answer);
in.close();
out.close();
socket.close();
}
catch (Exception e)
{
System.out.println("Make sure the server is running and try again");
}
}
}
Please have a look and I appreciate your comments.
Cheers
You are using the method
readLinewhich blocks until a newline character is read or the stream is closed. You neither send a newline character or close the stream (until after you expect to have received a response).Try changing
out.print("TIME");toout.println("TIME");.Also, avoid using PrintWriter as it hides any IOExceptions that occur and you have to manually check instead. Your exception handling isn’t great. When an IOException occurs you should probably be terminating the thread (rather than just blindly continuing) as there isn’t much you can do to recover from the error.
In addition your
ClientWorkerdoes not clean up after itself — ie. close the streams and socket.