【问题标题】:need some help on server-client socket comunication [duplicate]在服务器-客户端套接字通信方面需要一些帮助[重复]
【发布时间】:2019-12-24 15:51:33
【问题描述】:

我正在尝试在 java 中的套接字上做一个练习并让客户端与服务器通信,我不明白为什么服务器会卡在读取上,就好像它没有收到来自客户端,而实际上是客户端发送它们。 客户端被服务器正确查看,接受成功。怎么办?

服务器代码

ServerSocket server = null;
Socket client = null;
while(true) {
    try{
        server = new ServerSocket();
        server.bind(new InetSocketAddress("localhost", 2000));
        client = server.accept();
        break;
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }   
}

BufferedReader reader = null;
BufferedWriter writer = null;
try {
    reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
    writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

try {
    String message = null;
    while((message = reader.readLine()) != null) {
        System.out.println("Client send: " + message);
        String answer = "ok"; 
        writer.write(answer);
        writer.flush();

    }
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

try {
    writer.close();
    reader.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

客户端代码

Socket socket = new Socket();
try {
    SocketAddress address = new InetSocketAddress("127.0.0.1",2000);
    socket.connect(address);
} catch (IOException e) {
    e.printStackTrace();
}

BufferedReader reader = null;
BufferedWriter writer = null;
try {       
    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
try {
    String string = "hello";
    writer.write(string);
    writer.flush();
    System.out.print("sent");
    String message;
    while((message = reader.readLine()) != null) {
        System.out.println("Server send: " + message);
        break;
    }
}catch (SocketException e) {
    // TODO: handle exception
    System.out.println(e);

} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

try {
    writer.close();
    reader.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

【问题讨论】:

  • 这个循环:while(true) { Socket client = null; try{ client = server.accept(); } catch (Exception e) { e.printStackTrace(); } }应该何时退出?
  • 那么如何应该退出?
  • 你看起来需要休息一下,大概是client = server.accept(); break;。更好的是,创建一个 ClientHandler 接受新创建的服务器套接字并在每个客户端的新线程中运行它。
  • 另外,这个"localhot" 看起来很有问题。请告诉我,这在您的实际代码中不存在。
  • 没有导入,没有类声明,没有 main 方法,......再次,如果 MRE 链接中的任何内容令人困惑,请询问,我很乐意解释,但请再次阅读链接。

标签: java sockets client-server


【解决方案1】:

我的 MRE:

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

public class Foo {
    public static void main(String[] args) {
        new Thread(() -> ServerFun.someServerMethod()).start();
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {}
        new Thread(() -> ClientFun.someClientMethod()).start();
    }
}
class ClientFun {
    public static void someClientMethod() {
        Socket socket = new Socket();
        try {
            SocketAddress address = new InetSocketAddress("LocalHost", 2000);
            System.out.println("client socket address: " + address);
            socket.connect(address);
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            String string = "hello";
            writer.write(string);
            writer.newLine();
            writer.flush();
            System.out.print("sent");
            String message;
            while ((message = reader.readLine()) != null) {
                System.out.println("Server send: " + message);
                break;
            }
        } catch (SocketException e) {
            System.out.println(e);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            writer.close();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class ServerFun {
    public static void someServerMethod() {
        ServerSocket server = null;
        Socket client = null;
        // !!while (true) {  // not needed for a single client
            try {
                server = new ServerSocket();
                server.bind(new InetSocketAddress("localhost", 2000));
                System.out.println("server socket: " + server.getInetAddress());
                client = server.accept();
                // !! break;
            } catch (Exception e) {
                e.printStackTrace();
                System.exit(-1);
            }
        // !! }
        BufferedReader reader = null;
        BufferedWriter writer = null;
        try {
            reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            writer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            String message = null;
            while ((message = reader.readLine()) != null) {
                System.out.println("Client send: " + message);
                String answer = "ok";
                writer.write(answer);
                writer.newLine();
                writer.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            writer.close();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

您需要发送一个新行,readLine 方法才能工作。例如,

writer.write(answer);
writer.newLine();  // add this **********
writer.flush();

客户端和服务器都需要这样做。或者,使用 PrintWriter 和 out.println(answer);

我还必须使用“本地主机”才能让客户端工作。

希望您能看到 MRE 在我们解决这个问题中的作用。下一次,我希望你为我们创造一个,而不是强迫我们创造一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-30
    • 2012-11-02
    • 1970-01-01
    • 2015-01-15
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多