【问题标题】:Java ServerSocket won't send or receive messages from clientJava ServerSocket 不会发送或接收来自客户端的消息
【发布时间】:2018-02-06 00:20:11
【问题描述】:

我有这两个类 Client.javaServer.java,每个类都包含一个 main 方法。这个想法非常简单,其中的代码非常相似。我试图实现的目标是打开一个服务器,它使用ServerSocket 监听特定端口,然后打开一个客户端并使用Socket 连接到服务器这样我终于可以将消息从 client 发送到 server 并反向直到我关闭连接。

到目前为止,我尝试了最简单的示例,在 port 4444 上打开 server,然后在 同一台 PC 上打开客户端连接到地址 127.0.0.1(localhost),在端口 4444。一切顺利,每次都建立成功,除了它不会发送任何消息,从服务器到客户端或从客户端到服务器。

最后一个问题是,我应该怎么做才能在服务器和客户端之间交换消息?我应该修改什么?

Client.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class Client {

    private static Socket client;
    private static BufferedReader in, console;
    private static PrintWriter out;

    private static String serverAddress;
    private static int port;

    public static void main(String[] args) {

        try {
            console = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("Connect to server address (example 192.168.10.11): ");
            serverAddress = console.readLine();

            System.out.print("Port: ");
            port = Integer.parseInt(console.readLine());

            System.out.println("\nTrying to connect...");
            client = new Socket(serverAddress, port);

            System.out.println("Connected to " + client.getRemoteSocketAddress());
            in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            out = new PrintWriter(client.getOutputStream());

            out.write("Connected!!!!!!");

            Thread input = new Thread() {

                public void run() {
                    String tmp;

                    try {
                        while((tmp = in.readLine()) != null) {
                            System.out.println("Server: " + tmp);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            Thread output = new Thread() {

                public void run() {
                    String tmp;

                    try {
                        while((tmp = console.readLine()) != null) {
                            out.print(tmp);
                        }
                    } catch(IOException e) {
                        e.printStackTrace();
                    }
                }
            };


            input.start();
            output.start();

            while(true) {
                if(!input.isAlive() && !output.isAlive()) {
                    client.close();

                    in.close();
                    console.close();
                    out.close();

                    break;
                }
            }

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

    }

}

Server.java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

    private static ServerSocket serverSocket;
    private static Socket server;
    private static BufferedReader in, console;
    private static PrintWriter out;

    private static int port;

    public static void main(String[] args) {


        try {
            console = new BufferedReader(new InputStreamReader(System.in));

            System.out.print("Open server on port (example 1234): ");
            port = Integer.parseInt(console.readLine());

            System.out.println("Server open");
            serverSocket = new ServerSocket(port);

            System.out.println("Waiting for a client to connect...\n");
            server = serverSocket.accept();

            System.out.println("Client " + server.getRemoteSocketAddress() + " connected!");
            in = new BufferedReader(new InputStreamReader(server.getInputStream()));
            out = new PrintWriter(server.getOutputStream(), true);

            Thread input = new Thread() {

                public void run() {
                    String tmp;

                    try {
                        while((tmp = in.readLine()) != null) {
                            System.out.println("Client: " + tmp);
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            Thread output = new Thread() {

                public void run() {
                    String tmp;

                    try {
                        while((tmp = console.readLine()) != null) {
                            out.print(tmp);
                        }
                    } catch(IOException e) {
                        e.printStackTrace();
                    }
                }
            };

            input.start();
            output.start();

            while(true) {
                if(!input.isAlive() && !output.isAlive()) {
                    serverSocket.close();
                    server.close();

                    in.close();
                    console.close();
                    out.close();

                    break;
                }
            }

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

    }

}

【问题讨论】:

  • 这是一个看起来很像您的代码的教程。它可以满足您的要求。 careerbless.com/samplecodes/java/beginners/socket/…
  • 感谢您的回复。我已经看过很多这样的教程。问题是我试图在这两个类中使用这两个线程,就像任何经典的实时聊天一样,从服务器到客户端的输入和输出同时反向工作。我设法让它在没有线程的情况下工作,所以很可能问题出在 run() 方法中。 @Remixt

标签: java sockets server client-server serversocket


【解决方案1】:

你正在阅读台词,但你不是在拧台词。你应该使用out.println(),而不是out.write()out.print()

【讨论】:

  • 此外,在这种情况下,您必须在要发送的每条消息上刷新流 @​​987654324@ 或在客户端类上刷新流 @​​987654325@,就像在服务器类上一样。
  • 感谢 EJP 的回答,使用 println 和 flushing 终于让它工作了。为了标记你的答案,你能解释一下使用 println 而不是 print 是如何工作的吗? @EJP
  • 我已经解释过了。在我的回答中。你不是在写台词。 println() 写行。请参阅 Javadoc。
  • @HectorVenturaReyes 不,他没有您引用的构造函数中的 true 参数使该参数自动执行。
  • @AndreiMeşi 您必须选择将数据发送到连接的套接字的选项,首先是在 PrintWriter 构造函数上设置第二个参数true 或在 println 方法之后执行刷新。 @AndreiMeşi 祝你好运。
猜你喜欢
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多