首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BufferedWriter不刷新

BufferedWriter不刷新
EN

Stack Overflow用户
提问于 2012-08-05 23:25:40
回答 4查看 3.3K关注 0票数 1

我有以下问题……

代码语言:javascript
复制
            try 
            {
                clientInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                clientOutput = new BufferedWriter(new PrintWriter(clientSocket.getOutputStream()));

                while(true)
                { 
                    String clientRequest = "";
                    String tempStr = clientInput.readLine();

                    while(tempStr != null && !tempStr.equals("null"))
                    {
                        System.out.println(tempStr);
                        clientRequest += tempStr + " ";
                        tempStr = clientInput.readLine();
                    }

                    //Parse Request
                    ArrayList<String> tokenArray = parseRequest(clientRequest);

                    Calendar c = Calendar.getInstance();

                    switch(tokenArray.get(0))
                    {
                        case "GET": 
                        {
                            clientOutput.write("HTTP/1.1 200 OK\r\n");
                            clientOutput.write("Date: " + c.getDisplayName(0, Calendar.LONG, Locale.UK).toString() + "\r\n");
                            clientOutput.write("Server: Java HTTP Server v1.0\r\n");
                            clientOutput.flush();
                            break;
                            //Write File
                        }
                        default: 
                        {
                            clientOutput.write("500\r\n");
                            clientOutput.flush();
                        }
                    }
                } 
            }

每件事都工作得很好-直到clientOutput.write("HTTP.......行,客户端只是一直在等待……我试着在写完每一篇成功的文章后都冲马桶,但是什么都没有……但这是奇怪的部分-如果我在代码进入while循环之前写入并刷新,那么在case "GET":中的写入就能完美地工作......即

代码会一直执行到

代码语言:javascript
复制
                            clientOutput.flush();
                            break;
                            //Write File

代码语言:javascript
复制
              try 
             {
                clientInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                clientOutput = new BufferedWriter(new PrintWriter(clientSocket.getOutputStream()));

                clientOutput.write("HTTP/1.1 200 OK\r\n");
                clientOutput.flush();

                while(true)
                { 
                    String clientRequest = "";
                    String tempStr = clientInput.readLine();

                    while(tempStr != null && !tempStr.equals("null"))
                    {
                        System.out.println(tempStr);
                        clientRequest += tempStr + " ";
                        tempStr = clientInput.readLine();
                    }

                    //Parse Request
                    ArrayList<String> tokenArray = parseRequest(clientRequest);

                    Calendar c = Calendar.getInstance();

                    switch(tokenArray.get(0))
                    {
                        case "GET": 
                        {
                            clientOutput.write("HTTP/1.1 200 OK\r\n");
                            clientOutput.write("Date: " + c.getDisplayName(0, Calendar.LONG, Locale.UK).toString() + "\r\n");
                            clientOutput.write("Server: Java HTTP Server v1.0\r\n");
                            clientOutput.flush();
                            break;
                            //Write File
                        }

以下是客户端的代码

代码语言:javascript
复制
        Socket s = new Socket("localhost", 1337);

        BufferedReader fromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter toServer = new BufferedWriter(new PrintWriter(s.getOutputStream()));

        toServer.write("GET index.html HTTP/1.1\r\n");
        toServer.write("HOST: 127.0.0.1\r\n");
        toServer.write("Connection: close\r\n");
        toServer.write("\r\n");
        toServer.write("null\r\n");
        toServer.flush();   

        while(true)
        {
            String ss = fromServer.readLine();
            if(ss != null && !ss.equals("null"))
                System.out.println(ss);
        }

服务器类: Strydom_A_201103578_P03

代码语言:javascript
复制
public class Strydom_A_201103578_P03
{
    Thread[] threadArray = new Thread[5];
    int ClientCount = 0;

    public Strydom_A_201103578_P03() throws ClientSizeExceededException 
    {
        ServerSocket httpServer = null;
    try 
    {
        httpServer = new ServerSocket(1337);
    } 
    catch (IOException ex) 
    {
        Logger.getLogger(Strydom_A_201103578_P03.class.getName()).log(Level.SEVERE, null, ex);
    }

    while(true)
    {
        try
        {
            //Wait for connection

            Socket clientSocket = httpServer.accept();

            if(ClientCount < 5)
            {
                threadArray[ClientCount] = new Thread(new clientHandler(clientSocket));
                threadArray[ClientCount].start();
                ClientCount++;
            }
            else
            {
                throw new ClientSizeExceededException();
            }

        }
        catch(IOException ex)
        {

        }
        finally
        {

        }
    }
}

class clientHandler implements Runnable
{
    Socket clientSocket;
    public clientHandler(Socket clientSocket) 
    {
        this.clientSocket = clientSocket;
    }

    @Override
    public void run() 
    {
        BufferedReader clientInput = null;
        BufferedWriter clientOutput = null;

            try 
            {
                clientInput = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                clientOutput = new BufferedWriter(new PrintWriter(clientSocket.getOutputStream()));

                clientOutput.write(" ");
                clientOutput.flush();

                while(true)
                { 
                    String clientRequest = "";
                    String tempStr = clientInput.readLine();

                    while(tempStr != null && !tempStr.equals("null"))
                    {
                        System.out.println(tempStr);
                        clientRequest += tempStr + " ";
                        tempStr = clientInput.readLine();
                    }

                    //Parse Request
                    ArrayList<String> tokenArray = parseRequest(clientRequest);

                    Calendar c = Calendar.getInstance();

                    switch(tokenArray.get(0))
                    {
                        case "GET": 
                        {
                            clientOutput.write("HTTP/1.1 200 OK\r\n");
                            clientOutput.write("Date: " + c.getDisplayName(0, Calendar.LONG, Locale.UK).toString() + "\r\n");
                            clientOutput.write("Server: Java HTTP Server v1.0\r\n");
                            clientOutput.flush();
                            break;
                            //Write File
                        }
                        default: 
                        {
                            clientOutput.write("500\r\n");
                            clientOutput.flush();
                        }
                    }
                } 
            }
            catch (IOException ex) 
            {
                Logger.getLogger(Strydom_A_201103578_P03.class.getName()).log(Level.SEVERE, null, ex);
            } 
            finally 
            {
                try 
                {
                    clientInput.close();
                    clientOutput.close();
                } 
                catch (IOException ex) 
                {
                    Logger.getLogger(Strydom_A_201103578_P03.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
    }

    private ArrayList<String> parseRequest(String tempStr) 
    {
        StringTokenizer httpTokens = new StringTokenizer(tempStr, " ");
        ArrayList<String> tokens = new ArrayList<>();

        while(httpTokens.hasMoreTokens())
            tokens.add(httpTokens.nextToken());

        return tokens;
    }
}


public static void main(String[] args) throws ClientSizeExceededException 
{
    new Strydom_A_201103578_P03();
}

}

代码语言:javascript
复制
public class TestClient 
{

public TestClient() 
{
    try 
    {
        Socket s = new Socket("localhost", 1337);

        BufferedReader fromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
        BufferedWriter toServer = new BufferedWriter(new PrintWriter(s.getOutputStream()));

        toServer.write("GET index.html HTTP/1.1\r\n");
        toServer.write("HOST: 127.0.0.1\r\n");
        toServer.write("Connection: close\r\n");
        toServer.write("\r\n");
        toServer.write("null\r\n");
        toServer.flush();   

        while(true)
        {
            String ss = fromServer.readLine();
            if(ss != null && !ss.equals("null"))
                System.out.println(ss);
        }

    } 
    catch (UnknownHostException ex) 
    {
        Logger.getLogger(TestClient.class.getName()).log(Level.SEVERE, null, ex);
    } 
    catch (IOException ex) 
    {
        Logger.getLogger(TestClient.class.getName()).log(Level.SEVERE, null, ex);
    }

}



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

}

客户端类: TestClient

创建一个项目(或2个)并运行文件

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-06 06:50:15

这里的问题是PrintWriter。它接受异常。将其更改为OutputStreamWriter。然后,您将看到任何正在被吞噬的异常。通常,您应该避免在网络上使用PrintWritersPrintOutputStreams。它们包含您需要了解的异常。

票数 2
EN

Stack Overflow用户

发布于 2012-08-05 23:34:50

您需要更改内部的while循环,以查找客户端请求的结尾:

代码语言:javascript
复制
while(tempStr != null && !tempStr.equals("null"))

至:

代码语言:javascript
复制
while(tempStr != null && !tempStr.equals("null") && !tempStr.equals(""))

客户端在发送请求后不会断开连接(导致null)。它将给您一个空行来指示其请求的结束。

为什么立即返回响应头是有效的?也许客户端只是读取200,然后(最终)断开连接?因此,当您读取客户端的请求时,它将结束,您最终会得到一个null。

编辑:

所以运行你的代码,它对我来说工作得很好。客户端和服务器都在发送和接收请求和响应。但是,服务器永远不会断开连接(客户端包含Connection: close标头),并且客户端继续在readLine()上阻塞。毫不奇怪,当我在服务器端建立连接后立即包含write()flush()时,除了在客户端看到两次HTTP/1.1 200 OK之外,没有任何变化。也许您所需要做的就是在clientSocket的末尾关闭finally{}块中的try/catch{}

票数 0
EN

Stack Overflow用户

发布于 2012-08-06 02:12:26

因此,为了进一步结束我现在的痛苦--这是我最终做的……

我将服务器和客户端的读取器从BufferedReader/Writer更改为DataInputstream/OutputStream...现在它完美地工作了-!感谢所有人

艾登

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11817636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档