JogoDaVelha em JAVA com conexão servidor Socket

Galera eu tô com uma dificuldade imensa a implementar um servidor para rodar como multijogador(Servidor e 2 clientes) onde o servidor fica responsável pelo “monitoramento” de enviar para o outro cliente a jogada do primeiro e definir se alguém venceu, enviando a mensagem aos dois.

segue abaixo os códigos feitos até agora:

package jogo;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class JogoDaVelha extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private final int jogador_1 = 1;
	private final int jogador_2 = 2;
	
	private int jogadorVez = jogador_1;
	
	private int rodadas = 0;
	
	JPanel pTela= new JPanel(new GridLayout(3, 3, 10, 10));
	
	Bloco[] blocos = new Bloco[9];
	
	//image
	ImageIcon iconCirculo = new ImageIcon(getClass().getResource("CIRCLE.png"));
	ImageIcon iconX = new ImageIcon(getClass().getResource("X.png"));
	//
				
	JLabel lInformacao = new JLabel("Jogador" + jogador_1);
	
	public JogoDaVelha() {
		configurarTela();
		configurarJanela();
	}
	
	public void configurarTela() {
		add(BorderLayout.CENTER,pTela);
		add(BorderLayout.NORTH,lInformacao);
		pTela.setBackground(Color.BLACK);
		lInformacao.setFont(new Font("Arial",Font.BOLD,35));
		lInformacao.setForeground(new Color(0, 0, 205));
		lInformacao.setHorizontalAlignment(SwingConstants.CENTER);
		
		for(int i=0; i<9; i++) {
			Bloco bloco = new Bloco();
			blocos[i] = bloco;
			pTela.add(bloco);
		}
	}
	
	public void mudarVez() {
		if (jogadorVez == 1) {
			jogadorVez = 2;
			lInformacao.setText("Jogador 2");
			lInformacao.setForeground(Color.RED);
		} else {
			jogadorVez = 1;
			lInformacao.setText("Jogador 1");
			lInformacao.setForeground(new Color(0, 0, 205));
		}
	}
	
	public boolean testarVitoria(int player) {
		if(blocos[0].quem == player && blocos[1].quem == player && blocos[2].quem == player) {
			return true;
		}
		if(blocos[3].quem == player && blocos[4].quem == player && blocos[5].quem == player) {
			return true;
		}
		if(blocos[6].quem == player && blocos[7].quem == player && blocos[8].quem == player) {
			return true;
		}
		if(blocos[0].quem == player && blocos[3].quem == player && blocos[6].quem == player) {
			return true;
		}
		if(blocos[1].quem == player && blocos[4].quem == player && blocos[7].quem == player) {
			return true;
		}
		if(blocos[2].quem == player && blocos[5].quem == player && blocos[8].quem == player) {
			return true;
		}
		if(blocos[0].quem == player && blocos[4].quem == player && blocos[8].quem == player) {
			return true;
		}
		if(blocos[2].quem == player && blocos[4].quem == player && blocos[6].quem == player) {
			return true;
		}
		return false;
	}
	
	public void BlockButton(int block) {
		//desbloqueando botoes
		if (block == 1) {
			for (int i=0; i<9; i++) {
				blocos[i].setEnabled(true);
			}
		}
		
		//bloqueando botoes
		if (block == 2) {
			for (int i=0; i<9; i++) {
				blocos[i].setEnabled(false);
			}
		}
	}
	

	public void configurarJanela() {
		setTitle("Jogo da Velha");
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(600, 600);
		setLocationRelativeTo(null);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new JogoDaVelha();
	}
	
	public class Bloco extends JButton {
		private static final long serialVersionUID = 1L;
		
		int quem = 0;
		public Bloco() {
			setBackground(Color.WHITE);
			addActionListener(e->{
				if (quem==0) {
					if(jogadorVez == jogador_1) {
						setIcon(iconCirculo);
						quem = jogador_1;
					} else {
						setIcon(iconX);
						quem = jogador_2;
					}
					if(testarVitoria(quem)) {
						JOptionPane.showMessageDialog(null,"Jogador "+quem+" Venceu!");
						System.exit(0);
					}
					rodadas++;
					if(rodadas == 9) {
						JOptionPane.showMessageDialog(null,"Deu velha. Ninguém venceu!");
						System.exit(0);
					}
					mudarVez();
				}
			});
		}
	}
}

o código de servidor:

package servidor;

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Servidor {
	public static void main(String[] args) throws IOException {
		
		ServerSocket socketServidor = new ServerSocket(5555);
		System.out.println("Servidor criado.");
				
		Socket socket = socketServidor.accept();
		System.out.println("Nova conexão com o cliente "
					+ socket.getInetAddress().getHostAddress());
				
		
				
		socket.close();
		socketServidor.close();
		}
}

o código de cliente:

package jogo;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Cliente {
	private static JogoDaVelha jogo = new JogoDaVelha();
	
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("Conectando com servidor...");
		
		Socket socketCliente = new Socket("127.0.0.1", 5555);
		System.out.println("Cliente conectado");
	}
}

tô procurando entender como eu vou fazer para que quando um dos clientes clicar em botão a mesma ação vai ser enviada para o outro cliente pelo servidor fazendo assim parecer “Online”, já tenho os código feitos como de mudarVez e de blockButton pra bloquear botões para o jogador que não estiver na vez. (cada cliente terá seu próprio tabuleiro iniciado ao executar o código de Cliente.)
Ajuda ae

alguém sabe ?

Olá @albert-smps , cara encontrei esse site aqui que contem um exemplo basico de transformar em maiuscula quando enviando um texto para o servidor e um outro com o jogo tic-tac-toe (que é o jogo da velha) segue Tic-Tac-Toe

Obs.: Ele deve estar usando a versão do Java 9 na implementação por isso você ira encontrar algumas palavras reservadas próprias dessa versão como o “var” se você não tiver usando a versão 9 use o tipo da classe ao invés de “var”