【问题标题】:My Java Server/Client program will only work every third time I run it我的 Java 服务器/客户端程序仅在我运行它的第三次时才运行一次
【发布时间】:2016-06-18 10:15:23
【问题描述】:

我是 Java 编程的新手,甚至是 Java 网络编程的新手,所以我相信问题会很简单。我的程序基于一个提交按钮,该按钮将学生 ID 提交到服务器。

前两次我运行程序时,它会与服务器建立连接,然后一切都会崩溃,并且永远不会交换字符串。

但是,我每运行三次,它就会完美运行并按设计交换字符串。

客户:

String currentButton = e.getActionCommand();
    if(currentButton == "submit"){
        try{
            Socket server = new Socket("Localhost",1234);
            InetAddress address=InetAddress.getLocalHost();

            System.out.println("Connected to "+server.getInetAddress());
            System.out.println("Connected to "+address);

            BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream()));

            PrintWriter pw = new PrintWriter(server.getOutputStream(), true);

            pw.println(student);

            while ((student = br.readLine()) != null) {
              System.out.println(student);
              pw.println("bye");

              if (student.equals("bye"))
                break;
            }
            br.close();
            pw.close();
            server.close();
        } catch (IOException ex){
            //ignore exception
        }
    }

服务器

class NETCW1S {
public static void main(String[] args) throws IOException {
    String student;
    ServerSocket serverSock = null;
    InetAddress address=InetAddress.getLocalHost();
    try{
        serverSock = new ServerSocket(1234);
        System.out.println("Waiting for client connection");
    } catch (IOException e) {
        System.err.println("Could not listen on port: 1234");
        System.exit(1);
    }
    Socket clientSock = null;
    try{
        clientSock = serverSock.accept();
    } catch (IOException e) {
        System.err.println("Accept Failed");
        System.exit(1);
    }
    while (true) {
        System.out.println("Connected to "+address);
        System.out.println("Waiting for client...");
        Socket client = serverSock.accept();

        System.out.println("Client from "+client.getInetAddress()+" connected.");

        Socket fromClientSocket = serverSock.accept();
        PrintWriter pw = new PrintWriter(fromClientSocket.getOutputStream(), true);

        BufferedReader br = new BufferedReader(new InputStreamReader(fromClientSocket.getInputStream()));

        while ((student = br.readLine()) != null) {
            System.out.println("The message: " + student);

            if (student.equals("bye")) {
                pw.println("bye");
                break;
            } else {
                student = "Server returns " + student;
                pw.println(student);
            }
        }
        pw.close();
        br.close();

        fromClientSocket.close();
    }
}   

提前非常感谢!

【问题讨论】:

  • 在 try 子句中执行 close 是个坏主意!如果之前抛出异常,您将不会关闭您的流/连接,这也可以解释您的问题。 隐藏异常同样糟糕,如果不是更糟的话!不要这样做,即使你不期待他们!
  • “一切都会崩溃”究竟是什么意思?
  • 嗨 Neil,如果我将 close 移到 try 之外,程序将无法编译并生成错误 'NETCW1.java:70: error: cannot find symbol br.close();'跨度>
  • Jiri,我的小 GUI 会冻结,所以我不能再按提交按钮了!
  • @GeorgeMahon 如果您使用 Java7 或更新版本,请阅读“try-with-resources”。对于冻结:我猜你在 GUI 线程上运行所有这些东西。永远不要那样做。

标签: java networking server client


【解决方案1】:

服务器在循环内应该只有一个 accept() 调用。客户端需要在某个时候进行 connect() 调用 - 现在它似乎根本没有与客户端通话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    相关资源
    最近更新 更多