Chiarimento Socket

di il
4 risposte

Chiarimento Socket

Ciao a tutti,
scusate la domanda forse banale ma mi sto approcciando da pochissimo alle socket in Java e ho un dubbio.

Sto consultando alcuni esempi di applicazioni client-server trovate in internet e mi sono battuto in un'applicazione che simula una chat tra un singolo client e un server. Di seguito il codice:
SERVER---
import java.io.*;
import java.net.*;
import java.lang.*;
public class Server {
	public static void main(String[] args) throws IOException {
		final int port = 444;
		System.out.println("Server waiting for connection on port "+port);
		ServerSocket ss = new ServerSocket(port);
		Socket clientSocket = ss.accept();
		System.out.println("Recieved connection from "+clientSocket.getInetAddress()+" on port "+clientSocket.getPort());
		//create two threads to send and recieve from client
		RecieveFromClientThread recieve = new RecieveFromClientThread(clientSocket);
		Thread thread = new Thread(recieve);
		thread.start();
		SendToClientThread send = new SendToClientThread(clientSocket);
		Thread thread2 = new Thread(send);
		thread2.start();
	}}
class RecieveFromClientThread implements Runnable
{
	Socket clientSocket=null;
	BufferedReader brBufferedReader = null;
	
	public RecieveFromClientThread(Socket clientSocket)
	{
		this.clientSocket = clientSocket;
	}//end constructor
	public void run() {
		try{
		brBufferedReader = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));		
		
		String messageString;
		while(true){
		while((messageString = brBufferedReader.readLine())!= null){//assign message from client to messageString
			if(messageString.equals("EXIT"))
			{
				break;//break to close socket if EXIT
			}
			System.out.println("From Client: " + messageString);//print the message from client
			System.out.println("Please enter something to send back to client..");
		}
		this.clientSocket.close();
		System.exit(0);
	}
		
	}
	catch(Exception ex){System.out.println(ex.getMessage());}
	}
}//end class RecieveFromClientThread
class SendToClientThread implements Runnable
{
	PrintWriter pwPrintWriter;
	Socket clientSock = null;
	
	public SendToClientThread(Socket clientSock)
	{
		this.clientSock = clientSock;
	}
	public void run() {
		try{
		pwPrintWriter =new PrintWriter(new OutputStreamWriter(this.clientSock.getOutputStream()));//get outputstream
		
		while(true)
		{
			String msgToClientString = null;
			BufferedReader input = new BufferedReader(new InputStreamReader(System.in));//get userinput
			
			msgToClientString = input.readLine();//get message to send to client
			
			pwPrintWriter.println(msgToClientString);//send message to client with PrintWriter
			pwPrintWriter.flush();//flush the PrintWriter
			System.out.println("Please enter something to send back to client..");
		}//end while
		}
		catch(Exception ex){System.out.println(ex.getMessage());}	
	}//end run
}//end class SendToClientThread
CLIENT ---
import java.io.*;
import java.net.*;
public class Client {
	public static void main(String[] args)
	{
		try {
			Socket sock = new Socket("localhost",444);
			SendThread sendThread = new SendThread(sock);
			Thread thread = new Thread(sendThread);thread.start();
			RecieveThread recieveThread = new RecieveThread(sock);
			Thread thread2 =new Thread(recieveThread);thread2.start();
		} catch (Exception e) {System.out.println(e.getMessage());} 
	}
}
class RecieveThread implements Runnable
{
	Socket sock=null;
	BufferedReader recieve=null;
	
	public RecieveThread(Socket sock) {
		this.sock = sock;
	}//end constructor
	public void run() {
		try{
		recieve = new BufferedReader(new InputStreamReader(this.sock.getInputStream()));//get inputstream
		String msgRecieved = null;
		while((msgRecieved = recieve.readLine())!= null)
		{
			System.out.println("From Server: " + msgRecieved);
			System.out.println("Please enter something to send to server..");
		}
		}catch(Exception e){System.out.println(e.getMessage());}
	}//end run
}//end class recievethread
class SendThread implements Runnable
{
	Socket sock=null;
	PrintWriter print=null;
	BufferedReader brinput=null;
	
	public SendThread(Socket sock)
	{
		this.sock = sock;
	}//end constructor
	public void run(){
		try{
		if(sock.isConnected())
		{
			System.out.println("Client connected to "+sock.getInetAddress() + " on port "+sock.getPort());
			this.print = new PrintWriter(sock.getOutputStream(), true);	
		while(true){
			System.out.println("Type your message to send to server..type 'EXIT' to exit");
			brinput = new BufferedReader(new InputStreamReader(System.in));
			String msgtoServerString=null;
			msgtoServerString = brinput.readLine();
			this.print.println(msgtoServerString);
			this.print.flush();
		
			if(msgtoServerString.equals("EXIT"))
			break;
			}//end while
		sock.close();}}catch(Exception e){System.out.println(e.getMessage());}
	}//end run method
}//end class
Ho due domande:
1. il metodo ss.accept() restituisce un oggetto di tipo Socket, ma corrisponde alla Socket creata con l'istruzione new Socket(indirizzo, porta) che invia la richiesta al server?
2. nella classe 'SendThread', che viene istanziata nella classe 'Client' passando come parametro la socket che invia la richiesta al server, sono presenti le istruzioni

this.print = new PrintWriter(sock.getOutputStream(), true);
...
this.print.println(msgtoServerString);
questo significa che 'sock' corrisponde al server?

Spero di essere stato chiaro anche se so di essere molto confuso in merito.

Come sempre vi ringrazio in anticipo.

Michele

4 Risposte

  • Re: Chiarimento Socket

    charlesmm ha scritto:


    mi sono battuto in un'applicazione che simula una chat tra un singolo client e un server.
    E' abbastanza pasticciato e mal scritto ....

    charlesmm ha scritto:


    1. il metodo ss.accept() restituisce un oggetto di tipo Socket, ma corrisponde alla Socket creata con l'istruzione new Socket(indirizzo, porta) che invia la richiesta al server?
    No, non è lo stesso oggetto che ha il client (ovviamente, essendo client e server due istanze distinte della JVM, anche se fossero sulla stessa macchina fisica).
    E' comunque un oggetto Socket che è "bindato" (legato) in locale su una porta del server ed ha come "remote" una porta del client.

    charlesmm ha scritto:


    questo significa che 'sock' corrisponde al server?
    Quello è un oggetto Socket che è bindato in locale su una porta del client ed ha come "remote" una porta del server.
  • Re: Chiarimento Socket

    Ciao Andrea,
    quale dei 2 oggetti rappresenta il server, l'oggetto che viene creato dal metodo accept() o quello creato con il costruttore new Socket(hostname,port)?

    Grazie.

    Michele
  • Re: Chiarimento Socket

    charlesmm ha scritto:


    quale dei 2 oggetti rappresenta il server, l'oggetto che viene creato dal metodo accept() o quello creato con il costruttore new Socket(hostname,port)?
    Non è che "rappresenta". Il Socket fornito da accept() consente al server di comunicare con il client.
    E il Socket creato con new Socket("localhost",444) consente al client di connettersi e comunicare con il server.
  • Re: Chiarimento Socket

    Grazie mille Andrea, la situazione adesso è molto più chiara.

    Grazie ancora.

    Michele
Devi accedere o registrarti per scrivere nel forum
4 risposte