Java 是否可以在服务器上解码作为字节数组从客户端发送的字节?

Java 是否可以在服务器上解码作为字节数组从客户端发送的字节?,java,io,socketexception,Java,Io,Socketexception,我只是想测试通过TCP套接字连接发送字节,我知道这并不是真正的目的,但我只是想弄清楚这是否可行 我想做的是: 从客户端上的字符串获取字节 将其作为字节发送到服务器 获取服务器上的字节并将其解码回原始字符串 客户: package ByteClientServer; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.*; publ

我只是想测试通过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();
    }




}
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();
        } 
    }
}
服务器:

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.");
        }
    }
}
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.");
        }
    }
}
它不喜欢服务器上的这一行:

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)


如果要使用
readUTF
,则需要使用
writeUTF
。如果只想写入字节,则只需读取字节。

您正在使用默认编码写入字节,然后将其作为UTF-8编码读取。这就是问题所在。
John Skeets的博客解释了如何调试这些错误和一些陷阱吗?我想出了一个简单的解决方法

客户:

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();
    }




}
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();
        } 
    }
}
服务器:

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.");
        }
    }
}
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.");
        }
    }
}