Java 通过 Socket 传输属性

2024-01-02

首先,这是一个家庭作业问题。话虽如此,我被困住了。谷歌搜索 java Properties over Sockets 会得到很多不相关的东西。

我正在尝试通过套接字传输 Properties 对象。 API 说它可以通过 Stream 或 Writer/Reader 来完成,但我无法让它工作。我可以手动完成,也就是说,如果我逐行读取文件并通过 PrintWriter 传递它。

在客户端我大致有:

socket = new Socket(host, port);
outStream = socket.getOutputStream();
out = new PrintWriter(outStream, true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
reader = new BufferedReader(new FileReader(file));
...
props.load(reader);
props.store(out, null);

在服务器端,接收位如下所示:

out = new PrintWriter(sock.getOutputStream(), true);
inStream = sock.getInputStream();
in = new BufferedReader( new InputStreamReader(inStream));
...
props.load(in); // hangs
// doesn't get to code here...

在这种情况下,它挂在 props.load(in) 处。我没有执行 props.load(in),而是逐行读取它以确保 props.store(out, null) 正常工作,并且数据看起来像是正在传输。

是否有关于加载/存储的问题我不明白,或者是流/写入器/读取器的问题?


我认为这也可以回答这个问题如何识别 Java 套接字中的 EOF? https://stackoverflow.com/questions/7599742/how-do-i-recognize-eof-in-java-sockets and 我可以向 InputStream 发送什么来表示已达到 EOF? https://stackoverflow.com/questions/6569995/what-can-i-send-to-an-inputstream-to-signify-eof-has-been-reached

我也有类似的问题;我的困境是我有一个客户端/服务器请求响应协议,其中一个请求包含从客户端发送的流clientProps.store()。相应的serverProps.load()在服务器端永远不会返回,因为它需要看到“文件结尾”——这在 Java 中意味着客户端必须关闭它的流;导致套接字连接关闭。不想要的结果是,我不仅无法保持套接字打开以进行无限期的请求响应交换,甚至无法保持它打开以供服务器发送回复。

我讨厌 Java 让我这样做,更因为 Properties.load() 的文档说:

此方法返回后,指定的流保持打开状态。

如果它通过查看流关闭来检测文件结尾,则永远不会发生这种情况!不管怎样,现在,我仍然喜欢 Java,因为它允许我使用这个解决方案(如果您对正在流式传输的数据有任何特殊的编码或本地化,则可能没有用):

我在客户端使用了这个:

    PrintWriter toServer;
    Properties clientProps = new Properties();

//  ... code to populate the properties and to 
//      construct toServer from the socket ...

    clientProps.store(toServer, null);
    toServer.write('\u001A'); // this is an old-school ASCII end-of-file
    toServer.flush();

在服务器端,我扩展了 Reader 来检测 1A 并返回 -1 (以便serverProps.load()以正常方式了解文件结尾(通过查看从调用返回的 -1read()), but below也就是说,流和套接字保持打开状态。

    BufferedReader fromClient;
    Properties serverProps = new Properties();


// ... code to construct fromClient from the socket ...

    serverProps.load (new PropReader (fromClient));

/////

    private static class PropReader extends Reader {

    BufferedReader src;
    boolean eof=false;

    private PropReader(BufferedReader fromClient) {
        super();
        src=fromClient;
    }


    @Override
    public int read(char[] cbuf, int off, int len) throws IOException {
        int inCount;

        if (!eof) {
            inCount = src.read(cbuf, off, len);

            if (inCount > 0) {
                // we read a buffer... look at the end for the EOF that the client used to mark the end of file
                if (cbuf[off+inCount-1] == '\u001A') {
                    --inCount; // don't send eof with the data
                    eof = true; // next time... we'll return -1
                }
            }
        } else {
            inCount = -1;
        }

        return inCount;
    }

    @Override
    public void close() throws IOException {
        src.close();
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 通过 Socket 传输属性 的相关文章

  • 禁用 Eclipse Java 调试器的热代码替换 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Eclipse 中禁用热代码替换 https stackoverflow com questions 2594408 how do i disable hot code replace in
  • 如何在spring mvc中从控制器名称+操作名称获取映射的URL?

    是否有现有的解决方案可以从 Spring MVC3 中的 控制器名称 操作名称 获取映射的 URL 例如 asp net mvc 或 Rails 中的 UrlHelper 我觉得非常有用 thx 也许 你想要这样的东西 in your Co
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • .NET 属性生成“必须声明主体,因为它未标记为抽象或外部”编译错误

    我有一个 NET 3 5 目标框架 Web 应用程序 我有一些代码看起来像这样 public string LogPath get private set public string ErrorMsg get private set 它给了
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 无法加载或查找主类,可以在命令行中使用,但不能在 IDE 中使用[重复]

    这个问题在这里已经有答案了 在将其标记为重复之前 请先听我说完 我正在尝试使用 gradle 导入一个 java 项目 功能齐全 适用于所有其他笔记本电脑 没有问题 我的项目 100 正常运行 适用于所有其他笔记本电脑 当我的笔记本电脑被重
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Cloudfoundry:如何组合两个运行时

    cloundfoundry 有没有办法结合两个运行时环境 我正在将 NodeJS 应用程序部署到 IBM Bluemix 现在 我还希望能够执行独立的 jar 文件 但应用程序失败 APP 0 bin sh 1 java not found
  • 如何记录来自 Akka (Java) 的所有传入消息

    在 Scala 中 您可以使用 LoggingReceive 包装接收函数 如何通过 Java API 实现相同的目标 def receive LoggingReceive case x do something Scala API 有Lo
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • Android Studio 将音乐文件读取为文本文件,如何恢复它?

    gameAlert mp3是我的声音文件 运行应用程序时 它询问我该文件不与任何文件类型关联 请定义关联 我选择TextFile错误地 现在我的音乐文件被读取为文本文件 我如何将其转换回music file protected void o
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Hibernate 和可序列化实体

    有谁知道是否有一个框架能够从实体类中剥离 Hibernate 集合以使它们可序列化 我查看了 BeanLib 但它似乎只进行实体的深层复制 而不允许我为实体类中的集合类型指定实现映射 BeanLib 目前不适用于 Hibernate 3 5
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • JAXB - 列表<可序列化>?

    我使用 xjc 制作了一些课程 public class MyType XmlElementRefs XmlElementRef name MyInnerType type JAXBElement class required false

随机推荐

  • 有哪些方法可以加快seabornspairplot的速度

    我有一个包含 250 000 行但 140 列的数据框 我正在尝试构建一个对图 的变量 我知道子图的数量很大 而且绘制图所需的时间也很多 我在 3 4 GHZ 和 32 GB RAM 的 i5 上等待了一个多小时 记得 scikit lea
  • FB 未定义

    如果按下 Facebook Like 按钮 我尝试重定向到 URL 但它不起作用 并且结果在源视图中出现错误 提示 FB 未定义 这是我的重定向代码 FB Event subscribe edge create function respo
  • TextInputLayout 中的 EditText 滞后

    我有两种观点使用TextInputLayout 第一个是只有 2 个输入字段的登录视图 第二个是有许多输入字段的注册视图 我在用TextInputLayout and EditText AppCompatEditText为我的输入提供自定义
  • 向一组 WinForms 控件添加类似的行为

    我有一个有 6 个按钮的表单 这些按钮用于增加 减少相应文本框的值 现在我正在尝试为按钮 设置动画 当鼠标悬停在按钮上时 我想在按钮上获得另一种效果 为此 我在资源中有两个不同的图像 并且正在执行以下代码 private void btnH
  • python 3 上的 ImportError,在 python 2.7 上运行良好

    我在导入时遇到错误code parsing与 Python 3 2 一起打包 目录code parsing是在PYTHONPATH并包含以下文件 还有其他一些文件 但与此处无关 code parsing init py code parsi
  • 通过 SSH 推送到远程存储库时“访问被拒绝”

    我是 Git 新手 似乎在通过网络推送到存储库时遇到问题 这是我重现问题的方法 在计算机上创建一个新的 Git 存储库以推送到 mkdir git test git cd git bare init 然后 我在本地计算机上创建一个新的 Gi
  • bash变量分别捕获stderr和stdout或获取退出值[重复]

    这个问题在这里已经有答案了 我需要捕获 bash 脚本中命令的输出和错误 并了解该命令是否成功 目前 我正在这样捕获两者 output mycommand 2 gt 1 然后我需要检查 mycommand 的退出值 如果失败 我需要对输出做
  • 在标头中声明并初始化静态 int

    如果我的头文件中有以下内容 Foo h Foo public static const int BAR 1234 我是否还需要在 cpp 中定义变量 例如 Foo cpp const int Foo BAR 我们遇到一个问题 在标头中初始化
  • 最新的 Jackrabbit 快照可以在 Lucene 3 上正常工作吗?

    我正在开发一个基于 Java Web 的应用程序 该应用程序同时使用 Jackrabbit 和 Hibernate Search 我面临的问题是 Jackrabbit 严重依赖 Lucene 2 但搜索需要 Lucene 3 才能工作 我设
  • 搁置真的很慢并且占用大量内存还是我做错了什么?

    我正在尝试编写一个程序 该程序使用排序字母的搁置数据库作为键 以及可以从它们创建的单词列表作为值 例如 db mnoo moon mono 所以我编写了一个函数 它接受一个文件名并将其加载到架子中 第一部分将文件转换为与搁置具有相同布局的字
  • R中如何将数字转换为日期? [复制]

    这个问题在这里已经有答案了 我有以下数据框 id lt c 1 2 3 4 date lt c 19970807 19970902 19971010 19970715 df lt data frame id date 其中日期列中的值的类型
  • JavaScript 如何检查手机/平板电脑的用户代理

    我目前正在为客户网站开发一些 JS 工作 该网站在桌面和平板电脑平台上具有不同的功能 考虑 if navigator userAgent match Android i navigator userAgent match webOS i n
  • 使用 swift Xcode 6 默认选项卡栏项目颜色

    环境 Xcode 6 测试版 4 斯威夫特语言 iOS 选项卡式应用程序 默认 xCode 项目 如何将选项卡的默认灰色更改为其他颜色 最好是全球范围内 就我的研究而言 我需要以某种方式将每个选项卡的图像渲染模式更改为原始渲染模式 但我不知
  • Apache 重写 URL 但不重写某些文件夹

    我正在使用 Apache 将我的 URL 重写为干净的 URL RewriteRule index php 目前 这也会重写目录 这正是我想要的 因为我希望所有内容都通过我的 router index php 文件运行 然而 我想做的是拥有
  • SQL Server XML 存在()

    我在使用时遇到一些问题exist and value SQL Server 2008 中的方法 我的 XML 看起来像这样
  • 使用 stringformat 时 WPF 文本框绑定不起作用

    这是我的问题 我有一个文本框 它使用文本框预览并对输入的文本进行一些验证 文本框绑定到 double 属性 最初 当用户输入带有小数的数字时 它会崩溃 因为当数字为 1 时 每次击键后都会更新 它会自动更改为 1 删除小数 并且当在小数点后
  • 批量插入具有地理空间数据类型的表时出现“指定类型未注册”错误

    我正在尝试使用SqlBulkCopy类来自System Data程序集 4 6 1 批量插入具有地理空间数据类型的表 使用的代码大致如下 改编自https github com MikaelEliasson EntityFramework
  • 在邻近区域组建实力相似的团队

    Idea 令人遗憾的是 如此多的伟大国家 例如印度 和球员 例如莫萨拉赫 可能永远不会参加国际足联 足球 足球 世界杯 同样的论点也适用于由少数统治者主导的其他体育赛事 队 例如国际板球和篮球锦标赛 尝试创建一个更加平衡的赛事 同时仍然保留
  • new[] 是否调用 C++ 中的默认构造函数?

    当我使用 new 创建类数组时 int count 10 A arr new A count 我看到它调用了默认构造函数A count次 因此arr has count已初始化类型的对象A 但是如果我使用同样的东西来构造一个 int 数组
  • Java 通过 Socket 传输属性

    首先 这是一个家庭作业问题 话虽如此 我被困住了 谷歌搜索 java Properties over Sockets 会得到很多不相关的东西 我正在尝试通过套接字传输 Properties 对象 API 说它可以通过 Stream 或 Wr