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
.
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.