客户端/服务器只读一条消息?

时间:2014-05-07 03:23:00

标签: java command client-server

我的客户端/服务器可以完美地处理一条消息,然后无论下一步是什么,它都是空白的。

我相信问题会在这里或我的命令类中解决:

package MyServer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

public class Main {
public static String line;
public static void main(String[] args){
    while(true){
        try {              
            //Creates a socket to receive commands from!
            Socket socket  = new Socket("localhost", 7586);

            //Uses that socket to create a Reader to read the commands!
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));    

            //Waits for Lines to be sent and then executes them!
            while(true){
                line = in.readLine();

                if(line != null){
                   Commands.ReceiveCommand();
                }else {
                    break;
                }
            }        
        } catch (UnknownHostException e){
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }    
    }

}


}    

或在我的命令中:

package MyServer;

import javax.swing.JOptionPane;

public class Commands {

static String command = (Main.line).toString(); //<--This was the problem, just had to move it into the method below.
public static void ReceiveCommand(){
    if(command.equals("test")){
        JOptionPane.showMessageDialog(null,"works","command: " + command,JOptionPane.WARNING_MESSAGE);
        //System.out.println("WORKEDS MOFO");
        command = "";
    }else{
        JOptionPane.showMessageDialog(null,"not recognized","command: " + command,JOptionPane.WARNING_MESSAGE);
        //System.out.println("no bueno");
        //System.out.println("line is " + command);
        command = "";

    }

}

}

编辑:出于某种原因,在调试时,命令只是空白,无论它曾被使用过一次,所以它可能在我的主服务器类中:

package MyClient;

import java.util.List;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Main {
//Sets the Port
final static int PORT = 7591;

//Creates a list of Connected Clients
static List<Socket> connectedClients = new ArrayList<Socket>();

public static void main(String[] args){
    //Creates a Thread to Send Messages to connectedClients
    new Thread(new messageThread()).start();

    try {
        //Creates the ServerSocket
        ServerSocket serverSocket = new ServerSocket(PORT);

        while(true){
            //Waits for a Connection and Accepts it...
            Socket clientSocket = serverSocket.accept();
            System.out.println("A Client has connected!");
            //Adds it to the List
            connectedClients.add(clientSocket);
        }



    } catch (IOException e) {
        e.printStackTrace();
    }
} }

和messageThread:

package MyClient;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class messageThread implements Runnable {    
public void run() {
    while(true){
        System.out.println(">>");
        Scanner in = new Scanner(System.in);
        String command = in.nextLine();

        for(Socket clientToSendCommand : Main.connectedClients){
            try {
                PrintWriter commandWriter = new PrintWriter(clientToSendCommand.getOutputStream());
                commandWriter.println(command);
                commandWriter.flush();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }
}
}

1 个答案:

答案 0 :(得分:1)

这项工作,因为行

static String command = (Main.line).toString();
当首次引用Commands-class时,Commands-class中的

只执行一次。

当发送第二个命令时,该类已被引用,因此不再执行该行。

要解决此问题,请将该行放入方法中,或者 - 更好 - 将其作为参数传递给方法。


P.S。:你有没有混淆包裹?具有ServerSocket的类应该是服务器,因此位于MyServer包中。 : - )

相关问题