sockety komunikacja i wysył wiadomości

0

Witam ,
usiłuje nawiązać połączenie klient-serwer do przesyłania wiadomości od klienta do serwera, ale niestety mam problem z wysłaniem wiadomości jakby wątek się nie zamykał i czekał na kolejne dane

import java.io.IOException;

import java.net.Socket;

public class ClientTCP {

    public static void main(String[]args) throws IOException, InterruptedException{

        //nazwiazanie polaczenia z serwerem
        Socket socket;
        socket=new Socket("127.0.0.1",1234);
        System.out.println("nazwiazalem polaczenie:"+ socket);

        new Odbior(socket).start();

        }

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

public class ServerTCP {

public static void main(String[] args) throws IOException{

    ServerSocket serv=new ServerSocket(1234);

    while(true){
        //przyjecie polaczenia
        System.out.println("oczekiwanie na polaczenie...");
        Socket sock=serv.accept();

        //tworzenie watku oblsui tego polaczenia
        new Wysyl(sock).start();
    }

}

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

public class Odbior extends Thread {

    Socket socket;
    BufferedReader socketReader;

        public Odbior(Socket socket) throws IOException{
            this.socket=socket;
            this.socketReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }

public void run(){

    try {
        //tworzenie strumieni danych pobieranych z klawiatury i dostarczanych do socketu

        PrintWriter outp;
        outp=new PrintWriter(socket.getOutputStream());

        //komunikacja-czytanie danych z klawiatury i przekazywanie ich do strumienia
        System.out.println("Wysylamy");
        String str=socketReader.readLine();
        outp.println(str);
        outp.flush();
        outp.close();
        socketReader.close();
        socket.close();

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

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

public class Wysyl extends Thread {

Socket socket;
BufferedReader socketReader;

public Wysyl(Socket socket)throws IOException{
    this.socket=socket;
    this.socketReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

public void run(){
    String str;

    try {

        str=socketReader.readLine();
        System.out.println("nadeszlo "+ str);

        socket.close();
        socketReader.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   

}

}

prosiłbym o sprawdzenie kodu i ewentualne naprowadzenie na błąd

1

W kodzie który załączyłeś nic nie jest wysyłane. Obydwie strony połączenia czekają na readLine().

1

Daj code=java. Nigdzie w tym kodzie nie ma wysyłania. Stwórz od tego metodę, która będzie wywoływana przez wątek obsługujący danego klienta:

 public void Send()
{

    Scanner in = new Scanner(System.in);
    String text;  

    while(true)
    {
        text = in.nextLine();

        try {
            new DataOutputStream(socket.getOutputStream()).writeBytes(text + "\n");
        } catch (IOException e) {

        }

    }
}

I pamiętaj o while jak nie chcesz, żeby ci wątek gasł po jednym wysłaniu czy tam odebraniu wiadomości.

0

Dzieki panowie wasze rady były trafne, udało mi się to poprawić teraz kod wygląda tak

import java.io.IOException;

import java.net.Socket;

public class ClientTCP {

    public static void main(String[]args) throws IOException, InterruptedException{

        //nazwiazanie polaczenia z serwerem
        Socket socket;
        socket=new Socket("127.0.0.1",1234);
        System.out.println("nazwiazalem polaczenie:"+ socket);

            new Odbior(socket).start();
        new Wysyl(socket).start();

        }

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

public class Wysyl extends Thread {

Socket socket;
BufferedReader socketReader;

public Wysyl(Socket socket)throws IOException{
    this.socket=socket;
    this.socketReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

public void run(){
    String str;

    while(true){
    try {

        str=socketReader.readLine();
        System.out.println("nadeszlo "+ str);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }   

    }
}

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

public class ServerTCP {

public static void main(String[] args) throws IOException{

    ServerSocket serv=new ServerSocket(1234);

    while(true){
        //przyjecie polaczenia
        System.out.println("oczekiwanie na polaczenie...");
        Socket sock=serv.accept();
        new Wysyl(sock).start();
        new Odbior(sock).start();

    }
    //tworzenie watku oblsui tego polaczenia

}

} 
 import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Odbior extends Thread {

    Socket socket;
    BufferedReader socketReader;

        public Odbior(Socket socket) throws IOException{
            this.socket=socket;
            this.socketReader=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }

public void run(){

    String wy;
    Scanner in=new Scanner(System.in);

    while(true){
        wy=in.nextLine();

        try {
        new DataOutputStream(socket.getOutputStream()).writeBytes(wy + "\n");

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

}

}

wysyłanie wiadomości działa teraz poprawnie, ale chciałbym go sprawdzić czy serwer działa też poprawnie dla wielu klientów jest na to jakiś sposób czy musze podłaczyć drugi komputer do sieci i zrobić na nim klienta?

0

Odpal 2 klienta na jednym kompie. To nie jest problem.

0

nie wiem czy miałem to zrobić w taki sposób ale utworzyłem nowego workspace-a i odpaliłem na nim eclipsa równolegle z pierwszym a następnie wysłałem wiadomość i udało się. A teraz jeśli chciałbym zakmnąć połączenie od strony klienta to wystarczy że zamkne socketa w taki sposób socket.close()?

0

Tak.
I jeszcze jedno: po kij Ci wątki? Poczytaj jak to zrobić asynchronicznie.

0

Nie otwieraj 2 razy kompilatora, bo to bez sensu. Otwórz sobie normalnie konsole Windowsowską i przez konsole komenda java nazwa_pliku otwórz plik .class. Socket.close po stronie serwera konczy polaczenie, ale nie zabija wątku obsługującego ów klienta, to trzeba zrobić ręcznie.

0

na początku chciałem sobie zrobić samo połączenie dla ćwiczenia ale potem znalazłem zadanie aby zrobić z tego komunikator a w podpowiedzi było abym skorzystał z wątków tak więc zrobiłem ,ale spróbuje to zrobić tak jak napisałeś

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