Java 服务器-客户端 readLine() 方法

2024-05-20

我有一个客户端类和一个服务器类。 如果客户端向服务器发送消息,服务器会将响应发送回客户端,然后客户端将打印它收到的所有消息。

例如,

如果客户端向服务器发送“A”,则服务器将向客户端发送响应 “1111”。所以我在客户端类中使用 readLine() 从服务器读取消息,然后客户端在控制台中打印“1111”。

如果客户端向服务器发送“B”,则服务器将向客户端发送响应 “2222\n 3333”。所以客户端的预期打印输出是:

"2222"

"3333"

因此,从服务器到客户端的响应消息可能有 1 行或 2 行,具体取决于从客户端发送到服务器的消息。

我的问题是如何使用 readLine() 读取从服务器发送到客户端的消息。更具体地说,如果我使用以下代码,

String messageFromServer;
while(( messageFromServer = inputStreamFromServer.readLine()) != null) {
    println(messageFromServer);
}

它只会打印第一行,即使我继续从客户端向服务器发送消息,也不会打印其他任何内容,因为 readLine() 一旦读取了第一行就会停止。

update:更具体地说,我正在客户端类中寻找一些方法来一次从服务器读取包含 1 行或多行的消息。我想知道如果我不想更改从服务器发送到客户端的消息的格式,是否有任何方法可以在客户端执行此操作。

update 2为了让我的问题更清楚,我将在下面放置一些示例代码:

这是服务器:

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

public class Server {
 public static void main(String[] args) throws IOException {

  ServerSocket serverSocket = null;
  try {
    serverSocket = new ServerSocket(1234);
} catch (IOException e) {
    System.err.println("Could not listen on port: 1234.");
    System.exit(1);
}

Socket clientSocket = null;
try {
    clientSocket = serverSocket.accept();
} catch (IOException e) {
    System.err.println("Accept failed.");
}
 System.out.println("Connected");


PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

String textFromClient =null;
String textToClient =null;
textFromClient = in.readLine(); // read the text from client
if( textFromClient.equals("A")){
   textToClient = "1111";
}else if ( textFromClient.equals("B")){
   textToClient = "2222\r\n3333";
}


out.print(textToClient + "\r\n");  // send the response to client
 out.flush();
 out.close();
 in.close();
 clientSocket.close();
 serverSocket.close();
 }
}

客户端:

public class Client {
public static void main(String[] args) throws IOException {

    Socket socket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
    try {
        socket = new Socket("localhost", 1234);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host");
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection");
    }
    System.out.println("Connected");

    String textToServer;

    while((textToServer = read.readLine())!=null){
        out.print(textToServer + "\r\n" );  // send to server
        out.flush();

        String messageFromServer =null;
        while(( messageFromServer = textToServer=in.readLine()) != null){
            System.out.println(messageFromServer);
        }
    }
    out.close();
    in.close();
    read.close();
    socket.close();
}

private static void debug(String msg)
{
    System.out.println("Client: " + msg);
}
 }

您不需要更改服务器发送的数据的格式,并且 readLine() 应该可以工作,但我怀疑服务器在写入响应后没有刷新或关闭 OutputStream,这可能可以解释事情。
对 readLine() 的调用是否挂起?您控制服务器代码吗?如果是这样,你可以包括它吗?

修改后的课程如我相信您所期望的那样工作:

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

public class ClientServerTest2
{

    public static void main(String[] args) throws Exception
    {
        Thread serverThread = new Thread(new Server());
        serverThread.start();
        Thread clientThread = new Thread(new Client());
        clientThread.start();

        serverThread.join();
        clientThread.join();
    }

    private static class Server implements Runnable
    {
        @Override
        public void run()
        {
            ServerSocket serverSocket = null;
            try
            {
                serverSocket = new ServerSocket(1234);

                Socket clientSocket = null;
                clientSocket = serverSocket.accept();
                debug("Connected");

                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                String textFromClient = null;
                String textToClient = null;
                textFromClient = in.readLine(); // read the text from client
                debug("Read '" + textFromClient + "'");
                if ("A".equals(textFromClient))
                {
                    textToClient = "1111";
                }
                else if ("B".equals(textFromClient))
                {
                    textToClient = "2222\r\n3333";
                }

                debug("Writing '" + textToClient + "'");
                out.print(textToClient + "\r\n"); // send the response to client
                out.flush();
                out.close();
                in.close();
                clientSocket.close();
                serverSocket.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

        }

        private static void debug(String msg)
        {
            System.out.println("Server: " + msg);
        }
    }

    private static class Client implements Runnable
    {

        @Override
        public void run()
        {
            Socket socket = null;
            PrintWriter out = null;
            BufferedReader in = null;
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
            try
            {
                socket = new Socket("localhost", 1234);
                out = new PrintWriter(socket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                debug("Connected");

                String textToServer;

                textToServer = read.readLine();
                debug("Sending '" + textToServer + "'");
                out.print(textToServer + "\r\n"); // send to server
                out.flush();

                String serverResponse = null;
                while ((serverResponse = in.readLine()) != null)
                    debug(serverResponse); // read from server and print it.

                out.close();
                in.close();
                read.close();
                socket.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    private static void debug(String msg)
    {
        System.out.println("Client: " + msg);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 服务器-客户端 readLine() 方法 的相关文章

随机推荐

  • 检查缓存后 System.Web.HttpContext.Current 自身为空

    今天我遇到了一个奇怪的问题 这对我来说毫无意义 总结如下 在方法内部 我检查缓存的项目 如下所示 private async Task
  • Graphviz:能够接受更大文件的在线工具[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个很好的在线网站来渲染 graphviz 点文件 该文件将需要更大的文件 例如 200 行
  • 更改 Grafana 端口

    我目前在 Grafana 中有 InfluxDB 提供仪表板 我最终将在服务器上部署这个堆栈 但是 Grafana 的默认端口是 80 我必须更改此端口 但我不知道如何更改 有人可以帮忙吗 Thanks 变化不仅在于 etc grafana
  • TransactionScope 是否需要开启 DTC 服务?

    根据我的阅读 为了在 NET 中使用 TransactionScope 您需要运行 Windows 中的分布式事务协调器服务 我有那个服务关掉 并且我的应用程序似乎运行相同并且回滚事务没有问题 我错过了什么吗 它如何能够发挥作用呢 我正在运
  • 如何使用canvas.toDataURL()将画布保存为图像?

    我目前正在构建一个 HTML5 Web 应用程序 Phonegap 本机应用程序 我似乎不知道如何将画布保存为图像canvas toDataURL 有人可以帮我吗 这是代码 有什么问题吗 我的画布被命名为 canvasSignature J
  • Django Rest Framework:字段名称“likes”对于模型“userPost”配置不正确无效

    在我的 Django Rest Framework api 中 我尝试向我的模型 UserPosts 添加一个属性 该属性返回所述帖子的所有喜欢 尽管我尽了最大努力 但我仍然遇到这个错误 下面是我的帖子模型 class UserPosts
  • 如何将 PhoneGap 与 Visual Studio 结合使用

    我在 Windows 8 VS 2012 上开始使用 PhoneGap 时遇到问题 即 我不知道如何安装模板 我打开从PhoneGap下载的模板项目 但它们与VS2012兼容 我不知道从哪里开始创建我的第一个简单的 CRUD 应用程序 我想
  • 如何使用 jest 模拟第三方库

    我正在开发一个node js应用程序使用nestjs我有一堂课叫LoggerService如下 export class LoggerService private logger Rollbar constructor this logge
  • 具有共享依赖项的多模块项目的 Gradle 配置

    使用 gradle 制作第一个项目 所以我研究了 spring gradle hibernate 项目如何组织 gradle 文件 并开始制作自己的项目 但是 找不到错误 为什么我的配置不起作用 子项目无法解决依赖关系 所以项目树 Root
  • 将数字分解为单个数字的数组

    如果我有整数 123 并且我想将数字分解为数组 1 2 3 最好的方法是什么 我已经搞乱了很多 并且我有以下工作 var number 123 var digits Array String number map Int strtoul S
  • Mysqli 更新抛出 Call to a member function bind_param() 错误[重复]

    这个问题在这里已经有答案了 我有一个 70 80 字段表单 需要插入到表中 因此我首先根据表单中的输入名称在数据库中创建了一个表 而不是手动创建一个巨大的插入语句 这是我使用的代码创建 更改表 function createTable ar
  • Java:正则表达式排除空值

    在问题中here https stackoverflow com questions 51359056 java regexp for a separated group of digits 我得到了正则表达式来匹配 1 到 99 之间的一
  • Ember.js 处理 View 事件后转换到路由

    Setup 我有一个 Ember 应用程序 支持使用 Imgur API 上传图像 我已经有一个工作路线和模板来处理任何 Imgur ID 但我想在上传新图像后转换到此路线 使用返回的 Imgur ID 这是该应用程序的相关部分 http
  • 如何获取 WebElement 的父级[重复]

    这个问题在这里已经有答案了 我试过了 private WebElement getParent final WebElement webElement return webElement findElement By xpath 但我得到
  • 查询参数更改时,路线不会更新

    在我的应用程序中 有多个链接 其中我有一些links与相同的route但与不同的query parameters 比如说 我有这样的链接 deposits withdrawals deposits withdrawals id 1 depo
  • 如何使用自定义 DbFunction 将字符串转换为小数

    我有一个将小数 和其他类型 保存为字符串的表 我想在数据库上下文上编写一个 Linq 查询 该查询将转换为数据库转换而不是本地转换 出于性能原因 This 非工作的example 从概念上讲是我想要实现的目标 using var conte
  • Perl:正则表达式不抓取代码中的多行 C 风格注释

    我有一个 Perl 程序 读取用 C 编写的 SRC 文件 使用 SRC 文件中的正则表达式匹配来查找特定格式的数据以用作目标文件名 打开新的目标文件 执行另一个正则表达式匹配以查找包含关键字 abcd 的所有 C 风格注释 注意 这些注释
  • 将 CSS 类添加到 TagHelper 中的 html 元素

    在 ASP NET Core 视图中 我有以下内容 div class message div 我使用以下 TagHelper 来创建 Tag Helper HtmlTargetElement div Attributes MessageN
  • 什么是扩展方法?

    NET 中的扩展方法是什么 编辑 我已在以下位置发布了后续问题扩展方法的使用 https stackoverflow com questions 403619 usage of extension methods 扩展方法允许开发者向公众添
  • Java 服务器-客户端 readLine() 方法

    我有一个客户端类和一个服务器类 如果客户端向服务器发送消息 服务器会将响应发送回客户端 然后客户端将打印它收到的所有消息 例如 如果客户端向服务器发送 A 则服务器将向客户端发送响应 1111 所以我在客户端类中使用 readLine 从服