ArturAralin
@ArturAralin
Программист, Музыкант

Java Сервер. Как решить проблему с кодировкой?

Доброго времени суток! Возникла такая проблема: отправляю запрос из браузера к своему серверу и получаю в ответ это:
"E TP11
ot oahs:79
oncin epaie
ah-oto:mxae0
cet ethm,plcto/hm+m,plcto/m;=.,mg/ep**q08
srAet oil/. WnosN .;WW4 plWbi/3.6(HM,lk ek)Crm/4014.3 aai573
Acp-noig zpdfaesc
Acp-agae uR,uq08e-Sq06e;=.
Coi:tf=n
"

В чем проблема? Никак не могу понять!

Код сервера:

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


public class Main {
	public static void main(String[] args) {
		ServerSocket server = null; 
		try {
			server = new ServerSocket(7779);
			System.out.println("Server: Start!");
		} catch (IOException e) {
			System.out.println("Server: Port difined!");
			e.printStackTrace();
		}
		
		while (true) {
			StringBuffer sb = new StringBuffer(); //Запрос браузера
			char simbol;
			try {
				Socket clientSocket = server.accept(); //Создаем сокет с клиентом
				InputStream is = clientSocket.getInputStream(); //получаем от него данные
				while(is.read() != -1) { //Записываем посимвольно запрос
					simbol = (char) is.read();
					sb.append(simbol);
				}
				is.close();
				System.out.println(sb.toString()); //выводим в консоль
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
  • Вопрос задан
  • 2577 просмотров
Пригласить эксперта
Ответы на вопрос 2
@kenny4ka
Предположу, что is.read() у вас читает байт, а не символ. А символ может состоять из более чем 1 байта.

Советую вам воспользоваться буфферизированным чтением:

bufferedInput = new BufferedInputStream(is);
byte[] buffer = new byte[1024];    //
int read;
while((read = bufferedInput.read(buffer)) != -1) {
    System.out.println(read);
}
Ответ написан
@bazarnazar
Вот как сделано у меня, и все прекрасно работает(правда с уверенностью могу сказать только про GET запросы)
public class TinyHttpd extends Thread {

    public static Logger log = Logger.getLogger(TinyHttpd.class.getName());

    static StatusController statusController;

    @Inject
    public TinyHttpd(StatusController statusControllerNew) {
        super("TinyHttpd");
        statusController = statusControllerNew;
    }

    private volatile boolean active = true;

    private ServerSocket ss;

    public void deactivate() {
        active = false;
        try {
            ss.close();
        } catch (IOException e) {
            log.error(e);
        }
    }

    public void run() {

        try {
            ss = new ServerSocket();
            SocketAddress address = new InetSocketAddress("0.0.0.0", 8080);
            ss.bind(address);
            log.info("Start TinyHttpd");
            while (active) {
                new TinyHttpdConnection(ss.accept()).start();
                log.debug("new connection");
            }
        } catch (IOException e) {
            log.error(e);
        }
        log.info("Stopping TinyHttpd");
    }
}

class TinyHttpdConnection extends Thread {

    private static int threadNum = 0;

    Socket client;

    TinyHttpdConnection(Socket client) throws SocketException {
        super("TinyHttpdConnection-" + ++threadNum);
        this.client = client;
        setPriority(NORM_PRIORITY - 1);
    }

    public void run() {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    client.getInputStream(), "8859_1"));
            OutputStream out = client.getOutputStream();
            PrintWriter pout = new PrintWriter(new OutputStreamWriter(out,
                    "8859_1"), true);
            String request = in.readLine();
            TinyHttpd.log.debug("Request: " + request);
            StringTokenizer st = new StringTokenizer(request);
            if ((st.countTokens() >= 2) && st.nextToken().equals("GET")) {
                request = st.nextToken();
                //тут логика и анализ токенов
                } else {
                    pout.println("400 Bad Request");
                }
            } else {
                pout.println("400 Bad Request");
            }
            client.close();
        } catch (IOException e) {
            System.out.println("I/O error " + e);
        }
    }
}


Так же обратите внимание на то, что после после socket.accept() создается новый поток. Я бы очень рекомендовал так делать, что бы одновременно все-же могли обрабатываться более одного клиента.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽