【问题标题】:Is it possible to decode bytes on a server which were sent from a client as a byte array?是否可以在服务器上解码从客户端作为字节数组发送的字节?
【发布时间】:2014-02-04 18:47:13
【问题描述】:

我只是想测试通过 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(Unknown Source) 在 java.net.SocketInputStream.read(Unknown Source) 在 java.io.DataInputStream.readFully(Unknown Source) at java.io.DataInputStream.readUTF(未知来源)在 java.io.DataInputStream.readUTF(未知来源)在 ByteClientServer.Server.main(Server.java:21)

【问题讨论】:

    标签: java io socketexception


    【解决方案1】:

    如果你想使用readUTF,那么你需要使用writeUTF。如果你只想写字节,那么你只需要读字节。

    【讨论】:

      【解决方案2】:

      您正在使用默认编码写入字节,然后将其读取为 UTF-8 编码。这就是问题所在。 Here 是 John Skeets 的博客,解释如何调试这些错误和一些陷阱

      【讨论】:

        【解决方案3】:

        我想出了一个简单的解决方法

        客户:

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

        【讨论】:

          猜你喜欢
          • 2012-05-14
          • 1970-01-01
          • 1970-01-01
          • 2011-10-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多