Chciałbym napisać w Javie prostego klienta i serwer. Mam taki kod
package server;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server
{
public static void main(String[] args) throws IOException
{
int port = 11235;
ServerSocket sSocket;
sSocket = new ServerSocket(port);
System.out.println("Waiting for lucky client...");
Socket cSocket = sSocket.accept();
PrintWriter toClient = new PrintWriter(cSocket.getOutputStream(), true /*autoflash*/);
toClient.println("You were the first one to connect, you win!");
cSocket.close();
sSocket.close();
}
}
package client;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client
{
public static void main(String[] args) throws IOException
{
final int port;
final String host;
if (args.length == 0)
{
host = "localhost";
port = 11235;
}
else if (args.length != 2)
{
System.err.println("Usage: java Client host port");
return;
}
else {
try {
port = Integer.parseInt(args[1]);
host = args[0];
} catch (Exception ex)
{
System.err.println("Usage: java Client host port");
return;
}
}
Socket s = new Socket();
System.out.println("Trying to connect...");
s.connect(new InetSocketAddress(host, port), 5000);
System.out.println("Success!");
Scanner fromServer = new Scanner(s.getInputStream());
while (fromServer.hasNextLine())
{
System.out.println("<Server> " + fromServer.nextLine());
}
System.out.println("Done");
}
}
Kiedy uruchamiam oba programy na tym samym komputerze to oczywiście nie ma problemu, programy działają jak należy. Ale teraz chciałbym pójść o krok dalej i uruchomić serwer na jednej maszynie, a klienta na innej. Oba komputery działają w sieci lokalnej. Serwer stawiam na komputerze o adresie 192.168.0.7.
$ java -jar server.jar
Waiting for lucky client...
Na kliencie (o adresie 192.168.0.4) wywołuję
$ java -jar client.jar 192.168.0.7 11235
Trying to connect...
Exception in thread "main" java.net.NoRouteToHostException: No route to host
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:327)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:193)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:384)
at java.net.Socket.connect(Socket.java:546)
at client.Client.main(Client.java:41)
No właśnie. Czemu tak się stało?
Dodam jeszcze, że na maszynie z serwerem mam włączonego wiresharka i widzę, że po uruchomieniu programu klienta następuje przesył pewnych pakietów przez sieć. Widzę na przykład paczki z wzajemnym odpytywaniem się o adresy, jakiś pakiet TCP z 198.168.0.4 do 192.168.0.7, który nie do końca wiem co zawiera, ale interesujący może się wydać pakiet ICMP z 198.168.0.7 do 192.168.0.4 z informacją "Destination unreachable (Host administratively prohibited)". Będę wdzięczny za pomoc.