服务器不读取客户端消息

2024-01-08

我再次需要套接字编程方面的帮助。现在,我想在使用命令单击按钮后将文本字段的值写入 Linux 中的远程服务器日志文件。

"echo '" +textfieldValue+"' >> filename"

我在 Server.java 中创建了两个线程

  • 线程一是将 tail -f /root/log.txt 的值输出到我的客户端
  • 线程二是读取客户端发送的命令“echo '” +textfieldValue+“' >> filename”。

我的线程一正在运行,但我的线程二没有执行。

请帮忙。

客户端.java

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

public class Client
{
    Socket sock;
    String server = "XXX.XXX.XX.XX";
    int port = 5550;
    String filename = "/root/log.txt";
    String command;
    UI gui;

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

    public Client()
    {
        gui = new UI();
        gui.btnListner(new BtnListener());
        openSocket();
        try {
            // read incoming text from server
            BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
            String str;
            while ((str = rd.readLine()) != null) {
                System.out.println(str);
            }
            //rd.close();
        } 
        catch (IOException e) 
        {
            System.err.println(e);
        }
    }

    //after the button is being pressed. send command to server
    class BtnListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            String textfieldValue = gui.getTextFieldValue();
            command = "echo '" +textfieldValue+"' >> filename";
            BufferedWriter wr;
            try {
                wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
                wr.write(command);
                wr.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }
    }
    private void openSocket()
    {
        // open a socket and connect with a timeout limit
        try
        {
            InetAddress addr = InetAddress.getByName(server);
            SocketAddress sockaddr = new InetSocketAddress(addr, port);
            sock = new Socket();

            // this method will block for the defined number of milliseconds
            int timeout = 2000;
            sock.connect(sockaddr, timeout);
        } 
        catch (UnknownHostException e) 
        {
            e.printStackTrace();
        }
        catch (SocketTimeoutException e) 
        {
            e.printStackTrace();
        }
        catch (IOException e) 
        {
            e.printStackTrace();
        }
    }
}

服务器.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server  {
    private int portNo = 0;
    private Socket socket = null;

    @SuppressWarnings("resource")
    public Server(int portNo) {
        this.portNo = portNo;
        ServerSocket sSocket = null;
        try {
            sSocket = new ServerSocket(portNo);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        while(true) {
            try {
                socket = sSocket.accept();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            Thread t = new Thread(new acceptClient());
            t.start();
        }
    }

    class acceptClient implements Runnable {
        public void run() {

            Thread one = new Thread(new t1());
            one.start();

            //thread two not executing!
            Thread two = new Thread(new t2());
            two.start();
        }
    }

    //reading and writing the log file output to client
    class t1 implements Runnable {

        @Override
        public void run() {
            BufferedWriter wr = null;
            Process p = null;
            System.out.println("A client has connected!");
            try {
                p = Runtime.getRuntime().exec("tail -f /root/log.txt");
            } catch (IOException e1) {
                e1.printStackTrace();
            }

            try {
                wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            BufferedReader rd = new BufferedReader(new InputStreamReader(p.getInputStream()));
            try {   
                //rd.close();
                String s = null;
                while ((s = rd.readLine()) != null) {
                    System.out.println(s);
                    wr.write(s+"\n");
                    wr.flush();
                }

            } catch(IOException exception) {
                System.out.println("Error: " + exception);
            }

        }
    }

    //reading and getting the command "echo 'gui.getTextFieldValue()' >> filename" from client
    class t2 implements Runnable {
        @Override
        public void run() {
            //Process p2 = null;
            try {
                BufferedReader rd2 = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String s2 = null;
                while ((s2 = rd2.readLine()) != null) {
                    System.out.println(s2);
                    //p2 = Runtime.getRuntime().exec(s2);
                    //new BufferedReader(new InputStreamReader(p2.getInputStream()));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }
    public static void main(String[] args) {
        int portNo = 5550;
        new Server(portNo);
    }
}

服务器正在读取行,但客户端没有写入行。在消息中添加行终止符,或使用BufferedWriter.newLine().

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

服务器不读取客户端消息 的相关文章

  • 匿名内部类显示不正确的修饰符

    据我了解 以下代码应该打印true作为输出 但是 当我运行这段代码时 它正在打印false 来自 Java 文档15 9 5 匿名类 https docs oracle com javase specs jls se8 html jls 1
  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • java.sql.SQLException: ORA-01005: 给定的密码为空;登录被拒绝

    我在尝试连接到数据库时遇到以下异常 java sql SQLException ORA 01005 null password given logon denied at oracle jdbc driver T4CTTIoer proce
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • RSA 加密-解密:BadPaddingException:数据必须以零开头

    对于一个被问了很多次的问题 我很抱歉向您询问您的技能 我有一个关于 RSA 加密的问题 我已经检查过有关此问题的其他主题 但没有找到任何有用的答案 我希望你能帮助我 我想读取一个文件 加密其内容 然后解密它并将这些解密的字节放入一个新文件中
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • PrintStream是有缓冲的,但是flush不会降低性能,而BufferedOutputStream会加速性能

    我预计由于 PrintStream 是缓冲的 通过在每次 print 之后添加刷新操作 速度性能应该会显着降低 但事实并非如此 如下面的代码片段所示 此外 将 PrintStream 包裹在 BufferedOutputStream 周围可
  • 在 JSP 中对表单操作使用相对路径

    如何在表单操作中使用相对路径
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • 从 org.w3c.dom.Node 获取 Xpath

    我可以从 org w3c dom Node 获取完整的 xpath 吗 假设当前节点指向 xml 文档中间的某个位置 我想提取该元素的 xpath 我正在寻找的输出 xpath 是 parent child1 chiild2 child3
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 在 javafx 中注册鼠标处理程序,但处理程序不是内联的

    我有一个 JavaFX 应用程序变得有点大 我想保持代码的可读性 我有一个折线图 我希望内置缩放功能 该功能在单击鼠标时发生 我知道我需要向图表注册鼠标侦听器 我无法从 Oracle 示例中弄清楚什么 即如下所示 http docs ora
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 如何减少 JSF 中的 javax.faces.ViewState

    减少 JSF 中视图状态隐藏字段大小的最佳方法是什么 我注意到我的视图状态约为 40k 这会在每次请求和响应时下降到客户端并返回到服务器 特别是到达服务器时 这对用户来说会显着减慢 我的环境 JSF 1 2 MyFaces Tomcat T
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • WebSocketStompClient 将无法连接到 SockJS 端点

    我正在尝试新的 从版本 4 2 开始 java STOMP 客户端支持 我的出发点是入门指南 使用 WebSocket 构建交互式 Web 应用程序 http spring io guides gs messaging stomp webs
  • Maven `help: effective-pom` 只为单个项目生成,而不是所有项目

    我想为多模块构建中的所有子项目生成有效的 pom The help effective pom文档here http maven apache org plugins maven help plugin usage html The hel
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我

随机推荐

  • VB.Net 表单非共享方法被引用为共享方法?

    尽管我主要是一名 C 开发人员 但我正在为 VB Net 应用程序提供支持 我遇到过我认为 奇怪 的代码 因为我的 C 思维方式告诉我该代码是错误的 不应该编译 但它确实编译了 我做了一个查找所有参考文献在特定的表单上查看它的使用位置 并找
  • 母版页和视图中的表单

    我有一个母版页 我的所有视图都继承自该母版页 我遇到的问题是在母版页中创建的表单标签 然后是在视图中创建的表单标签 由于表单位于母版页表单内 因此我的所有回发都会发送到控制器 Index 方法 这迫使我创建一个新方法 Index 来强制使用
  • 如何在 Ruby 中取消类的定义?

    在 Ruby 中取消定义方法非常简单 我可以使用undef METHOD NAME 有类似的班级吗 我在MRI 1 9 2 我必须取消定义 ActiveRecord 模型 运行两行代码 然后将模型恢复到其原始形式 问题是 我有一个模型Con
  • 为什么派生类属性值在基类构造函数中看不到?

    我写了一些代码 class Base Default value myColor blue constructor console log this myColor class Derived extends Base myColor re
  • 组合扩展器和网格(可调整大小的扩展器)

    我想要一个类似可调整大小的扩展器之类的东西 我的基本想法是这样的
  • Python 3.x 导入错误 SyntaxError [重复]

    这个问题在这里已经有答案了 我正在使用 macOS Sierra 导入时builtwith我收到以下错误 Daniels MacBook Pro Daniel python Python 3 5 2 Anaconda 4 2 0 x86 6
  • ImportError:无法导入名称“_ColumnEntity”Ubuntu20.10 [重复]

    这个问题在这里已经有答案了 pip install apache superset 然后我写了 superset db upgrade 我收到以下错误 Traceback most recent call last File home co
  • 在大型数据表中替换 NA 的最快方法

    我有一个大数据表 http cran r project org web packages data table index html 许多缺失值分散在大约 20 万行和 200 列中 我想尽可能有效地将这些 NA 值重新编码为零 我看到两
  • 如何在 Laravel 中验证 API 路由的 Vue.js / Axios 请求

    我在 Laravel 5 6 中 我已经构建了所有 API 路由 并正确响应来自 REST 客户端 Paw 的请求 我正在尝试构建一个简单的前端来访问这些路由 我尝试尽可能多地使用 Laravel 的开箱即用功能 因此我使用 Axios 使
  • 多次 fork 调用会导致 BlockingIOError

    我正在寻找有关以下代码片段的错误的解释 usr bin env python3 import os sys if name main while True pid os fork if pid 0 sys exit elif pid gt
  • 在 Entity Framework Core 中获取当前用户 ID 的正确方法

    对于 ASP NET Core 的不同 RC 关于如何获取当前登录用户的 ID 这里有很多不同的答案 我想在这里问一个明确的问题 请注意 project json 现在有 Microsoft AspNetCore Identity Enti
  • 相当于 grails 中的 InheritanceType.TABLE_PER_CLASS 吗?

    我想为 3 个域类创建 3 个单独的表 A B 扩展 A C 扩展 B 但我希望他们的表不相互连接 在hibernate中 我会使用InheritanceType TABLE PER CLASS 在grails中 等价物是什么 尝试使用ta
  • Golang 结构体接口

    我有一个函数 其参数类型为 interface 如下所示 func LoadTemplate templateData interface 就我而言 templateData 是一个结构 但每次它都有不同的结构 我使用 interface
  • 如何从异步函数返回 Promise?

    当我尝试从异步函数返回 Promise 时 无法区分返回的 Promise 和函数的状态 我认为 最简单的解决方案是将要返回的承诺放在数组中 下面是一个愚蠢的例子 但我希望它能说明问题 function loadMetaData id Re
  • 互联网浏览器中的tinymce图标

    我正在使用 TinyMCE 但图标图像未显示在 Internet Explorer 中 我检查了讨论here https stackoverflow com questions 2625019 how do i get the icons
  • 如何在 Android 上的应用程序启动器图标上显示气球计数器

    我想为android制作一个图标计数器 就像电子邮件和三星应用程序应用程序一样 我已经看到其他开发人员提出了这样的请求 但你们都说这是不可能完成的 如果是这样 为什么这两个应用程序和其他应用程序可以做到这一点 我是否必须制作多个图标图像并交
  • 停止 NSApplication 主事件循环

    我有一个由以下内容组成的应用程序 m file import
  • Java:删除点之后的所有字符

    我有一个简短的问题 我得到以下代码 String chapterNumber 14 2 1 我怎样才能从我的 chapterNumber 中获得如下所示的字符串 String mainChapterNumber 14 Edit 我想要 in
  • 删除 API post 调用的 csrf 保护

    我想从我的 Express 3 0 应用程序中删除 csrf 因为我在那里不需要它 我使用 oauth 来验证客户端 使用express csrf 时 中间件是否将API URL列入白名单 您可以通过两种方式做到这一点 1 创建一个自己的小
  • 服务器不读取客户端消息

    我再次需要套接字编程方面的帮助 现在 我想在使用命令单击按钮后将文本字段的值写入 Linux 中的远程服务器日志文件 echo textfieldValue gt gt filename 我在 Server java 中创建了两个线程 线程