Método getOutputStream dando erro

fala pessoal, estou desenvolvendo uma aplicação onde eu envio String para o servidor e la eu dicido o que fazer com ela,mas eu queri enviar uma imagem do servidor para o cliente,mas está dando erro na minha Stream de saida,eu posso fazer esses dois procedimentos usando o mesmo socket ??

OutputStream os = s.getOutputStream();

por que ?? sera pq eu estou usando o mesmo socket que recebe a conexao??

teria como eu criar um servidor que também e cliente ??

Obirgado…

Posta o código. Qual o tipo do objeto s? Se for um ServerSocket, eles não tem OutputStream.

     ServerSocket server = new ServerSocket(5200);

Socket s = new Socket();

    s = server.accept();
    FileInputStream file = new FileInputStream("C:\\Users\\Jonatas\\Pictures\\loira.jpg");

    OutputStream os = s.getOutputStream();

    //Cria uma Stream de byte
    //Cria uma Stream de byte de saida
    //cria um array de  byte
    b = new byte[10000];
    //le o que vem da inputStream(a imagem)e joga dentro do array de byte
    i = file.read(b);
    //envia a imagem em forma de byte para a maquina cliente.

    os.write(b, 0, i);

}

Beleza, e qual o erro que aparece?

ele da um nullpointerException na linha OutputStream o = socket.getOutPutStream(), eu acho que é porque é a mesma socket que eu faço a conexão com o servidor, não sei pq …

  29  FileInputStream file = new FileInputStream("C:\\Users\\Jonatas\\Pictures\\seila.jpg");

   30 OutputStream os = socket.getOutputStream();

Exception in thread “main” java.lang.NullPointerException
at br.com.envioArquivo.enviarArquivo.metodoEnviarPrint(enviarArquivo.java:30)

Aonde você tá inicializando s?

ServerSocket server;
private Socket socket;
byte[] b;
int i;

na classe para os objetos ficarem públicos é eu consiguir acessar pelos métodos.

ServerSocket server;
private Socket socket;
byte[] b;
int i;

Quando você chama o método accept do ServerSocket, pelo jeito que você configurou, o programa trava até algum cliente conectar. É garantido que quando ele retorna, você recebe o Socket do primeiro cliente que conectar. Não consegui entender porque deu NPE naquela linha.

Por via das dúvidas, coloca um System.out.println(socket == null) antes de chamar getOutputStream() e responde se printou true ou false.

retono true

Não consegui entender porque está null só olhando para esse código. Posta o resto pra gente dar uma olhada. Pra mim é isso que você está fazendo, e dá certo:

import java.net.ServerSocket;
import java.net.Socket;
import java.io.OutputStream;
import java.io.IOException;

public class Main {
  public static void main (String[] args) throws IOException {
    ServerSocket server = new ServerSocket(5200);
    Socket client = server.accept();

    OutputStream os = client.getOutputStream();
    os.write(new byte[]{'O', 'i', '\n'});
    os.flush();
  }
}

Servidor
package br.com.envioArquivo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import novo.Cliente;

public class Servidor{

ServerSocket server;
private Socket socket;
byte[] b;
int i;

public void metodoEnviarPrint() throws IOException {


    FileInputStream file = new FileInputStream("C:\\Users\\Jonatas\\Pictures\\loira.jpg");
    
    System.out.print(socket == null);
    OutputStream os = socket.getOutputStream();


    //Cria uma Stream de byte
    //Cria uma Stream de byte de saida
    //cria um array de  byte
    b = new byte[10000];
    //le o que vem da inputStream(a imagem)e joga dentro do array de byte
    i = file.read(b);
    //envia a imagem em forma de byte para a maquina cliente.

    os.write(b, 0, i);

}

public void metodoDesligar() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("cmd /c ");

}

public void metodoEnviarMensagem() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("cmd /c ");

}

public void metodoAbrirSite() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("cmd /c ");

}

public void metodoNotas() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("c:\\windows\\notepad.exe");

}

public void criarArquivo(String nomeArquivo) throws IOException {

    FileWriter file = new FileWriter("Arquivo.txt");
    file.write(nomeArquivo);

    file.close();

}

void metodoConexao() throws IOException, Exception {
    server = new ServerSocket(8000);
    //Criar um Objeto serverSocket que aguarda conexao na porta 8000
    //Cria um Objeto do tipo socket
    socket = new Socket();
    //espera algum cliente se conectar ao serveSocket é ao se conectar ele envia a conexao para o socket onde agente pode trabalhar com a mesma.
    socket = server.accept();

    while (true) {

        InputStream in = socket.getInputStream();

        byte[] buffer = new byte[100000];
        int entrada = in.read(buffer);
        String comandoEnviado = new String(buffer, 0, entrada);
        if (comandoEnviado.equals("1")) {
            enviarArquivo e = new enviarArquivo();
            e.criarArquivo("Arquivo");
            comandoEnviado = "";
        } else if (comandoEnviado.equals("2")) {
            enviarArquivo e = new enviarArquivo();

            e.metodoEnviarPrint();

            comandoEnviado = "";
        } else if (comandoEnviado.equals("3")) {
            enviarArquivo e = new enviarArquivo();

            e.metodoNotas();
            comandoEnviado = "";
        } else if (comandoEnviado.equals("4")) {
            enviarArquivo e = new enviarArquivo();
            e.metodoDesligar();
            comandoEnviado = "";
        } else if (comandoEnviado.equals("5")) {
            enviarArquivo e = new enviarArquivo();
            e.metodoAbrirSite();
            comandoEnviado = "";
        }

    }
}

}

Cliente

package novo;

import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

public class Cliente extends Thread {

static Socket s;
static OutputStream o;
String ip = "";
int porta = 0;
String mensagem = "";
static InputStream in = null;

public static void main(String[] args) throws IOException {

    Cliente c = new Cliente();
    c.metodoConectar("localhost", 8000);
    c.start();
}

public static void enviarComando(String comando) throws IOException {

    o = s.getOutputStream();

    o.write(comando.getBytes());

}

public void metodoConectar(String ip, int porta) {

    this.ip = ip;
    this.porta = porta;

    try {

        s = new Socket(ip, this.porta);

    } catch (IOException ex) {

        JOptionPane.showMessageDialog(null, "Metodo Conectar Error" + ex.getMessage());
    }

}

public void metodoChat(String mensagem) throws IOException {

    OutputStream os = s.getOutputStream();

    this.mensagem = mensagem;

    os.write(mensagem.getBytes());

}

public static void receberArquivo() throws IOException {

 

  

        in = s.getInputStream();
  

        byte[] buffer = new byte[10000];

        int t = 0;
        t = in.read(buffer);
    

        FileOutputStream f = null;
        f = new FileOutputStream("sandrabae.jpg");
        System.out.println("Arquivo Criado");
        f.write(buffer, 0, t);
    
}
}
Socket s = new Socket(); // pra que está instanciando este Socket
s = server.accept();     // se aqui você mata ele e obtém aquele que realmente deseja?

Posta o código completo da classe enviarArquivo

/*

  • To change this license header, choose License Headers in Project Properties.
  • To change this template file, choose Tools | Templates
  • and open the template in the editor.
    */
    package br.com.envioArquivo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import novo.Cliente;

public class enviarArquivo {

ServerSocket server;
private Socket socket;
byte[] b;
int i;
OutputStream os;
InputStream in;

private void metodoEnviarPrint() throws IOException {

    FileInputStream file = new FileInputStream("C:\\Users\\Jonatas\\Pictures\\loira.jpg");

    System.out.print(socket == null);

    //Cria uma Stream de byte
    //Cria uma Stream de byte de saida
    //cria um array de  byte
    b = new byte[10000];
    //le o que vem da inputStream(a imagem)e joga dentro do array de byte
    i = file.read(b);
    //envia a imagem em forma de byte para a maquina cliente.

    os.write(b, 0, i);
    os.flush();
    file.close();
    os.close();

}

public void metodoDesligar() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("cmd /c ");

}

public void metodoEnviarMensagem() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("cmd /c ");

}

public void metodoAbrirSite() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("cmd /c ");

}

public void metodoNotas() throws Exception {

    //Comandos co = new Comandos();
    Runtime.getRuntime().exec("c:\\windows\\notepad.exe");

}

public void criarArquivo(String nomeArquivo) throws IOException {

    FileWriter file = new FileWriter("Arquivo.txt");
    file.write(nomeArquivo);

    file.close();

}

public void metodoConexao() throws IOException, Exception {
    server = new ServerSocket(8000);

    //Criar um Objeto serverSocket que aguarda conexao na porta 8000
    //Cria um Objeto do tipo socket
    socket = new Socket();
    //espera algum cliente se conectar ao serveSocket é ao se conectar ele envia a conexao para o socket onde agente pode trabalhar com a mesma.
    socket = server.accept();

    while (true) {
        in = socket.getInputStream();
        os = socket.getOutputStream();

        byte[] buffer = new byte[100000];
        int entrada = in.read(buffer);
        String comandoEnviado = new String(buffer, 0, entrada);
        if (comandoEnviado.equals("1")) {
            
            enviarArquivo e = new enviarArquivo();
            e.criarArquivo("Arquivo");
            
            comandoEnviado = "";
        } else if (comandoEnviado.equals("2")) {
            enviarArquivo e = new enviarArquivo();

            e.metodoEnviarPrint();

            comandoEnviado = "";
        } else if (comandoEnviado.equals("3")) {
            enviarArquivo e = new enviarArquivo();

            e.metodoNotas();
            comandoEnviado = "";
        } else if (comandoEnviado.equals("4")) {
            enviarArquivo e = new enviarArquivo();
            e.metodoDesligar();
            comandoEnviado = "";
        } else if (comandoEnviado.equals("5")) {
            enviarArquivo e = new enviarArquivo();
            e.metodoAbrirSite();
            comandoEnviado = "";
        }

    }

}

}

Porque você sempre faz um new Socket() antes de fazer um accept?

Porque você instancia novamente a classe enviarArquivo no método metodoConexao()?

Comece a usar a convenção de código Java ao escrever seus códigos.