对于客户端和服务器,我具有以下代码,客户端向该服务器和服务器发送请求,该请求最终将被解析-响应将返回给正确的客户端。
首先,我知道我应该使用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();
}
}
}