0

私は単純なクライアント/サーバー プログラムを書いていますが、私の問題は、サーバーがクライアントからの応答を待たず、IOException. サーバーが実行しようとすると例外が発生します

line = bufferStringFromClientReader.readLine();

私は何を間違っていますか?

サーバー:

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

public class Server {

    private final static String filePath = "dataFile.txt";

    public static void main(String[] arg) {
    ServerSocket serverSocket = null;
    Socket serverConnection = null;
    OutputStream outServerStream = null;
    InputStream inServerStream = null;
    PrintWriter printWriterDataSender = null;
    BufferedReader bufferDataFromFileReader = null;
    BufferedReader bufferStringFromClientReader = null;
    BufferedWriter bufferedStringToFileWriter = null;
    String line;

    try {
        serverSocket = new ServerSocket(8868);
    } catch (IOException e) {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można utowrzyć gniazda serwera");
    }

    try {
        serverConnection = serverSocket.accept();
    } catch (IOException e) {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można nawiązać połączenia z klientem");
    }

    try {
        inServerStream = serverConnection.getInputStream();
    } catch (IOException e) {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wejścia");
    }

    try {
        outServerStream = serverConnection.getOutputStream();
        bufferDataFromFileReader = new BufferedReader(new FileReader(filePath));
        bufferedStringToFileWriter = new BufferedWriter(new FileWriter(filePath, true));
    } catch (IOException e) {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wyjścia");
    }

    while (true) {

        try {
                printWriterDataSender = new PrintWriter(outServerStream);
                line = bufferDataFromFileReader.readLine();    
                printWriterDataSender.println(line);
                printWriterDataSender.flush();
                printWriterDataSender.close();;

                bufferStringFromClientReader = new BufferedReader(new InputStreamReader(inServerStream));

                System.out.println("get answer from client");

                line = bufferStringFromClientReader.readLine();

                bufferedStringToFileWriter.write(line);
                bufferedStringToFileWriter.close();

        } catch (Exception e) {

            System.out.println("utracono polaczenie");
            try {
                serverConnection = serverSocket.accept();
            } catch (IOException e1) {
                throw new RuntimeException("Nieobsłużony wyjątek - nie można nawiązać połączenia z klientem");
            }

            try {
                inServerStream = serverConnection.getInputStream();
            } catch (IOException e2) {
                throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wejścia");
            }

            try {
                outServerStream = serverConnection.getOutputStream();
            } catch (IOException e3) {
                throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wyjścia");
            }
        } 
    }
}}

クライアント:

import java.awt.EventQueue;
import java.io.*;
import java.util.*;
import java.net.*;
import javax.swing.*;


public class Client {

public static void main(String[] args) 
{

     Socket clientSocket = null;
     InputStream clientInputStream = null;
     OutputStream clientOutputStream = null;
     BufferedReader clientBufferReader = null; 

    try
    {
        clientSocket = new Socket("localhost", 8868);
    }
    catch(UnknownHostException e)
    {
        throw new RuntimeException("Nieobsłużony wyjątek - nieznana nazwa hosta");
    }
    catch(IOException e)
    {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można utowrzyć gniazda klienta");
    }

    try
    {
        clientInputStream = clientSocket.getInputStream();
    }
    catch(IOException e)
    {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wejścia");
    }

    try
    {
        clientOutputStream = clientSocket.getOutputStream();
    }
    catch(IOException e)
    {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można pobrać strumienia wyjścia");
    }

    try
    { 
        clientBufferReader = new BufferedReader(new InputStreamReader(clientInputStream)); 
    }
    catch(Exception e)
    {
        throw new RuntimeException("Nieobsłużony wyjątek - nie można utworzyć bufora odczytu danych od serwera");             
    }

    try
    { 
        String tmpString = clientBufferReader.readLine();
        System.out.println(tmpString);



        PrintWriter answer = new PrintWriter(clientOutputStream);

        answer.println("ans \n");
        answer.close();


    }
    catch(Exception e)
    {
        throw new RuntimeException("Nieobsłużony wyjątek - odpowiedz");             
    }  
}
4

2 に答える 2

1

PrintWriter問題は、サーバーを時期尚早に閉じることです。これを行うと、ソケットの からデータが読み取られなくなりますInputStream

printWriterDataSender.close();

すべての操作が完了した後にfinallyこれをブロックに移動すると、問題が解決します。この後に then が発生することを確認します。Socket IOsocket.close

printWriterDataSender.close();
bufferStringFromClientReader.close();
serverConnection.close(); // last call

また、これが完了したら、おそらく単一の読み取りを実行したいと思うでしょう。現在、whileループで読み取りと書き込みを行っていますが、クライアントは一度だけ書き込みます。これにより、Socket読み取り例外が発生します。

参照:ソケットからの読み取りとソケットへの書き込み

于 2013-04-13T16:45:04.563 に答える
0

クライアントでautoflush動作PrintWriter answer = new PrintWriter(clientOutputStream, true );を有効にします。クライアントとサーバーの両方がこの機能を使用できます。フラッシュは、コード サーバー側で.pw.flush()

SOでより明確で読みやすくするために、次のようにコードを書くことができます.これはあなたのクライアントとサーバーが書き直されたもので、うまくいきます!

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

public class Client {

   static final CountDownLatch cdl = new CountDownLatch( 1 );

   static class Server extends Thread {

      @Override
      public void run() {
         try( ServerSocket serverSocket = new ServerSocket( 8868 )) {
            cdl.countDown();
            Socket         serverConnection = serverSocket.accept();
            OutputStream   outServerStream  = serverConnection.getOutputStream();
            InputStream    inServerStream   = serverConnection.getInputStream();
            PrintWriter    dataSender       = new PrintWriter( outServerStream, true );
            BufferedReader clientReader     = new BufferedReader( new InputStreamReader( inServerStream ));
            dataSender.println( "Hello, " );
            System.out.println( "SERVER: " + clientReader.readLine());
            serverConnection.close();
         }
         catch( IOException x ) {
            x.printStackTrace();
         }
      }
   }

   public static void main( String[] args ) throws Exception {
      new Server().start();
      cdl.await( 1, TimeUnit.DAYS );

      Socket         clientSocket       = new Socket( "localhost", 8868 );
      InputStream    clientInputStream  = clientSocket.getInputStream();
      OutputStream   clientOutputStream = clientSocket.getOutputStream();
      PrintWriter    answer             = new PrintWriter( clientOutputStream, true );
      BufferedReader clientBufferReader = new BufferedReader( new InputStreamReader( clientInputStream ));
      System.out.println( "CLIENT: " + clientBufferReader.readLine());
      answer.println( "world!" );
      clientSocket.close();
   }
}

出力:

CLIENT: Hello, 
SERVER: world!
于 2013-04-13T16:28:41.153 に答える