[quote=ViniGodoy]Então, com o tempo vc cria métodos utilitários para facilitar o trabalho. Eu, por exemplo, costumo a mandar um int com o tamanho da String antes de todas as Strings. Mas daí, já mando o tamanho em caracteres (o size() da String). Isso facilita muito a leitura. E já crio um método readString na minha classe para ler o int seguido dos chars e retornar a String direto:
public String readString(DataInputStream in) {
int tamanho = in.nextInt();
StringBuilder out = new StringBuilder(tamanho);
for (int i = 0; i < tamanho; i++) {
out.append(in.readChar());
}
return out.toString();
}
Mas claro, isso porque em meus protocolos, eu sempre incluo o tamanho da String antes do texto. Outra possibilidade é fazer um método que leia até um terminador, por exemplo, o \0 (isso é útil se você estiver comunicando com C - onde no caso, cada caracter é ASCII e não unicode e só ocupa 1 byte):
public String readCString(DataInputStream in) {
int tamanho = in.nextInt();
StringBuilder out = new StringBuilder();
char ch = (char)in.nextByte();
while (ch != '\0') {
out.append(ch);
ch = (char)in.nextByte();
}
return out.toString();
}
[/quote]
Verdade, java usa unicode…
Mas achei que ascII também usava 8 bits - 2 bytes
Viny, posso tirar mais uma dúvida ??
Estou serializando o arrayList, mas eu devo enviar como Object Output ou byte Output???
// public void encodeAndSendUsersList(ArrayList<Usuarios> listUsers)
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package Control;
import AuxManager.Usuarios;
import Manager.InitializeServer;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.ObjectOutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.Serializable;
/**
*
* @author André
*/
public class ServerMessenger implements Runnable {
private Socket socket;
public ArrayList<Usuarios> listaUsuarios;
public InitializeServer main;
public ServerMessenger(Socket s, InitializeServer m) {
socket = s;
main = m;
Usuarios usuario = new Usuarios("" + socket.getInetAddress().getHostName(), socket, "" + socket.getInetAddress());
main.listaUsuarios.add(usuario);
}
@Override
public void run() {
try {
DataInputStream dis = new DataInputStream(socket.getInputStream());
int tamanho = dis.readInt(); // Como é Read Int, acredito que ja leia 4 Bytes, correto?
int tipoMensagem = dis.read(); // Tipo de mensagem
System.out.println(tamanho);
System.out.println(tipoMensagem);
if (tipoMensagem == 0)// È uma Mensagem
{
String input = socket.getInetAddress() + "Said : ";
for (int i = 1; i < tamanho; i = i + 2) {
input = input + dis.readChar();
//System.out.println("" + input);
}
decodeMessage(input);
}
} catch (Exception e) {
System.out.println(e.getMessage());
//e.printStackTrace();
}
}
public void decodeMessage(String input) {
try {
//Devolve a Informação que o usuário digitou, para todos os clientes
for (int i = 0; i < main.listaUsuarios.size(); i++) {
Socket aux = main.listaUsuarios.get(i).getSocket();
PrintWriter pwAux = new PrintWriter(aux.getOutputStream());
pwAux.println(input);
pwAux.flush();
}//Fim da Devolução de Informação
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public void encodeAndSendUsersList(ArrayList<Usuarios> listUsers) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//DataOutputStream dos = new DataOutputStream(bos);
//dos.writeByte(1);//1 == Array List!!!
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeByte(1);
oos.writeObject(listUsers);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}