无法从服务器向客户端发送字节数组,能够从客户端发送到服务器

时间:2014-06-26 10:08:32

标签: java sockets network-programming

我有一项任务要做到这一点。 创建一个客户端和服务器套接字交互,它接受字节数据并转换字符串中服务器接收的字节数据数据,并通过成功/不成功的数据会话确认发回响应,因为传递的数据将采用修复数据长度格式所以验证应该在服务器端完成。

至于例如

有些字段可以发送到服务器,例如

字段1 - 数字 字段2 - 字符串 字段3为浮动数,即108.50

从byte转换为String后: 152 |任何消息| 108.50

在字节中它会是这样的,

10101 | 1001010010000000011000000000 | 1110111011

我已尝试过以下程序来执行此操作

Server.java

public class Server extends Thread
{
    private ServerSocket serverSocket;

    public Server(int port) throws IOException
    {
        serverSocket = new ServerSocket(port);
        //serverSocket.setSoTimeout(100000);
    }

    public void run()
    {
        while(true)
        {
            try
            {
                Socket server = serverSocket.accept();
                byte Message[]=null;
                DataInputStream in =
                        new DataInputStream(server.getInputStream());

                ByteArrayOutputStream buffer = new ByteArrayOutputStream();

                int nRead;
                byte[] data = new byte[16384];
                while ((nRead = in.read(data, 0, data.length)) != -1) {
                    buffer.write(data, 0, nRead);
                }
                                System.out.println("On this line"); //This doesnt get printed
                buffer.flush();

                data= buffer.toByteArray();

                System.out.println(data);
                String convertmsg = new String(data);
                System.out.println("Msg converted "+convertmsg);
                DataOutputStream out =
                        new DataOutputStream(server.getOutputStream());
                System.out.println("below dataoutputstream");
                out.write("Success".getBytes());
                server.close();
            }catch(SocketTimeoutException s)
            {
                System.out.println("Socket timed out!");
                break;
            }catch(IOException e)
            {
                e.printStackTrace();
                break;
            }
        }
    }
    public static void main(String [] args)
    {
        int port = 4003;
        try
        {
            Thread t = new Server(port);
            t.start();
        }catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

客户

public class Client {
    public static void main(String args[]) throws IOException
    {
        int userinput =1;
        while(userinput==1)
        {
            String serverName = "192.168.0.8";
            int port = 4003;
            try
            {
                System.out.println("Connecting to " + serverName
                        + " on port " + port);
                Socket client = new Socket(serverName, port);
                System.out.println("Just connected to "
                        + client.getRemoteSocketAddress());
                OutputStream outToServer = client.getOutputStream();
                DataOutputStream out =
                        new DataOutputStream(outToServer);
                System.out.println("above out.wirte()");
                out.write("any msg".getBytes());


                InputStream inFromServer = client.getInputStream();
                DataInputStream in =
                        new DataInputStream(inFromServer);
                ByteArrayOutputStream buffer = new ByteArrayOutputStream();

                int nRead;

                System.out.println("converting array "+in);
                byte[] data = IOUtils.toByteArray(in);


                System.out.println(data);//This line doesnt get printed
                //System.out.println("Server says " + in.readUTF());
                client.close();
            }catch(IOException e)
            { 
                e.printStackTrace();
            }
            System.out.println("Enter userinput ");
            DataInputStream dis = new DataInputStream(System.in);
            String s = dis.readLine();
            userinput = Integer.parseInt(s);
        }
    }

}

如果我以字节为单位从客户端向服务器发送数据,它会读取并打印出来。然后行#34;输入userinput"如果用户输入' 1'该计划继续。 但问题是上面给出的这个程序。如果我尝试从服务器发送数据,说明"成功"(意味着数据已经成功地从字节转换为字符串),那么程序就会卡住并且光标不会低于注释中的行#34;这行不打印"。没有打印错误,也没有程序终止。我是套接字编程的新手,并不了解网络。 任何帮助都将得到真正的赞赏。

1 个答案:

答案 0 :(得分:0)

您正在读取输入直到流结束,但是对等方没有关闭连接,因此流的结尾永远不会到达。

我建议你读写行,或者使用writeUTF()和readUTF()。