Servidor receber/enviar mensagem

Olá, gostaria de saber como faria para um servidor ser capaz de receber e enviar mensagem, tentei criar um inputStream, mas não tenho de onde receber as informações para esse input. Teria que criar um socket no cliente? Ou há um jeito simples de fazer isso?

Código do cliente que eu estou tentando fazer:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class ClientTransfer {
	public static void main(String[] args) {

		//Criando Classe cliente para receber arquivo
		ClientTransfer cliente = new ClientTransfer();

		//Solicitando arquivo
		cliente.getFileFromServeR();
	}

	private void getFileFromServeR() {
		Socket sockServer = null;
		FileOutputStream fos = null;
		InputStream is = null;
		OutputStream os = null;
		String ip = "192.168.1.104";
		

		try {
			// Criando conexão com o servidor
			System.out.println("Conectando com Servidor porta 13267 no ip: " + ip);
			sockServer = new Socket(ip, 13267);
			os = sockServer.getOutputStream();
			is = sockServer.getInputStream();
			Scanner le = new Scanner(System.in);
			
			System.out.println("Digite qual arquivo você deseja requirir do servidor");
			String dirArquivo = le.nextLine();
			
			System.out.println("Digite o diretório onde você deseja salvar o arquivo");
			String dirLocal = le.nextLine();
			le.close();
			
			os.write(dirArquivo.getBytes());
			os.flush();

			// Cria arquivo local no cliente
			fos = new FileOutputStream(new File(dirLocal));
			System.out.println("Arquivo Local Criado " + dirLocal);
			
			// Prepara variaveis para transferencia
			byte[] cbuffer = new byte[10240];
			int bytesRead;

			// Copia conteudo do canal
			System.out.println("Recebendo arquivo...");
			
			
			
			
			while ((bytesRead = is.read(cbuffer)) != -1) {
				fos.write(cbuffer, 0, bytesRead);
				fos.flush();
			}
			
			
			
			
			System.out.println("Arquivo recebido!");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (sockServer != null) {
				try {
					sockServer.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			if (fos != null) {
				try {
					fos.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}

			if (is != null) {
				try {
					is.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
			if (os != null) {
				try {
					os.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		}

	}
}

Código do servidor que estou tentando fazer:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

/**@author Lucas iorio - http://www.byiorio.com
 * 
 * @author Lucas iorio - http://www.byiorio.com
 *
 */
public class ServerTransfer {
	public static void main(String[] args) {

		// Criando servidor
		ServerTransfer server = new ServerTransfer();

		// Aguardar conexao de cliente para transferia
		server.waitForClient();
		
	}

	public void waitForClient() {
		// Checa se a transferencia foi completada com sucesso
		OutputStream socketOut = null;
		InputStream socketIn = null;
		ServerSocket servsock = null;
		FileInputStream fileIn = null;

		try {
			// Abrindo porta para conexao de clients
			servsock = new ServerSocket(13267);
			System.out.println("Porta de conexao aberta 13267");

			// Cliente conectado
			Socket sock = servsock.accept();
			System.out.println("Conexao recebida pelo cliente");
			
			socketIn = sock.getInputStream();
			byte[] inbuffer = new byte[1024];
			System.out.println("Aguardando o endereço do arquivo requerido por o cliente");
			int tam;
			while((tam = socketIn.read(inbuffer)) != -1)
			{
				socketIn.read(inbuffer, 0, tam);
			}
			String dirArquivo = inbuffer.toString();

			// Criando tamanho de leitura
			byte[] cbuffer = new byte[10240];
			int bytesRead;

			// Criando arquivo que sera transferido pelo servidor
			File file = new File(dirArquivo);
			
			fileIn = new FileInputStream(file);
			System.out.println("Lendo arquivo...");
			
			// Criando canal de transferencia
			socketOut = sock.getOutputStream();

			// Lendo arquivo criado e enviado para o canal de transferencia
			System.out.println("Enviando Arquivo...");
			Date dataAdmissao = new java.util.Date();
			long inicio = dataAdmissao.getTime();
			while ((bytesRead = fileIn.read(cbuffer)) != -1) { //Aloca no espaço em memória de cbuffer e retorna o total que foi alocado
				socketOut.write(cbuffer, 0, bytesRead);
				socketOut.flush();
			}
			Date dataDemissao = new java.util.Date();
			long fim = dataDemissao.getTime();
			long segundos = (fim - inicio) / 1000;
			long bytespersegundos = (file.length() / 1024) / segundos;
			System.out.println(bytespersegundos + " KBPS");

			System.out.println("Arquivo Enviado!");
		} catch (Exception e) {
			// Mostra erro no console
			e.printStackTrace();
		} finally {
			if (socketOut != null) {
				try {
					socketOut.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (servsock != null) {
				try {
					servsock.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			if (fileIn != null) {
				try {
					fileIn.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

Você precisa fazer tão baixo nível assim?

Você não pode falar por REST?

Amigo, esse resto é nativo do java? E ele permite enviar arquivos? Outra coisa, a transmissão do socket de java é por TCP?