在客户端服务器应用程序中通知客户

时间:2016-06-28 16:40:43

标签: java sockets server client

首先,我对套接字编程很新,对我来说很容易;)。 我有一个Java程序,它使用客户端 - 服务器编程在一个或多个客户端和服务器之间进行通信。因此,客户端可以向处理消息的服务器发送任意数量的消息,到目前为止一切正常。现在我想通知客户服务器端的数据库更改。因此,例如,如果一个客户端更改例如表A,则还应通知其他客户端有关此更改的信息。 到目前为止我所拥有的是(服务器):

ExecutorService executor = null;
    try (ServerSocket socket = new ServerSocket(port);)
    {
        executor = Executors.newFixedThreadPool(getThreadCount(5));
        while(true)
        {
            Socket clientSocket = socket.accept();
            Runnable worker = new PCRequestMapper(clientSocket);
            executor.execute(worker);
        }
    }
    catch(IOException ioe)
    {
        ioe.printStackTrace();
    }
    finally 
    {
        if(executor != null)
        {
            executor.shutdown();
        }
    }

请求映射器类看起来像这样:

public class PCRequestMapper implements Runnable
{

private Socket client = null;

private static Map<Integer, PCRequestData> requestData = null;

public PCRequestMapper(Socket client)
{
    this.client = client;
}

@Override
public void run()
{
    try (ObjectInputStream in = new ObjectInputStream(
            client.getInputStream());
            ObjectOutputStream writer = new ObjectOutputStream(
                    client.getOutputStream());)
    {
        System.out.println("Thread started in PCRequestHandler with name: "
                + Thread.currentThread().getName());
        Object recObj = in.readObject();
        // ToDo Do something
        PCBaseRequest req = (PCBaseRequest) recObj;
        System.out.println("Req type: " + req.getRequestType() + " name: "
                + req.getName());

        PCRequestData data = requestData.get(req.getRequestType());
        if(data == null)
        {
            PCException ex = new PCException();
            ex.setStackTrace(new Throwable().getStackTrace());

            PCBaseReply reply = getErrorReply("No mapped request handler found in services.xml for request: "+req.getRequestType()+" - "+req.getName(), 
                    PCException.NO_MAPPED_HANDLER, ex);

            writer.writeObject(reply);
        }
        else
        {
            Class<?> c = Class.forName(data.getMappedClass());
            Constructor<?> cons = c.getConstructor();
            PCIRequestHandler object = (PCIRequestHandler)cons.newInstance();
            PCBaseReply reply = object.heyHo(req);

            System.out.println("Writing reply: "+reply.getClass());

            writer.writeObject(reply);
        }
    } catch (IOException ioe)
    {
        ioe.printStackTrace();
    } catch (ClassNotFoundException cnfe)
    {
        cnfe.printStackTrace();
    } catch (NoSuchMethodException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SecurityException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e)
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

它基本上接受一条消息(请求),将其映射到已配置的类,然后该类执行所需的任何操作。

在客户端,我有一个名为RequestSender的类,用于向服务器发送任意请求:

public class PCRequestSender
{

private static int getPort(int defaultPort)
{
    final String port = PCConfigHandler.getStringProperty("serverPort");
    if (null != port)
    {
        try
        {
            return Integer.parseInt(port);
        } catch (NumberFormatException e)
        {
            System.out.println("Value of port property"
                    + " is not a valid positive integer [" + port + "]."
                    + " Reverting to default [" + defaultPort + "].");
        }
    }
    return defaultPort;
}

public static PCBaseReply sendRequest(PCBaseRequest req)
{
    PCBaseReply reply = null;
    int port = getPort(8081);
    String address = PCConfigHandler.getStringProperty("serverAddress");
    try (Socket serverSocket = new Socket(address, port);
            ObjectOutputStream out = new ObjectOutputStream(
                    serverSocket.getOutputStream());
            ObjectInputStream in = new ObjectInputStream(
                    serverSocket.getInputStream());)
    {
        out.writeObject(req);
        Object recObj = in.readObject();

        reply = (PCBaseReply) recObj;
        System.out.println("Reply: "+reply);

    } catch (IOException e)
    {
        e.printStackTrace();
    } catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    }

    return reply;
}

}

现在我有点不知所措,因为我还想经常收听服务器套接字以捕获通知。我需要在服务器端使用另一个套接字吗?我的设置不是太理想吗? 我对任何提示都很有帮助......谢谢!

0 个答案:

没有答案