当前位置: 首页 > 知识库问答 >
问题:

Java中简单客户端-服务器应用程序的读/写

丁正阳
2023-03-14

我是Java的新手,我正在尝试学习线程和套接字。所以决定按照官方的java教程制作简单的客户机-服务器应用程序。我的想法很简单--服务器等待连接,如果出现,它就用新的套接字、输入和输出生成新线程。客户端->建立连接;带有套接字、输入、输出和stdIn的新线程(读取行,然后发送到服务器)。但是我的代码出了点问题(不知道为什么)。连接已经建立,没有例外。谁能解释一下为什么不工作,如何修复它?您还可以对代码有什么建议吗(可能不是关于最佳实践之类的):

Client side:

public class Client {
    private BufferedReader reader;
    private Socket sock;
    private PrintWriter writer;

public static void main(String[] args) {
    Client client = new Client();
    client.go();
}

public void go() {
    setUpNetworking();

}

private void setUpNetworking() {
    try{
        sock = new Socket("127.0.0.1", 5000);
        System.out.println("Network established");

        ServerThread serverThread= new ServerThread(sock);
        serverThread.start();

        System.out.println("Type your message: ");
    } catch (IOException e) {
        System.out.println("Problem with establishing the network: " + e);
    }
}

class ServerThread extends Thread {
    Socket socket;
    PrintWriter out;
    BufferedReader in;
    BufferedReader stdIn;

    ServerThread(Socket socket) {
        this.socket = socket;

        try{
            out = new PrintWriter(socket.getOutputStream());
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            stdIn = new BufferedReader(new InputStreamReader(System.in));
        }catch (IOException e) {
            System.out.println("Problem with trying to read/write to server: " + e);
        }
    }
    @Override
    public void run() {
        String fromServer;
        String fromClient;
        while(true){
            try{

                if((fromServer = in.readLine()) != null) System.out.println(" " + fromServer);
                else if((fromClient = stdIn.readLine()) != null) out.println(fromClient);

            }catch(Exception e) {
                System.out.println("msg exception: " + e);
            }

        }
    }
}

}

服务器端:

public class Server {
    //Run server until keepGoing = false
    private boolean keepGoing = true;



    public static void main(String[] args) {
        Server server = new Server();
        server.go();
    }

    public void go() {

            try {
                ServerSocket serverSocket = new ServerSocket(5000);

                while(keepGoing) {

                    Socket clientSocket = serverSocket.accept();
                    ClientThread t = new ClientThread(clientSocket);
                    t.start();
                }
            } catch (IOException e) {
                System.out.println("Problem with socket/network: " + e);
            }
    }

    class ClientThread extends Thread {
        Socket clientSocket;
        PrintWriter out;
        BufferedReader in;

        ClientThread(Socket clientSocket) {
            this.clientSocket = clientSocket;

            try{
                out = new PrintWriter(clientSocket.getOutputStream());
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            } catch (IOException e) {
                System.out.println("Problem with creating in/out: " + e);
            }
        }

        @Override
        public void run() {
            String message;
            while(keepGoing) {
                try{
                    message = in.readLine();
                    out.println(message);
                    System.out.println(message);

                } catch (IOException e){
                    System.out.println("Exception while try to read line: " + e);
                }

            }
        }
    }

}

PS我对代码做了一点改动--没有创建ClientThread类,而是创建了新的runnable类,并将该变量传递给thread类。受到这个问题的启发:“implements runnable”vs.“extends thread”。

共有1个答案

穆远
2023-03-14

我认为问题是服务器端和客户端都在等待任何输入。服务器:

message = in.readLine();

客户:

if((fromServer = in.readLine()) != null)
   System.out.println(" " + fromServer);
else if((fromClient = stdIn.readLine()) != null)
   out.println(fromClient);

但是客户机代码已经阻塞在fromserver=in.readline()部分上,因此它永远无法读取标准输入,因此不会向服务器发送任何内容。

BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
String read = "";
do {
    read = stdIn.readLine();
    System.out.println("Read from stdin: " + read);
    serverThread.send(read);

}
while (!read.equals("exit"));
void send(String string) {
    System.out.println("Sending to server: " + string);
    out.println(string);
}
out = new PrintWriter(socket.getOutputStream(), true);

然而,这只是第一步。对于客户端和服务器,我将以单独的线程实现读和写。而且还没有实现适当的关闭套接字。在Oracle上可以找到一个更完整但更简单的示例。

 类似资料:
  • 问题内容: 我做一个简单的, 没有线程 客户端 - 服务器 进行GUI有两个一个按钮程序 服务器 和 客户 端。当 客户端 按下按钮时,它将按钮上的文本更改为 “ C” 并发送到 服务器 “ C” 字符串,因此 服务器 端的按钮将文本更改为 “ C” 。 服务器的 工作方式与 客户端 相似,但是发送的是 “ S” 而不是 “ C” 。他们轮流工作:轮到 客户时 , 服务器 客户端 始终首先启动。

  • 问题内容: 我正在尝试编写一个简单的Java http客户端,该客户端仅打印出服务器响应的一行。我的问题是服务器没有响应。这是我所拥有的,正在编译并且没有明显错误地运行,只是在键入主机名(例如“ www.google.com”)后挂起: 有什么建议?请注意,这假设存在一个“ index.html”-即使为true,它仍会挂起。 问题答案: 我认为我可以通过对代码进行少量更改来重现该问题,因此现在它

  • 问题内容: 我正在尝试以客户端/服务器方式制作Java应用程序。客户端是SWT中的GUI,它显示来自服务器的数据。服务器已连接到数据库。 好的,对此感到抱歉,我确定这是一个经典问题,但我不知道如何开始。 在我为他们工作的一个项目中,他们实施了很多魔术来透明地调用Glassfish服务器。 我不想使用Glassfish服务器。我只想要简单的Java语言。但是代理的概念似乎很酷。 你有这种想法或例子吗

  • 我有一个多线程的Java客户端-服务器应用程序,发现自己与多线程通信的斗争。这是我的意思 如果我这样写一个服务器: 并这样编写客户端: 它运作得很好: > 服务器向客户端发送“欢迎” 用户输入一些字符串 在服务器控制台中打印该字符串 但如果我试图让它变得更复杂,就像这样: 客户: 它被堆放在方法上 客户端输出仅 我无法提供要在服务器上打印的字符串..有什么问题?

  • 本文向大家介绍Rust 一个简单的TCP客户端和服务器应用程序:echo,包括了Rust 一个简单的TCP客户端和服务器应用程序:echo的使用技巧和注意事项,需要的朋友参考一下 示例 以下代码基于std :: net :: TcpListener上的文档提供的示例。该服务器应用程序将侦听传入的请求并发送回所有传入的数据,从而充当“回显”服务器。客户端应用程序将发送一条小消息,并期望包含相同内容的

  • 本文向大家介绍Java网络编程之简单的服务端客户端应用实例,包括了Java网络编程之简单的服务端客户端应用实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java网络编程之简单的服务端客户端应用。分享给大家供大家参考。具体如下: 在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能。Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连