0

了解しました。ソケットからデータを受信し、ソケットにデータを送信する必要があるプログラムを設定しようとしています。ソケットのクライアント側に特定のデータを送信させてから、サーバー側に特定のデータを送信させる方法に困惑しています。これが私が現在持っているものです。私は今のところクライアント側で本当に迷っているので、それは私のサーバー側だけです。

さらに評価するために、次のようにしたいと思いますが、ソケットのクライアント側を書き込むために何を調査すればよいかわかりません。サーバー側でコードを書き直す必要がある場合は、 ? さらに評価するには

package sockets;
import java.net.*;
import java.io.*;

public class SocketMain {
    private int port = 0;
    public ServerSocket socket;
    public Socket clientSock;

    public SocketMain() {
        init();
    }

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

    private void init() {
        try { 
            socket = new ServerSocket(port);
            System.out.println("Server started, bound to port: "+port);
            clientSock = socket.accept();
            File directory = new File("./Storage/");
            if (!directory.exists()) {
                directory.mkdirs();
            }
            File file = new File(directory + "/Store.dat");
            if (!file.exists()) {
                file.createNewFile();
            }
            DataInputStream in = new DataInputStream(clientSock.getInputStream());  
            FileWriter fw = new FileWriter(file);
            BufferedWriter bw = new BufferedWriter(fw);
            String line;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
                bw.write(line+"\n");
                bw.flush();
                bw.close();
            }
            socket.close();
            clientSock.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
4

2 に答える 2

5

あなたが現在持っているものについて:

私の目に飛び込んだ最初のことは、このループでした:

while ((line = in.readLine()) != null) {
    System.out.println(line);
    bw.write(line+"\n");
    bw.flush();
    bw.close(); // <- Problem
}

行を書くたびにライターを閉じます。さて、州の文書としてWriter.close()

ストリームを閉じて、最初にフラッシュします。ストリームが閉じられると、さらにwrite()またはflush()を呼び出すと、IOExceptionがスローされます。以前に閉じたストリームを閉じても効果はありません。

IOException最初の行の後のすべての行に対してsを取得する必要があります。ただし、例外をキャッチしているため、プログラムはクラッシュしません。


次に、を使用DataInputStreamしてクライアントから読み取りますが、を使用して書き込みますBufferedWriter。前者がそのドキュメントで述べているように:

データ入力ストリームを使用すると、アプリケーションは、マシンに依存しない方法で、基になる入力ストリームからプリミティブJavaデータ型を読み取ることができます。アプリケーションは、データ出力ストリームを使用してデータを書き込み、後でデータ入力ストリームで読み取ることができます。

このクラスには、boolean、char、intなど、考えられるプリミティブデータ型の複数のメソッドが含まれています。しかし、DataInputStream.readLine()-methodについては、次のように明確に述べられています。

非推奨このメソッドは、バイトを文字に適切に変換しません。 JDK 1.1以降、テキスト行を読み取るための推奨される方法は、 BufferedReader.readLine()メソッドを使用することです。

したがって、文字列を読み取るには、を使用する必要がありますBufferedReader


あなたがまだ持っていないものについて:

ソケットを介した通信は、「質問と回答」に基づいて確立されます。ワークフローは次のようになります。

  1. クライアントが接続を開きます
  2. サーバーは接続を受け入れます
  3. クライアントが何かを要求します(server-socketsを使用OutputStream
  4. サーバーはリクエストを読み取ります(client-socketsを使用InputStream
  5. サーバーの回答(client-socketsを使用OutputStream
  6. クライアントは回答を読み取ります(server-socketsを使用InputStream
  7. 必要に応じて、手順3〜6を繰り返します。
  8. 接続が閉じられます(クライアント、サーバー、またはその両方によって)。
于 2012-10-22T22:05:36.983 に答える
0

私はあなたのコードに明らかに悪いことは何も見ていません:

DataInputStream in = new DataInputStream(clientSock.getInputStream());  
while ((line = in.readLine()) != null) {

DataInputStream.getLine()非推奨です-使用する必要がありますBufferedReader.getLine()

DataInputStreamクラスを使用して行を読み取るプログラムは、次の形式のコードを置き換えることにより、BufferedReaderクラスを使用するように変換できます。

DataInputStream d = new DataInputStream(in);

と:

BufferedReader d  = new BufferedReader(new InputStreamReader(in));
于 2012-10-22T21:46:35.497 に答える