Klient-Serwer połączenie

0

Witam, mam problem z połączeniem klient-serwer na podstawie klas Socket i ServerSocket. Mianowicie, gdy tworzę serwer (wciskam przycisk "Stwórz serwer") program mi się przywiesza (co jest chyba zrozumiałe bo oczekuje na .accept() od klienta), wtedy próbuję podłączać się z innego komputera (na innym zewnętrznym IP np. kumpla), który się podłącza pod moje IP ale mimo wszystko nie może się połączyć, tak jakby przekracza czas połączenia. Dodam że gdy łączę się do serwera Google przy porcie 80 i wysyłam jakąś wiadomość dostaję powrotną więc chyba to działa. Firewalle wyłączone. Załączam klasy klienta i serwera może coś przeoczyłem?

import java.io.*;
import java.util.*;
import java.net.*;
/**
 *
 * @author Mateusz
 */
public class Server {
    
    ServerSocket Socket;
    Socket Connection;
    PrintStream out;
    BufferedReader in;
    
    Server(int PORT, Status s) {
        try {
            Status Status = s;
            Socket = new ServerSocket(PORT);
            Connection = Socket.accept();

            Status.setStatus("Ustanowiono połączenie.");
            
            out = new PrintStream(Connection.getOutputStream());
            in = new BufferedReader(new InputStreamReader(Connection.getInputStream()));
        } catch(IOException e) {}
    }
    
    public PrintStream getOut() {
        return out;
    }
    
    public BufferedReader getIn() {
        return in;
    }
    
   
   
}
import java.io.*;
import java.util.*;
import java.net.*;
/**
 *
 * @author Mateusz
 */
public class Client {
    
    Socket Socket;
    PrintStream out;
    BufferedReader in;
    
    Client(int PORT, String HOST, Status Status) {
        try {
            Socket = new Socket();
            Socket.connect(new InetSocketAddress(HOST, PORT));
            Status.setStatus("Nawiązano połączenie (" + HOST + " : " + PORT + ")");
            out = new PrintStream(Socket.getOutputStream());
            in = new BufferedReader(new InputStreamReader(Socket.getInputStream()));
        } catch(IOException e) {}
    }
    
    public PrintStream getOut() {
        return out;
    }
    
    public BufferedReader getIn() {
        return in;
    }
}



0
  1. Naucz się NIE nazywać pól klasy / zmiennych tak samo jak nazwy klas. Nazwanie socketa Socket to proszenie sie o guza...
  2. Ja proponuje serwer zrobić wielowątkowy -> jeśli przyjdzie nowy klient to przełączasz jego obslugę na nowy wątek i znów czekasz na nowych klientów.
  3. Proponowałbym bindowwać serwer podajac zarówno host jak i port, bo jak masz dużo adresów sieciowych to moze się okazać że nie bindujesz się na tym na którym chciałeś...
0

Jeśli chodzi o nazewnictwo ok, też to zauważyłem ale pozmieniam jak już wszystko będzie działało. Co do wielowątkowości, to też racja ale ja chcę komunikować się w sumie tylko z jednym komputerem więc jak na moje chwilowe obecne potrzeby wystarczy. Użyłem wielowątkowości tylko do odświeżania okienka z wiadomościami (jednocześnie można pisać i dostajemy wiadomości). Co to znaczy zbindować serwer? Spingować po stronie klienta? Jeśli tworzę serwer na kompie to obojętne czy odwołuję się do zewnętrznego Ip czy do wewnętrznego, powinno połączyć prawda?

1

No wlaśnie to nie jest obojętne :P W ogóle jeśli ten twój "serwer" jest za NATem to sie z nim tak nie połączysz jeśli nie jesteś z nim w sieci LAN albo nie przekierujesz portów na routerze.

0

Hmm chyba nie jestem za NATem. Kiedyś stawiałem na kompie serwery do WoWa :P Pamiętam było z tym zabawy i powiedziałem żeby mi przekierowali porty, dali zew. IP i działało. No to jeszcze bardziej ograniczmy nasz programik. Załóżmy że ma działać tylko po LANie, w obrębie jednej sieci WIFI w której są komputery mojej sieci. Bo to w sumie ma działać tylko po LAN ale myślałem że może i zadziała "na zewnątrz" ale widzę że to by było zbyt piękne. Powinno mnie połączyć z innego komputera w sieci czy muszę coś zmodyfikować? Mogę jakoś w obrębie jednego PC to zrobić?

//edit, telnetem sie pobawilem w obrebie jednego komputera, zrobilem serwer, podalem port 2000, potem polaczylem telnetem do mojego wew. Ip i portu. Sprawdze na 2 kompie

0

Ok przez LANa będzie działać, tylko coś nie bardzo moje okienko wiadomościowe działa. Wysyła wiad. ale nie odbiera. W telnecie już owszem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1