Java 客户端-服务器连接

Java 客户端-服务器连接,java,Java,我有一个java程序,可以将客户端连接到服务器。 这包括在客户端通过发送消息触发服务器后创建一个文件目录。例如:一旦服务器已经运行,客户端将连接并发送消息,即您的消息:Lady,服务器将收到类似请求的消息,请求创建一个名为:Lady的目录,之后将创建一个名为Lady的目录 但问题是这种连接只适用于一对一。就像只有一个客户端可以连接到服务器一样 这是示例代码: /* * To change this template, choose Tools | Templates * and open t

我有一个java程序,可以将客户端连接到服务器。 这包括在客户端通过发送消息触发服务器后创建一个文件目录。例如:一旦服务器已经运行,客户端将连接并发送消息,即您的消息:Lady,服务器将收到类似请求的消息,请求创建一个名为:Lady的目录,之后将创建一个名为Lady的目录

但问题是这种连接只适用于一对一。就像只有一个客户端可以连接到服务器一样

这是示例代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package today._;

import java.io.*;

import java.net.*;

import java.text.*;

import java.util.*;

public class myServer {

    protected static final int PORT_NUMBER = 55555;

    public static void main(String args[]) {

        try {

            ServerSocket servsock = new ServerSocket(PORT_NUMBER);

            System.out.println("Server running...");

            while (true) {
                Socket sock = servsock.accept();
                System.out.println("Connection from: " + sock.getInetAddress());
                Scanner in = new Scanner(sock.getInputStream());
                PrintWriter out = new PrintWriter(sock.getOutputStream());
                String request = "";
                while (in.hasNext()) {
                    request = in.next();
                    System.out.println("Request to Create Directory named: " + request);

          if(request.toUpperCase().equals("TIME")) {  
                    try {
                        File file = new File("C:\\" + request);
                        if (!file.exists()) {
                            if (file.mkdir()) {
                                System.out.println("Directory is created!");
                            } else {
                                System.out.println("Failed to create directory!");
                            }
                        }
                    } catch (Exception e) {
                        System.out.println(e);
                    }
                    out.println(getTime());

                    out.flush();
          } else {
               out.println("Invalid Request...");                     
               out.flush();
          }
                }

            }


        } catch (Exception e) {
            System.out.println(e.toString());
        }

    }

    protected static String getTime() {
        DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        Date date = new Date();
        return (dateFormat.format(date));
    }
}

多客户端服务器通常采用以下两种方式之一编写:

为每个客户端创建一个线程。为此,您需要创建一个线程来处理服务器套接字上要接受的调用,然后生成一个新线程来处理它返回的套接字上的调用。如果执行此操作,则需要确保尽可能隔离每个套接字的代码。accept线程将永远循环,或者直到设置了一个标志,并且将只调用accept,使用新套接字生成一个线程,然后返回到调用accept。所有工作都在子线程中

使用NIO或其他技术将工作多路复用到多个线程中。NIO有时使用一个称为select的概念,当特定套接字中有可用的输入时,将调用您的代码

如果你只是做一个小型服务器,你可以用最简单的设计,也不会有太多的客户端,所以我会选择1。如果你正在做一个大型的生产服务器,我会研究一个像netty或jetty这样的框架来帮助你做2。NIO可能很棘手

在这两种情况下,对线程和文件系统都要非常小心,如果不使用并发包中的锁、同步或其他锁定方案,可能无法获得预期的结果


我的最后一个建议是,让客户机告诉服务器对文件系统执行任何操作时要小心。只是说,这是一件危险的事情-

您的服务器类必须使用多个线程来处理所有连接:

class MyServer {


    private ServerSocket servsock;

    MyServer(){
        servsock = new ServerSocket(PORT_NUMBER);
    }

    public void waitForConnection(){
        while(true){
            Socket socket = servsock.accept();
            doService(socket);
        }
    }

    private void doService(Socket socket){
        Thread t = new Thread(new Runnable(){
            public void run(){
                while(!socket.isClosed()){
                    Scanner in = new Scanner(sock.getInputStream());
                    PrintWriter out = new PrintWriter(sock.getOutputStream());
                    String request = "";
                    // and write your code
                }
            }
        });
        t.start();
    }
}

服务器上的每个客户端需要一个线程。请参阅本教程页面的结尾:糟糕的做法,您正在为每个循环创建一个新的扫描仪和PrintWriter,这两个声明应该在循环之外。是的。没错。我从user2565623的代码中复制并粘贴这行代码,没有引起注意!:在一台服务器上同时连接多个客户端仍然不起作用。。但是当第一个客户端退出连接时,另一个客户端将被连接。这就像是先到先得的服务方式。。如有任何建议,请:
class MyServer {


    private ServerSocket servsock;

    MyServer(){
        servsock = new ServerSocket(PORT_NUMBER);
    }

    public void waitForConnection(){
        while(true){
            Socket socket = servsock.accept();
            doService(socket);
        }
    }

    private void doService(Socket socket){
        Thread t = new Thread(new Runnable(){
            public void run(){
                while(!socket.isClosed()){
                    Scanner in = new Scanner(sock.getInputStream());
                    PrintWriter out = new PrintWriter(sock.getOutputStream());
                    String request = "";
                    // and write your code
                }
            }
        });
        t.start();
    }
}