有多少用户可以在android客户端,pc java服务器上使用套接字处理?

时间:2016-01-18 18:35:06

标签: java android sockets

我创建了一个简单的应用程序,使用套接字通过本地网络在客户端和服务器之间传输数据,

服务器java代码:

try {
    serverSocket = new ServerSocket(8888);
    System.out.println("Listening :8888");
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

while (true) {
    try {
        socket = serverSocket.accept();
        dataInputStream = new DataInputStream(socket.getInputStream());
        dataOutputStream = new DataOutputStream(
                socket.getOutputStream());
        System.out.println("ip: " + socket.getInetAddress());
        String message = dataInputStream.readUTF();
        // System.out.println("message: " + dataInputStream.readUTF());

        try {
            JSONObject jObj = new JSONObject(message);
            String flag = jObj.getString("flag");
            if (flag.equals("request")) {
                String request = jObj.getString("request");
                if (request.equals("getGroup"))
                    dataOutputStream.writeUTF(getGroup());
                else if (request.equals("getFood")) {
                    String groupID = jObj.getString("groupID");
                    dataOutputStream.writeUTF(getFood(groupID));
                }
            }
        } catch (JSONException | IOException e) {
            e.printStackTrace();
        }
        // dataOutputStream.writeUTF("Hello!");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (dataInputStream != null) {
            try {
                dataInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (dataOutputStream != null) {
            try {
                dataOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

和android客户端代码:

class Load extends AsyncTask<String, String, String> {
    String response;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    protected String doInBackground(String... args) {
        Socket socket = null;
        DataOutputStream dataOutputStream = null;
        DataInputStream dataInputStream = null;

        try {
            socket = new Socket("192.168.1.106", 8888);
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
            dataOutputStream.writeUTF(utils.getGroup());
            response = dataInputStream.readUTF();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (dataOutputStream != null) {
                try {
                    dataOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (dataInputStream != null) {
                try {
                    dataInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

    protected void onPostExecute(String file_url) {
        showGroup(response);
    }
}

这可以处理多少客户? 有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

  

这可以处理多少客户?

基本上你的代码是一个迭代服务器。有一个大循环,并且在每次循环中都会完全处理单个连接。

答:所以从这个意义上讲,它一次只能处理一个客户。

如果您想一次支持多个客户端,您的服务器应该通过使用线程(每个客户端连接一个线程)同时为多个客户端提供服务。

这种服务器的基本逻辑流程如下:

while (true) {
    accept a connection;
    create a thread to deal with the client;
}

请参阅以下tutorial以获取完整说明,甚至是一些代码示例。

  

有更好的解决方案吗?

在Android方面,正如我在答案here中的评论所指出的那样。使用AsyncTask进行HTTP通信可能会有一些缺点,例如:

  1. 您无法在执行期间取消请求。
  2. 使用AsyncTask的模式通常也会泄漏对Activity的引用...
  3. 答:像OkHttp这样的库可以作为更强大的替代方案应用。