Java TCP 套接字编程 - 在服务器上构建大字符串以在客户端上打印

标签 java sockets tcp stringbuilder

<分区>

我正在尝试熟悉套接字编程,并想编写一个程序,让客户端能够进入网站/端口,将该信息传递给服务器,让服务器为所有页面文本运行 HTTP Get,打印它(服务器端),然后将该文本传回客户端进行打印(客户端)。

到目前为止,我能够让它读取给定的网页服务器端并尝试将该页面输入到一个字符串中,但由于某种原因,它会将所述字符串的第一行传回给客户端,仅此而已.我也得到这个错误服务器端:

Exception in thread "main" java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeBytes(Unknown Source)
at assign1.TCPServer15.main(TCPServer15.java:48)

我不是 100% 确定出了什么问题,我已经尝试解决各种问题,这是我第一次尝试做这样的事情,所以我希望得到提示!

这是客户端的代码

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

class TCPWebClient
{
    public static void main(String argv[]) throws Exception
    {
        String sentence;
        String webText;

        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        Socket clientSocket = new Socket("localhost", 6789);
        DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
        BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        System.out.print("Enter a single string in the form: server/port. \nExample: (www.google.com/80)\n");
        sentence = inFromUser.readLine();
        outToServer.writeBytes(sentence + '\n');

        webText = inFromServer.readLine();      
        System.out.println("FROM SERVER:\n" + webText);
        clientSocket.close();
    }
}

还有我的服务器代码:

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

class TCPServer15
{
   public static void main(String argv[]) throws Exception
       {
         String clientSentence;

         ServerSocket welcomeSocket = new ServerSocket(6789);

         while(true)
         {
            Socket connectionSocket = welcomeSocket.accept();
            BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
            DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
            clientSentence = inFromClient.readLine();
            System.out.println("Received: " + clientSentence);

            String [] connectionInfo = clientSentence.split("/");
            Socket webSocket = new Socket(connectionInfo[0], Integer.parseInt(connectionInfo[1]));

            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(webSocket.getOutputStream()))); 
            out.println("GET /index.html HTTP/1.0"); 
            out.println(); 
            out.flush(); 

            BufferedReader inFromWeb = new BufferedReader(new InputStreamReader(webSocket.getInputStream())); 

            String inputLine; 
            StringBuilder stringBuilder = new StringBuilder();

            while ((inputLine = inFromWeb.readLine()) != null) 
            { 
            System.out.println(inputLine); 
            stringBuilder.append(inputLine);
            stringBuilder.append("\n");
            } 

            String finalString = stringBuilder.toString();
            inFromWeb.close(); 

            outToClient.writeBytes(finalString);
         }
      }
}

最佳答案

您在客户端中只阅读了一行。这应该在一个 while 循环中(检查你在与谷歌对话时如何编码你的服务器。客户端应该以相同的方式运行。

我已经修改了你的客户端和服务器 - 片段

服务器

        outToClient.writeBytes(finalString);
        outToClient.flush();
        outToClient.close();
        inFromWeb.close();

客户端

    StringBuilder output = new StringBuilder();
    while ((webText = inFromServer.readLine()) != null) {

        output.append(webText);
        output.append("\n");
    }

    System.out.println("FROM SERVER:\n" + output.toString());

    clientSocket.close();

关于Java TCP 套接字编程 - 在服务器上构建大字符串以在客户端上打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42604704/

相关文章:

java - 通过 HTTP 建立 RMI 隧道的最佳方式

ios - 知道所有回调都已使用 libevent 和 bufferevent_free 运行

c# - 如何使用 TcpClient 类在 WCF 中获取超时异常

swift - 停留在 hasSpaceAvailable 并且无法从 NSInputStream 读取

javascript - 无法从浏览器的本地存储中删除项目

java - 状态模式 : States as Hibernate singleton entities

c - inet_netof() 并返回主机字节顺序

java - 接口(interface)中的同步和异步方法与类中的同步和异步方法?

java - 我被教导不要将大多数方法放在通用 "System"类中,但它们去了哪里?

c++ - 处理多个客户端的单个 TCP/IP 服务器(在 C++ 中)?