Можно ли декодировать байты на сервере, которые были отправлены клиентом в виде массива байтов?

Я просто пытаюсь проверить отправку байтов через соединение TCP-сокета, я знаю, что на самом деле это не предназначалось для этого, но я просто пытаюсь выяснить, возможно ли это или нет.

что я пытаюсь сделать:

  • получить байты из строки на клиенте

  • отправил его как байты на сервер

  • получить байты на сервере и декодировать их обратно в исходную строку

Клиент:

package ByteClientServer;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;

public class Client {


    String hostAddress = "localhost";
    int port = 1010;


    public Client()
    {
        try {

            Socket socket = new Socket(hostAddress, port);

            String test = "hello"; //dycrypt bytes from this string on server side

            byte[] byteArray = test.getBytes();

            OutputStream out = socket.getOutputStream(); 
            DataOutputStream dos = new DataOutputStream(out);

            dos.write(byteArray);

        } 
        catch (UnknownHostException e) 
        {
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }


    public static void main(String[] args)
    {
        new Client();
    }




}

Сервер:

package ByteClientServer;

import java.io.*;
import java.net.*;


public class Server {

    public static void main(String[] args) 
    {
        try
        {                       
            ServerSocket server = new ServerSocket(1010);
            server.setSoTimeout(0);

            Socket connectionToClient = server.accept();
            InputStream is = connectionToClient.getInputStream();
            DataInputStream dis = new DataInputStream(is);


            byte[] data = dis.readUTF().getBytes();

            //dis.readFully(data, 0, data.length);

            String s = new String(data);

            System.out.println(s);


        }
        catch(IOException e)
        {
            e.printStackTrace();
            //System.err.println("Server was terminated.");
        }
    }
}

ему не нравится эта строка на сервере:

byte[] data = dis.readUTF().getBytes();

и выдает исключение:

java.net.SocketException: сброс соединения на java.net.SocketInputStream.read(неизвестный источник) на java.net.SocketInputStream.read(неизвестный источник) на java.io.DataInputStream.readFully(неизвестный источник) на java.io.DataInputStream .readUTF(неизвестный источник) в java.io.DataInputStream.readUTF(неизвестный источник) в ByteClientServer.Server.main(Server.java:21)


person shellcoder    schedule 04.02.2014    source источник


Ответы (3)


Если вы хотите использовать readUTF, вам нужно использовать writeUTF. если вы хотите просто писать байты, вам нужно читать только байты.

person jtahlborn    schedule 04.02.2014

Вы пишете байты с кодировкой по умолчанию, а затем читаете их как кодировку UTF-8. Вот в чем проблема. здесь блог Джона Скитса, в котором объясняется, как отлаживать эти ошибки и некоторые подводные камни.

person Dhana Krishnasamy    schedule 04.02.2014

Я придумал простой обходной путь

Клиент:

import java.io.*;
import java.net.*;

public class Client {


    public static void main(String[] args)
    {

        String hostAddress = "localhost";
        int port = 8080;

        Socket socket = null;


        String test = "hello"; //decode bytes from this string on the server

        byte[] byteArray = test.getBytes();


        try 
        {
            socket = new Socket(hostAddress, port);
            OutputStream out = socket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(out);

            dos.write(byteArray, 0, byteArray.length);
        } 
        catch (IOException e) 
        {
            e.printStackTrace();
        } 
    }
}

Сервер:

import java.io.*;
import java.net.*;


public class Server {

    public static void main(String[] args) throws SocketException 
    {
        try
        {                       
            ServerSocket server = new ServerSocket(8080);
            server.setSoTimeout(0);

            Socket connectionToClient = server.accept();
            InputStream is = connectionToClient.getInputStream();
            DataInputStream dis = new DataInputStream(is);

            int buffersize = connectionToClient.getReceiveBufferSize();

            byte[] bytes = new byte[buffersize];


            if(dis.read(bytes) > 0)
            {
                String s = new String(bytes);
                System.out.print(s);
            }   


            dis.close();
            server.close();
        }
        catch(IOException e)
        {       
            e.printStackTrace();
            System.err.println("Server was terminated.");
        }
    }
}
person shellcoder    schedule 21.02.2014