繁体   English   中英

客户端上的Java客户端-服务器问题(无System.out)

[英]java client-server issue on client side (no System.out)

可能是一个不好的问题:

所以我做了一个非常简单的单线程服务器/客户端模型。 现在,当我在Eclipse IDE中执行程序时,它将向我显示服务器的System.out,而不是客户端的System.out。 当我按终止时,将显示应该由客户端生成的System.out.println行。

我已经为此苦苦挣扎了几天。.希望有人可以帮我。

提前致谢!

服务器:

import java.net.*;
import java.io.*;

public class Server {

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

}

public Server()
{
    try
    {
        ServerSocket serverSocket = new ServerSocket(8000); //nieuw instantie van een ServerSocket

        System.out.println("Waiting for clients..");
        Socket socket = serverSocket.accept(); // lister for socket requests      



        while(true)
        {
            BufferedReader inputClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            DataOutputStream clientOutput = new DataOutputStream(socket.getOutputStream());

            String clientInput = inputClient.readLine();

            System.out.println("Server: clientInput= : " + clientInput);

            InetAddress hostAddress = InetAddress.getByName(clientInput);
            String iPaddress = hostAddress.getHostAddress();

            System.out.println("Server: IP = : " + iPaddress);

            clientOutput.writeBytes(iPaddress);
            clientOutput.flush();

        }

    }
    catch(IOException ex)
    {
        System.err.println(ex);
    }   
}
}

客户:

import java.io.*;
import java.net.*;


public class Client {

public static void main(String[] args) {

    new Client();   
}

public Client()
{
    try
    {
        Socket socket = new Socket("localhost", 8000);

        DataOutputStream toServer  = new DataOutputStream(socket.getOutputStream());   
        BufferedReader fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        toServer.writeBytes("google.com" + '\n');

        String ip = fromServer.readLine();
        System.out.println("Client: "+ ip);


    }

    catch(IOException ex)
    {
        System.err.println(ex);
    }
}

}

当启动客户端服务器程序时,它们将具有2个独立的控制台。 在Eclipse的“控制台”视图中一次只能看到一个。 这就是为什么您只看到服务器的原因。

您可以使用“显示选定的控制台”图标(它是监视器图标)在活动控制台之间进行切换,还可以查看活动控制台列表。

另外,您具有全双工连接。 客户端和服务器都可以读取/写入。 您将DataOutputStream - BufferedReader表示形式用于错误的单向通信。

DataOutputStream写入二进制数据, BufferedReader读取文本(字符)数据。

您应该使用以下配对之一:

DataOutputStream - DataInputStream    and use writeUTF() and readUTF() methods
OR
PrintWriter      - BufferedReader     and use println() and readLine() methods
   clientOutput.writeBytes(iPaddress);
   clientOutput.write("\n".getBytes());
   clientOutput.flush();

只需在您的Server类中添加这些行(第二行)。

原因

在您的Client类中,您正在从缓冲区读取器中读取一行,但尚未从服务器发送任何指示行尾的字符。 因此,在第二行中,我们正在写换行符以指示行尾。

关闭服务器时,将重置连接并读取可用的输入。 这就是为什么关闭服务器后客户端会打印的原因。

(可选)如果您只想修改Client类,则可以编写以下行

        char [] a = new char[100];
        int length = fromServer.read(a);
        System.out.println("Client: "+(new String(a)).substring(0,length));

代替这些

        String ip = fromServer.readLine();
        System.out.println("Client: "+ ip);

好的,在用'\\ n'索引该行并将该行放入后:
套接字套接字= serverSocket.accept(); 在while循环内,而不是在try {}内部,我摆脱了所有问题。

谢谢,现在我将尝试对此线程进行多线程处理!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM