ServerSocket始终运行并一次处理来自多个客户端连接的请求

时间:2019-06-30 11:41:46

标签: java multithreading sockets client-server runnable

对于客户端和服务器,我具有以下代码,客户端向该服务器和服务器发送请求,该请求最终将被解析-响应将返回给正确的客户端。

首先,我知道我应该使用Runnable并使用某种线程安全性,但是我不确定在我的代码中将在哪里使用它们。

第二,当有多个客户端连接时,如何获取Server实例以将解析的结果返回给发送该请求的正确客户端?

Client.java

import org.json.JSONObject;

import java.io.*;
import java.net.Socket;
import java.util.LinkedHashMap;
import java.util.Map;

public class Client
{
    protected static final int PORT = 3000;

    private static String createRequest() {
        JSONObject obj = new JSONObject();

        // Add request params to obj

        // Principle (subject) params
        Map p = new LinkedHashMap(2);
        p.put("id", "1");
        p.put("xyz", 3);
        obj.put("subject", p);

        // Object params
        Map o = new LinkedHashMap(3);
        o.put("id", "1.xml");
        o.put("type", "c");
        o.put("label", 2);
        obj.put("object", o);

        // Action params
        obj.put("action", "read");

        return obj.toString();
    }

    public static void main(String[] args) {
        try {
            Socket sock = new Socket("127.0.0.1", PORT);

            // Output Stream (sending to server)
            OutputStream os = sock.getOutputStream();
            PrintWriter pw = new PrintWriter(os, true);

            // Input Stream (receiving from server)
            InputStream is = sock.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            // Client writer
            // BufferedReader clientWrite = new BufferedReader(new InputStreamReader(System.in));

            String request, response;
            while(true) {
                request = createRequest();
                pw.println(request);
                if((response = br.readLine()) != null) {
                    System.out.println(response);
                }
            }

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

Server.java

import org.json.JSONException;
import org.json.JSONObject;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class Server
{
    public static final int PORT = 3000;

    private static JSONObject StringToJSON(String str) throws JSONException {
        return new JSONObject(str);
    }

    public static void main(String[] args) {
        try {
            System.out.println("Starting Server...");
            ServerSocket serverSocket = new ServerSocket(PORT);
            System.out.println("Server Started!");

            Socket socket = serverSocket.accept();

            // Input Stream (receiving from client)
            InputStream inputStream = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));

            // Output Stream (sending to client)
            OutputStream outputStream = socket.getOutputStream();
            PrintWriter pw  = new PrintWriter(outputStream, true);

            String request,response;
            while(true) {
                if((request = br.readLine()) != null) {
                    JSONObject req = StringToJSON(request);
                    System.out.println(req);
                    response = "Request Received!";
                    pw.println(response);
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

0 个答案:

没有答案