Доброго времени суток!
Есть клиент-сервер, когда клиент подключается к серверу открываются фреймы, 1-ый с отображением значения таймера, 2-ой с кнопками для таймера. Соответственно есть код таймера, как связать клиентов так, что бы когда к серверу подключался новый клиент, он видел текущее значение таймера ?
Код клиента:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class keks_client {
/**
*
* @param args
* @throws InterruptedException
* @throws IOException
* @throws NumberFormatException
*/
public static void main(String[] args) throws InterruptedException, NumberFormatException, IOException {
int serverPort = 0;
String address = null;
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System. in ));
System.out.println("Type address of the server: ");
address = keyboard.readLine();
System.out.println("Type port of the server: ");
serverPort = Integer.parseInt(keyboard.readLine());
try(Socket socket = new Socket(address, serverPort);
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
DataOutputStream oos = new DataOutputStream(socket.getOutputStream());
DataInputStream ois = new DataInputStream(socket.getInputStream()); )
{
System.out.println("Client connected to socket.");
System.out.println();
System.out.println("Client writing channel = oos & reading channel = ois initialized.");
while(!socket.isOutputShutdown()){
if(br.ready()){
System.out.println("Client start writing in channel...");
Thread.sleep(1000);
String clientCommand = br.readLine();
oos.writeUTF(clientCommand);
oos.flush();
System.out.println("Client sent message " + clientCommand + " to server.");
Thread.sleep(1000);
if(clientCommand.equalsIgnoreCase("quit")){
System.out.println("Client kill connections");
Thread.sleep(2000);
if(ois.read() > -1) {
System.out.println("reading...");
String in = ois.readUTF();
System.out.println(in);
}
break;
}
System.out.println("Client sent message & start waiting for data from server...");
Thread.sleep(2000);
if(ois.read() > -1) {
System.out.println("reading...");
String in = ois.readUTF();
System.out.println(in);
}
}
}
System.out.println("Closing connections & channels on clentSide - DONE.");
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Код сервера:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author mercenery
*
*/
public class keks_fabrics{
static ExecutorService executeIt = Executors.newFixedThreadPool(2);
/**
* @param args
* @throws IOException
* @throws NumberFormatException
*/
public static void main(String[] args) throws NumberFormatException, IOException {
int serverPort = 0;
BufferedReader keyboard = new BufferedReader(new InputStreamReader(System. in ));
System.out.println("Type port of the server: ");
serverPort = Integer.parseInt(keyboard.readLine());
try (ServerSocket server = new ServerSocket(serverPort);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
System.out.println("Server socket created, command console reader for listen to server commands");
while (!server.isClosed()) {
if (br.ready()) {
System.out.println("Main Server found any messages in channel, let's look at them.");
String serverCommand = br.readLine();
if
(serverCommand.equalsIgnoreCase("start"));
System.out.println("start stopwatch...");
Stopwatch Stopwatch = new Stopwatch();
Stopwatch.setVisible(true);
{
}
}
Socket client = server.accept();
executeIt.execute(new MonoThreadClientHandler(client));
System.out.print("Connection accepted.");
}
executeIt.shutdown();
} catch (IOException e) {
e.printStackTrace();
}
}}
Подскажите, как это возможно реализовать?
UPD
Код Stopwatch:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Stopwatch implements ActionListener{
JButton button = new JButton("knopka");
JFrame frame_timer = new JFrame();
JFrame frame = new JFrame();
JButton startButton = new JButton("start");
JButton resetButton = new JButton("reset");
JLabel timeLabel = new JLabel();
int elapsedTime = 0;
int seconds =0;
int minutes =0;
int hours=0;
boolean started = false;
String seconds_string = String.format("%02d", seconds);
String minutes_string = String.format("%02d", minutes);
String hours_string = String.format("%02d", hours);
Timer timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
elapsedTime=elapsedTime+1000;
hours = (elapsedTime/3600000);
minutes = (elapsedTime/60000)%60;
seconds = (elapsedTime/1000)%60;
seconds_string = String.format("%02d", seconds);
minutes_string = String.format("%02d", minutes);
hours_string = String.format("%02d", hours);
timeLabel.setText(hours_string+":"+minutes_string+":"+seconds_string);
}
});
public Stopwatch(){
timeLabel.setText(hours_string+"-"+minutes_string+"-"+seconds_string);
timeLabel.setBounds(100,100,200,100);
timeLabel.setFont(new Font("Verdana",Font.PLAIN,35));
timeLabel.setBorder(BorderFactory.createBevelBorder(1));
timeLabel.setOpaque(true);
timeLabel.setHorizontalAlignment(JTextField.CENTER);
startButton.setBounds(100,100,200,50);
startButton.setFont(new Font("Calibri",Font.PLAIN,20));
startButton.setFocusable(false);
startButton.addActionListener(this);
resetButton.setBounds(100,150,200,50);
resetButton.setFont(new Font("Calibri",Font.PLAIN,20));
resetButton.setFocusable(false);
resetButton.addActionListener(this);
frame.add(startButton);
frame.add(resetButton);
frame.add(timeLabel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(420,420);
frame.setLayout(null);
frame.setVisible(true);
frame_timer.add(timeLabel);
frame_timer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame_timer.setSize(420,420);
frame_timer.setLayout(null);
frame_timer.add(timeLabel);
frame_timer.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==startButton) {
start();
if(started==false) {
started=true;
startButton.setText("stop");
start();
}
else {
started=false;
startButton.setText("continue");
stop();
}
}
if(e.getSource()==resetButton){
started=false;
startButton.setText("start");
reset(); }
}
void start() {
timer.start();
}
void stop() {
timer.stop();
}
void reset() {
timer.stop();
elapsedTime=0;
seconds=0;
minutes=0;
hours=0;
seconds_string = String.format("%02d", seconds);
minutes_string = String.format("%02d", minutes);
hours_string = String.format("%02d", hours);
timeLabel.setText(hours_string+":"+minutes_string+":"+seconds_string);
}
public void setVisible(boolean b) {
// TODO Auto-generated method stub
}
public static Object getDelay() {
// TODO Auto-generated method stub
return null;
}
}