服务器不读取客户端消息 [英] Server not reading client messages

查看:55
本文介绍了服务器不读取客户端消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I need help in socket programming again. Now I want to write the value of my textfield to my remote server log file in linux after a button is clicked by using the command.

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

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

I made two threads in the Server.java

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

我的线程 1 正在运行,但我的线程 2 没有执行.

My thread one is running but my thread two is not executing.

请帮忙.

客户端.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();
        }
    }
}

Server.java

Server.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().

The server is reading lines but the client isn't writing lines. Add a line terminator to the message, or use BufferedWriter.newLine().

这篇关于服务器不读取客户端消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆