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