java中的套接字客户机/服务器停止方法

java中的套接字客户机/服务器停止方法,java,sockets,Java,Sockets,这是我的教员项目的简单客户端/服务器套接字应用程序。首先,应该运行服务器类,然后如果客户机类运行,它将打印出本地计算机的IP地址和所使用的端口 我想不出一件事: 如何以及在何处在类中创建关闭(停止)服务器的方法?及 如何使它像一个事件或某事,例如,如果客户端 发送“停止”,它应该以某种方式停止服务器 SERVER.JAVA import java.io.*; import java.net.*; public class Server { public static void main

这是我的教员项目的简单客户端/服务器套接字应用程序。首先,应该运行服务器类,然后如果客户机类运行,它将打印出本地计算机的IP地址和所使用的端口

我想不出一件事:

如何以及在何处在类中创建关闭(停止)服务器的方法?及 如何使它像一个事件或某事,例如,如果客户端 发送“停止”,它应该以某种方式停止服务器

SERVER.JAVA

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

public class Server {
    public static void main(String[] args) {
        System.out.println("The server has been summoned.\n");
        System.out.println("The server is waiting for client to come...");
        try {
            ServerSocket servertest = new ServerSocket(2014);
            while (true) {
                try {
                    Socket ser = servertest.accept();
                    new ThreadSer(ser).start();
                } catch (IOException e) {}
            }
        } catch (IOException e) {System.err.println(e);}
    }

    public static class ThreadSer extends Thread {
        private Socket s;
        public ThreadSer(Socket s) {
            this.s = s;
        }
        @Override
        public void run() {
            try {
              String response = "This is the IP: " + s.getLocalAddress() + " that has come via port: "
                        + s.getLocalPort() + "\r\n";
                OutputStream out = s.getOutputStream();
                out.write(response.getBytes());
            } catch (IOException e) { System.err.println(e); }
}}}
import java.io.*;
import java.net.*;

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("localhost", 2014);

        new OutputThread(socket.getInputStream()).start();
    }

    public static class OutputThread extends Thread {
        private InputStream inputstream;
        public OutputThread(InputStream inputstream) {
            this.inputstream = inputstream;
        }
        @Override
        public void run() {
            BufferedReader input = new BufferedReader(new InputStreamReader(inputstream));
            while (true) {
                try {
                    String line = input.readLine();
                    System.out.println(line);
                } catch (IOException exception) {
                    exception.printStackTrace();
                    break;
                }
            }
}}}
CLIENT.JAVA

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

public class Server {
    public static void main(String[] args) {
        System.out.println("The server has been summoned.\n");
        System.out.println("The server is waiting for client to come...");
        try {
            ServerSocket servertest = new ServerSocket(2014);
            while (true) {
                try {
                    Socket ser = servertest.accept();
                    new ThreadSer(ser).start();
                } catch (IOException e) {}
            }
        } catch (IOException e) {System.err.println(e);}
    }

    public static class ThreadSer extends Thread {
        private Socket s;
        public ThreadSer(Socket s) {
            this.s = s;
        }
        @Override
        public void run() {
            try {
              String response = "This is the IP: " + s.getLocalAddress() + " that has come via port: "
                        + s.getLocalPort() + "\r\n";
                OutputStream out = s.getOutputStream();
                out.write(response.getBytes());
            } catch (IOException e) { System.err.println(e); }
}}}
import java.io.*;
import java.net.*;

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        Socket socket = new Socket("localhost", 2014);

        new OutputThread(socket.getInputStream()).start();
    }

    public static class OutputThread extends Thread {
        private InputStream inputstream;
        public OutputThread(InputStream inputstream) {
            this.inputstream = inputstream;
        }
        @Override
        public void run() {
            BufferedReader input = new BufferedReader(new InputStreamReader(inputstream));
            while (true) {
                try {
                    String line = input.readLine();
                    System.out.println(line);
                } catch (IOException exception) {
                    exception.printStackTrace();
                    break;
                }
            }
}}}

您应该不断请求客户端的输入流。。将其放入始终接受客户端输入的循环中

例如:

 public static class ThreadSer extends Thread {
    private Socket s;
    public ThreadSer(Socket s) {
        this.s = s;
    }
    @Override
    public void run() {
        try {
          String response = "This is the IP: " + s.getLocalAddress() + " that has come via port: "
                    + s.getLocalPort() + "\r\n";

            ObjectInputStream input = new ObjectInputStream(s.getInputStream());

            while(true)
            {
               Object object = input.readObject();
               if(object instanceof String)
               { 
                  String command = ((String) object).trim();
                  if(command.equals("stop"))
                    break;
               }
            }
            s.close();

        } catch (IOException e) { System.err.println(e); }

}}}

您可以尝试将它们制作成线程,然后再制作thread.end();或者是因为我的网速太差,所以我没有及时看到他的答案什么是传入的,在哪里定义的?@mpavlovic89传入的是socketOh,谢谢你的编辑棒。那个么命令呢,当它做出反应并停止服务器时。如果服务器处于打开状态,当客户端在控制台中键入“停止”时,它仍然处于打开状态。显然缺少触发器?@mpavlovic89 yea您只需要为ThreadSer类添加另一个参数,即socketserver,当命令为stop时,通过socketServerObject.close()停止socketserver