Ciao a tutti! Premetto che sono nuovo riguardo la programmazione java e ad oggetti. Ho la seguente situazione: ho un server che quando viene contattato dal client genera un thread e una socket e scambia dati con il client. Fin qui tutto ok, pero ora vorrei che quando il client contatta il server, quest'ultimo generi 3 o piu thread ognuno dei quali calcola dei dati e li passa, sempre sulla stessa socket in modo concorrente al client.
Server.java
codice:
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.*;
/**
* This is to help people to write Client server application
* I tried to make it as simple as possible... the client connect to the server
* the client send a String to the server the server returns it in UPPERCASE thats all
*/
public class Server {
// the socket used by the server
private ServerSocket serverSocket;
public int i=0;
// server constructor
Server(int port) {
/* create socket server and wait for connection requests */
try
{
serverSocket = new ServerSocket(port);
System.out.println("Server waiting for client on port " + serverSocket.getLocalPort());
while(true)
{
Socket socket = serverSocket.accept(); // accept connection
System.out.println("New client asked for a connection");
for(i=0; i<3; i++){
TcpThread t = new TcpThread(socket); // make a thread of it
// TcpThread t2 = new TcpThread(socket); // make a thread of it
// TcpThread t3 = new TcpThread(socket); // make a thread of it
System.out.println("Starting thread " + i);
t.start();
// t2.start();
// t3.start();
}
}
}
catch (IOException e) {
System.out.println("Exception on new ServerSocket: " + e);
}
}
// you must "run" server to have the server run as a console application
public static void main(String[] arg) {
// start server on port 1500
new Server(1500);
}
/** One instance of this thread will run for each client */
class TcpThread extends Thread {
// the socket where to listen/talk
Socket socket;
DataInputStream Sinput;
DataOutputStream Soutput;
TcpThread(Socket socket) {
this.socket = socket;
}
synchronized public void run() {
/* Creating both Data Stream */
System.out.println("Thread " + i + " trying to create Object Input/Output Streams");
try
{
// create output first
Soutput = new DataOutputStream(socket.getOutputStream());
// Soutput.flush();
Sinput = new DataInputStream(socket.getInputStream());
}
catch (IOException e) {
System.out.println("Exception creating new Input/output Streams: " + e);
return;
}
System.out.println("Thread " + i + " waiting for a String from the Client");
// read a String (which is an object)
try {
// creazione vettore di interi
double[] vettore = new double[10];
for(int i=0; i<10; i++){
vettore[i] = Math.random()*Integer.MAX_VALUE;
}
// individuazione del valore var1
double var1=0;
for(int i=0; i<10; i++){
if(i==0)
var1=vettore[i];
if(var1>vettore[i])
var1=vettore[i];
}
// mi faccio inviare il var2 dal professor
double var2 = (double) Sinput.readDouble();
// var1 = var1.toUpperCase();
System.out.println("Ricevuto var2 = " + var2);
// se il mio var1 è > del suo var2 allora glielo invio
if(var1>var2){
System.out.println("var1 = " + var1 + " > var2 = " + var2 + " => INVIO\n\n");
Soutput.writeDouble(var1);
// Soutput.flush();
}else{
System.out.println("var1 = " + var1 + " < var2 = " + var2 + " => NON INVIO\n\n");
}
}
catch (IOException e) {
System.out.println("Exception reading/writing Streams: " + e);
return;
}
// will surely not happen with a String
// catch (ClassNotFoundException o) {
// }
finally {
try {
Soutput.close();
Sinput.close();
}
catch (Exception e) {
}
}
}
}
}
Client.java
codice:
import java.util.*;
import java.lang.*;
import java.io.*;
import java.net.*;
public class Client {
public static double var2=0;
DataInputStream Sinput; // to read the socker
DataOutputStream Soutput; // to write on the socket
Socket socket;
// Constructor connection receiving a socket number
Client(int port) {
// we use "localhost" as host name, the server is on the same machine
// but you can put the "real" server name or IP address
try {
socket = new Socket("localhost", port);
}
catch(Exception e) {
System.out.println("Error connectiong to server:" + e);
return;
}
System.out.println("Connection accepted " + socket.getInetAddress() + ":" + socket.getPort());
/* Creating both Data Stream */
try
{
Sinput = new DataInputStream(socket.getInputStream());
Soutput = new DataOutputStream(socket.getOutputStream());
}
catch (IOException e) {
System.out.println("Exception creating new Input/output Streams: " + e);
return;
}
// now that I have my connection
// String test = "aBcDeFgHiJkLmNoPqRsTuVwXyZ";
// send the string to the server
System.out.println("Client sending \"" + var2 + "\" to server");
try {
Soutput.writeDouble(var2);
// Soutput.flush();
}
catch(IOException e) {
System.out.println("Error writing to the socket: " + e);
return;
}
// read back the answer from the server
double response;
try {
response = (double) Sinput.readDouble();
System.out.println("Read back from server: " + response);
var2=response;
}
catch(Exception e) {
System.out.println("Problem reading back from server: " + e);
}
try{
Sinput.close();
Soutput.close();
}
catch(Exception e) {}
}
public static void main(String[] arg) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String sceltaString;
int scelta=0;
do{
System.out.println("\nCosa vuoi fare?");
System.out.println("1) Contattare i Telescopi. ( var2 attuale = " + var2 + " )");
System.out.println("2) Terminare l'esperimento.");
System.out.print("Scelta: ");
System.out.flush();
sceltaString = in.readLine();
scelta = Integer.parseInt(sceltaString);
switch (scelta){
case 1:
new Client(1500);
break;
case 2:
System.exit(0);
default:
System.out.println("\n!! Scegli il numero 1 o il numero 2 !! \n");
}
}while(scelta!=2);
}
}
Grazi a chiunque possa aiutarmi!