【问题标题】:Server and Client program in java: Client needs to start and end the conversationjava中的服务器和客户端程序:客户端需要开始和结束对话
【发布时间】:2018-10-09 01:50:01
【问题描述】:

客户需要使用关键字“结束”来开始和结束对话。当客户端类型结束并点击进入时,服务器需要打印“会话已结束”并且客户端和服务器都需要关闭。

我遇到的问题是当我在客户端结束时,客户端套接字关闭,服务器打印“会话已结束”但服务器套接字直到您在服务器端按 enter 才会关闭。

服务器 -

import java.io.*;
 import java.net.*;
 public class Server {
 public static void main(String[] args) {
    try {
        ServerSocket sSock = new ServerSocket(1201);
        Socket sock = sSock.accept();

        DataInputStream din = new DataInputStream(sock.getInputStream());
    DataOutputStream dout = new DataOutputStream(sock.getOutputStream());

        BufferedReader reader = new BufferedReader(new 
        InputStreamReader(System.in));

        String msgin = "";
        String msgout ="";

        while(!msgin.equals("end")) {
            msgin = din.readUTF();
            System.out.println(msgin);
            msgout = reader.readLine();
            dout.writeUTF("Server: " + msgout);
            dout.flush();
        }
        System.out.println("ended");
    } catch (Exception e) {
        // TODO: handle exception
    }
}
}

客户 -

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

public class Client {
 public static void main(String[] args) {
    try {
        Socket sock = new Socket("127.0.0.1", 1201);
        System.out.println("Server: This is Server");
        DataInputStream din = new DataInputStream(sock.getInputStream());
    DataOutputStream dout = new DataOutputStream(sock.getOutputStream());

BufferedReader reader = new BufferedReader(new 
InputStreamReader(System.in));

        String msgin ="";
        String msgout ="";
        while(!msgin.equals("end")) {
            msgout = reader.readLine();
            if (msgout.equals("end")) {
                sock.close();
            }
            dout.writeUTF("Client: " + msgout);
            msgin = din.readUTF();
            System.out.println(msgin);
        }
        sock.close();
        } catch (Exception e) {
        // TODO: handle exception
       }
      }
     }

【问题讨论】:

    标签: java command-prompt


    【解决方案1】:

    我已经测试了您的代码,当任何一方关闭套接字时,由于套接字工作方式的性质,它会自动关闭另一侧的连接。如果添加 sysout 或 e.printStackTrace(),您将看到套接字正在以异常关闭,并且程序正在另一端结束。

    但是,您可以考虑实现一个多线程应用程序,这样您就可以允许客户端和服务器随时发送和接收消息。在它的设计方式上,一旦一方发送了一条消息,它只有在收到另一方的消息后才能发送另一条消息。

    您可以在此处查看一个简单但有用的客户端/服务器聊天示例:Server/Multiclient program wont send message to all clients

    package so52712250;
    
    import java.io.BufferedReader;
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.InputStreamReader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
        public static void main(String[] args) {
            try {
                ServerSocket sSock = new ServerSocket(1201);
                Socket sock = sSock.accept();
    
                DataInputStream din = new DataInputStream(sock.getInputStream());
                DataOutputStream dout = new DataOutputStream(sock.getOutputStream());
    
                BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    
                String msgin = "";
                String msgout = "";
    
                while (!msgin.equals("end")) {
                    msgin = din.readUTF();
                    System.out.println(msgin);
                    msgout = reader.readLine();
                    dout.writeUTF("Server: " + msgout);
                    dout.flush();
                }
                System.out.println("ended");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

    • catch 中的 sysout 消息真正解决了我的问题。谢谢你的多线程,虽然我需要为未来的项目扩展这个聊天客户端,所以这也很有帮助。
    【解决方案2】:

    问题是扫描器在收到输入之前一直处于阻塞状态。

    一种可能的解决方案是使用 2 个线程。一个从扫描仪读取,一个从流中读取。如果一端确保两个线程都已清理干净。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多