Przesyłanie danych do serwera działa bez problemu. Niestety nie umiem zrobić tak, żeby serwer wysyłał coś do klienta. Ani odczytanych danych z klawiatury, ani po prostu zwykłej zmiennej String nie chce mi wysłać. Macie jakiś pomysł?
EDIT:
Ok, poradziłem sobie i z serwera mogę wysyłać wiadomości do klienta. Niestety problem jest taki, że serwer odbiera tylko jedną wiadomość, a potem musi coś wysłać klientowi żeby odebrać kolejną. Można temu jakoś zaradzić?
package network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
import smTest.Data;
public class Client {
public static void main(String[] args) {
int port = 54321;
String ipAdress = "192.168.1.10";
try {
Socket socket = new Socket(ipAdress, port);
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
Scanner sc = new Scanner(System.in);
String str;
String strIn=null;
Scanner in = new Scanner(socket.getInputStream());
while(sc.hasNext()){
str = sc.nextLine();
out.println(str);
out.flush();
if(!(strIn = in.nextLine()).equals("")){
System.out.println(strIn);
strIn = null;
}
if(str.equals("exit")) break;
}
ObjectOutputStream ous = new ObjectOutputStream(socket.getOutputStream());
ous.writeObject(new Data());
sc.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package network;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Server {
public static void main(String[] args) {
int port = 12345;
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port);
ExecutorService exec = Executors.newCachedThreadPool();
while(true){
//oczekiwanie na zgłoszenie klienta
Socket socket = serverSocket.accept();
//tworzenie wątku dla danego połączenia i uruchomienie go
exec.execute(new ServerThread(socket).getFt());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package network;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import smTest.Data;
public class ServerThread implements Callable<String>{
Socket mySocket;
FutureTask<String> ft;
public ServerThread(Socket mySocket){
this.mySocket = mySocket;
ft = new FutureTask<String>(this);
}
public FutureTask<String> getFt() {
return ft;
}
@Override
public String call(){
String txt = mySocket.getInetAddress().getHostName();
try {
PrintWriter out = new PrintWriter(new OutputStreamWriter(mySocket.getOutputStream()));
Scanner sc = new Scanner(System.in);
String strOut = null;
//odbieranie i drukowanie danych
BufferedReader in = new BufferedReader(new InputStreamReader(mySocket.getInputStream()));
String str;
Data data = null;
while (!(str = in.readLine()).equals("exit")) {
System.out.println("Wiadomość od klienta: " + str);
strOut = sc.nextLine();
out.println("Wiadomość od SERWERA: " + strOut);
out.flush();
if(str.equals("exit")) break;
}
ObjectInputStream ois = new ObjectInputStream(mySocket.getInputStream());
data = (Data)ois.readObject();
System.out.println("koniec pracy");
System.out.println(data.getCurrentTemperature());
mySocket.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return "Zrobione! Socket: " + txt + " is closed.";
}
}