Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java套接字的问题_Java_Sockets_Client Server_Socketserver - Fatal编程技术网

java套接字的问题

java套接字的问题,java,sockets,client-server,socketserver,Java,Sockets,Client Server,Socketserver,为了理解java套接字,我正在尝试重新设计客户机-服务器体系结构。 因此,我有一个向服务器发送消息的客户端,而服务器只是“说”类似于(服务器)的东西 现在我们开始: public class ServeurTCP { static ServerSocket socketServeur; static Socket socketVersUnClient; static BufferedReader in; static PrintWriter out; public static void m

为了理解java套接字,我正在尝试重新设计客户机-服务器体系结构。 因此,我有一个向服务器发送消息的客户端,而服务器只是“说”类似于(服务器)的东西

现在我们开始:

public class ServeurTCP {

static ServerSocket socketServeur;
static Socket socketVersUnClient;
static BufferedReader in;
static PrintWriter out;

public static void main(String[] args){
    //attente des connexions sur le port 9999

    //traitement des exceptions
    try {
        socketServeur = new ServerSocket(9999);

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


    //dans une boucle pour chaque socket clientes, appeler traiterSocketClient
    while(true)
    {   
        try {
            socketVersUnClient = socketServeur.accept();
            System.out.println("Attente des clients");

            in = creerReader(socketVersUnClient);
            out = creerPrinter(socketVersUnClient);
            envoyerMessage(out,"test");
            System.out.println(recevoirMessage(in));
            traiterSocketClient(socketVersUnClient);

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


}

public static void traiterSocketClient(Socket socketVersUnClient) {
    //Créer printer et reader


    //Tant qu'il y'a message à lire via recevoirMessage
    while(!recevoirMessage(in).equals("fin"))
    {
        System.out.println("ici");
        //Envoyer message client via envoyerMessage
        try {
            envoyerMessage(out,"(Serveur) message : "+in.readLine());
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally
        {
            try{
                socketVersUnClient.close();
            } catch(IOException e){
                e.printStackTrace();
            }
        }
    }
}

public static BufferedReader creerReader(Socket socketVersUnClient) 
{
    //crée BufferedReader associé à la socket
    try {
        return new BufferedReader(new InputStreamReader(socketVersUnClient.getInputStream()));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public static PrintWriter creerPrinter(Socket socketVersUnClient) 
{
    //crée PrintWriter associé à la socket
    try {
        return new PrintWriter(socketVersUnClient.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

public static String recevoirMessage(BufferedReader reader) 
{

    //Récupérer une ligne
    String userInput = null;

    try {
        userInput = reader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }


    //Retourner la ligne lue ou null si aucune ligne à lire
    return userInput;
}

public static void envoyerMessage(PrintWriter printer, String message) throws IOException
{
    System.out.println("Message");
    //envoyer le message vers client
    printer.write(message);
    printer.flush();
}
}
这是我的客户端类

public class ClientTCP {

static Socket socketClient;
static BufferedReader in;
static BufferedReader clientReader;
static String message;
static PrintWriter out;


public static void main(String[] args) 
{
    //créer une socket client
    try {
        socketClient = new Socket("localhost",9999);

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

    //créer reader et writer associés
    in = creerReader(socketClient);
    out = creerPrinter(socketClient);

    clientReader = new BufferedReader(new InputStreamReader(System.in));

    while( ((message = lireMessageAuClavier()) != "fin"))
    {
        //envoyer le message au serveur
        envoyerMessage(out,"(Client) message : "+message);

        //recevoir et afficher la réponse du serveur
        recevoirMessage(in);
    }

}

public static String lireMessageAuClavier() {


    //lit un message au clavier en utilisant par exemple un buefferedReader
    //sur System.in

    try {
        return clientReader.readLine();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;

}

public static BufferedReader creerReader(Socket socketVersUnClient) 
{
    //crée BufferedReader associé à la socket
    try {
        in = new BufferedReader(new InputStreamReader(socketVersUnClient.getInputStream()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    return in;
}

public static PrintWriter creerPrinter(Socket socketVersUnClient) 
{
    //crée PrintWriter associé à la socket
    try {
        out = new PrintWriter(socketVersUnClient.getOutputStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return out;
}

public static String recevoirMessage(BufferedReader reader) 
{
    //Récupérer une ligne
    String userInput = null;

    try {

        userInput = reader.readLine();

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

    //Retourner la ligne lue ou null si aucune ligne à lire
    return userInput;

}

public static void envoyerMessage(PrintWriter printer, String message) 
{
    //envoyer le message vers client
    printer.write(message);

    printer.flush();
}

问题似乎是两个类之间的连接都不好,例如,我无法从服务器向客户端发送一条消息,我不知道原因。

通过一些快速修复,它可以工作:

  • 在服务器中的
    特使消息
    中,在消息末尾添加一个换行符:
    printer.write(消息+“\n”)
    客户端正在使用
    clientReader.readLine
    从服务器读取数据,因此它将被卡住,直到收到换行符为止
  • 在客户端的
    main
    中,修复字符串比较以使用
    …equals(“fin”)
    而不是
    =
    ,否则无论您输入什么,
    while
    循环将永远不会结束
  • 在您进行此项工作时,我建议您首先使用服务器,并使用
    telnet
    作为您的客户端:

    telnet localhost 9999
    
    在基本功能完成后,尝试以下操作:

    • 连续连接2-3次:服务器能正确处理吗
    • 同时从2-3个窗口连接:服务器能否处理并发客户端?(好的,这可能超出您的范围…)

    服务器正常工作后,在客户端上工作(替换telnet)。

    测试套接字的一个一般提示:使用telnet或类似的终端程序测试服务器(在linux/unix/mac上,启动您的服务器,然后打开一个shell并键入
    telnet localhost 9999
    。这将减少服务器上bug的搜索空间。我也是法国人,我理解您所写的内容,但如果您的代码示例是英文的(sendMessage,receiveMessage),则对其他人来说会更容易要了解您在循环中所做的事情,请使用Java比较字符串,例如
    (message=lireMessageAuClavier())!=“fin”
    。在处理套接字之前,可能先学习基本知识。是的,请使用.equals()用于字符串比较。请注意标记是独立的。也就是说,您不能组合多个标记来创建单个概念。标记
    [client]
    [server]
    一起与单个
    [client server]不是一回事
    tag。请务必阅读选择标记时出现的说明!错误是我的sendMessages方法中\n出现了错误。谢谢