0

Javaプログラムを使用してサーバーにデータを読み書きしようとしています。コンソールを使用してデータを書き込んでいます。サーバーにデータを正常に書き込むことはできますが、サーバーから送信されたデータを読み取ろうとすると問題が発生します。

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


public class EMSSocketConnection {



    public static void main(String[] args) throws Exception {

        createSocket();
    }

    private static void sendMessage(DataOutputStream out) throws Exception
    {
        try 
        {

            BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
            String userOutput;
            while ((userOutput = stdIn.readLine()) != null)
            {
                out.writeBytes(userOutput);
                out.write('\n');
            }
            out.flush();

        }
        catch(Exception ex)
        {
            System.out.println(ex.getStackTrace());

        }
        finally
        {
            out.close();
        }
    }


    private static void readResponse(DataInputStream in) throws Exception
    {
        try
        {
            byte[] data = new byte[1024];
            in.readFully(data);
            System.out.println(data);


        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());

        }
        finally
        {
            in.close();
        }
    }

    private static void createSocket()
    {

        try
        {
            int port = 2345;
            InetAddress address = InetAddress.getByName("192.100.100.129");
            final Socket client = new Socket(address, port);
            final DataOutputStream out = new DataOutputStream(client.getOutputStream());
            final DataInputStream in = new DataInputStream(client.getInputStream());

            System.out.println("Successfully Connected");



            new Thread() {
                public void run() {
                    synchronized(client)
                    {
                        try {
                            while(true)
                            {
                            sendMessage(out);
                            readResponse(in);
                            }
                        }
                        catch (Exception ex)
                        {
                            System.out.println(ex.getMessage());
                        }
                    }
                }
            }.start();
        }
        catch(Exception ex)
        {
            ex.getStackTrace();
        }
    }

}

サーバーからデータを正常に読み取る方法を教えてください。

4

1 に答える 1

2

サーバーは出力に 1024 バイトを書き込んでいますか? そうでない場合は、コード

byte[] data = new byte[1024];
in.readFully(data);

ブロックして無期限に待機します。

はるかに優れたイディオムは、次のようにすることです。

byte [] data = new byte[in.available()];
in.readFully(data);

ストリームから意のままに読み取るだけで、期待どおりのデータが得られると想定することはできません。ストリームは IO の遅延とバッファリングの影響を受けるため、特にネットワーク IO を扱う場合は、これに注意する必要があります。

于 2012-04-04T10:16:19.573 に答える