0

私はJavaソケットプログラミングが初めてです。このプログラムにより、TCPサーバーは同時に実行できるマルチスレッドを持つことができます。あるクライアント(同時にファイルを送信する別のクライアントがある)からサーバー側にtxtファイルを送信しようとし、サーバーに「OK」ステータスメッセージをクライアント側に送信するように依頼します。しかし、サーバーはクライアントからファイルを受信できないようで、奇妙なことに、クライアント クラスのメソッドを削除すると、サーバーはクライアントからファイルを受信できるようになります。receiveFile()誰か助けてくれませんか?

サーバークラス

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;


public class ConcurrentServer {

    public static void main(String args[]) throws IOException
    {
      int portNumber = 20020;

      ServerSocket serverSocket = new ServerSocket(portNumber);


      while ( true ) {

        new ServerConnection(serverSocket.accept()).start();
      } 

    }

}

class ServerConnection extends Thread
{
  Socket clientSocket;  

  ServerConnection (Socket clientSocket) throws SocketException
  {
    this.clientSocket = clientSocket;
    setPriority(NORM_PRIORITY - 1);     
  } 


public void run()
{
    try{
        BufferedReader inFromClient = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

        OutputStream outToClient = clientSocket.getOutputStream();

        PrintWriter printOutPut = new PrintWriter(outToClient,true);

        while(inFromClient.ready())
        {
            String request = inFromClient.readLine();
            System.out.println(request);
            System.out.println("test");
        }   
        printOutPut.write("HTTP/1.1 200 OK\nConnection: close\n\n");
        printOutPut.write("<b> Hello sends from Server");


        printOutPut.flush();
        printOutPut.close();

        clientSocket.close();
    }
    catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
        }
}
}

Client.class

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


 public class SmallFileClient {

static String file="test.txt";
static PrintWriter outToServer;
static Socket socket;
public static void main(String[] args) throws IOException
{
    final int PORT=20020;
    String serverHostname = new String("127.0.0.1");

    socket = new Socket(serverHostname, PORT);
    outToServer = new PrintWriter(socket.getOutputStream(),true);

    sendFile();
    receiveFile();

    outToServer.flush();
    outToServer.close();
    socket.close();

}
//read file and send file to server
public static void sendFile() throws IOException
{
    BufferedReader br=new BufferedReader(new FileReader(file));
    try
    {
        String line = br.readLine();
        while(line!=null)
        {
            //send line to server
            outToServer.write(line);
            line=br.readLine();
        }

    }catch (Exception e){System.out.println("!!!!");}

    br.close();
}
//get reply from server and print it out
public static void receiveFile() throws IOException
{
    BufferedReader brComingFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    try
    {
        String inline = brComingFromServer.readLine();
        while(inline!=null)
        {
            System.out.println(inline);
            inline = brComingFromServer.readLine();
        }
    }catch (Exception e){}
}
}
4

1 に答える 1

0

テストを取り除きready()ます。次のように変更します。

while ((line = in.readLine()) != null)
{
    // ...
}

readLine()データが利用可能になるまでブロックします。現在、ブロックせずに読み取ることができるデータがなくなるとすぐに、読み取りループを停止しています。つまり、`!ready()! ストリームの終わりを意味します。そうではありません: Javadoc を参照してください。

于 2013-09-21T07:46:34.930 に答える