如何作为 android 服务器通过 GET 响应发送数据
How to send data through GET response as a android server
有一个场景,我需要作为 android phone 服务器,一个模块连接到我并通过 GET 方法(TCP/IP 连接)请求数据。
连接部分很简单,我的问题是我应该如何处理这个 GET 方法?
class AsyncServerThread extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
Socket socket = null;
try {
serverSocket = new ServerSocket(SERVERPORT);
Log.e("ServerThread", "Connected");
} catch (final IOException e) {
Log.e("serverSocketExc", "?" + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "serverSocketExc: " +
"?" + e.getMessage(),
Toast.LENGTH_LONG).show();
}
});
e.printStackTrace();
}
Log.e("ServerThread", "listening for new connections");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "ServerThread: listening for new connections.",
Toast.LENGTH_LONG).show();
}
});
while (shallContinue) {
try {
final Socket tempSocket = socket = serverSocket.accept();
if (tempSocket.isConnected()) {
Log.e("socket", "accepted new Connection");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "accepted new Connection.",
Toast.LENGTH_LONG).show();
}
});
/*CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();*/
Log.e("AsyncServerThread", "going to create client thread");
runOnUiThread(new Runnable() {
@Override
public void run() {
new AsyncClientThread().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, tempSocket);
}
});
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
} else {
Log.e("socket", "no new Connection");
}
} catch (IOException e) {
Log.e("accept", "?" + e.getMessage());
e.printStackTrace();
}
}
Log.e("ServerThread", "ended listening for new connection");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "ServerThread: ended listening for new connection.",
Toast.LENGTH_LONG).show();
}
});
try {
serverSocket.close();
} catch (IOException e) {
Log.e("close", "?" + e.getMessage());
e.printStackTrace();
}
return null;
}
}
GET、POST、PUT..等词在 HTTP 协议世界中找到。
但是您创建了一个服务器套接字而不是 http 服务器(创建低级服务器套接字和 http 服务器套接字之间存在差异)。
所以几天前我也有类似的情况,我使用了nanohttpd。
它是一个优雅的库,允许您在 android 设备上 运行 微型 httpd 网络服务器。
示例代码:
public class HttpWebServer extends NanoHTTPD {
int port;
public HttpWebServer(int port) throws IOException {
super(port);
this.port = port;
}
public void startServer() throws IOException{
start();
Log.d(LOG_TAG, "visit http://localhost:" + port );
}
@Override
public Response serve(IHTTPSession session) {
Log.d(LOG_TAG, "Got http request.");
//gets method type; GET, POST, PUT..etc
Method method = ((HTTPSession) session).method
}
}
如何添加依赖?
dependencies {
compile 'com.nanohttpd:nanohttpd-webserver:2.1.1'
}
有一个场景,我需要作为 android phone 服务器,一个模块连接到我并通过 GET 方法(TCP/IP 连接)请求数据。 连接部分很简单,我的问题是我应该如何处理这个 GET 方法?
class AsyncServerThread extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
Socket socket = null;
try {
serverSocket = new ServerSocket(SERVERPORT);
Log.e("ServerThread", "Connected");
} catch (final IOException e) {
Log.e("serverSocketExc", "?" + e.getMessage());
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "serverSocketExc: " +
"?" + e.getMessage(),
Toast.LENGTH_LONG).show();
}
});
e.printStackTrace();
}
Log.e("ServerThread", "listening for new connections");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "ServerThread: listening for new connections.",
Toast.LENGTH_LONG).show();
}
});
while (shallContinue) {
try {
final Socket tempSocket = socket = serverSocket.accept();
if (tempSocket.isConnected()) {
Log.e("socket", "accepted new Connection");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "accepted new Connection.",
Toast.LENGTH_LONG).show();
}
});
/*CommunicationThread commThread = new CommunicationThread(socket);
new Thread(commThread).start();*/
Log.e("AsyncServerThread", "going to create client thread");
runOnUiThread(new Runnable() {
@Override
public void run() {
new AsyncClientThread().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, tempSocket);
}
});
out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
} else {
Log.e("socket", "no new Connection");
}
} catch (IOException e) {
Log.e("accept", "?" + e.getMessage());
e.printStackTrace();
}
}
Log.e("ServerThread", "ended listening for new connection");
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), "ServerThread: ended listening for new connection.",
Toast.LENGTH_LONG).show();
}
});
try {
serverSocket.close();
} catch (IOException e) {
Log.e("close", "?" + e.getMessage());
e.printStackTrace();
}
return null;
}
}
GET、POST、PUT..等词在 HTTP 协议世界中找到。
但是您创建了一个服务器套接字而不是 http 服务器(创建低级服务器套接字和 http 服务器套接字之间存在差异)。
所以几天前我也有类似的情况,我使用了nanohttpd。 它是一个优雅的库,允许您在 android 设备上 运行 微型 httpd 网络服务器。
示例代码:
public class HttpWebServer extends NanoHTTPD {
int port;
public HttpWebServer(int port) throws IOException {
super(port);
this.port = port;
}
public void startServer() throws IOException{
start();
Log.d(LOG_TAG, "visit http://localhost:" + port );
}
@Override
public Response serve(IHTTPSession session) {
Log.d(LOG_TAG, "Got http request.");
//gets method type; GET, POST, PUT..etc
Method method = ((HTTPSession) session).method
}
}
如何添加依赖?
dependencies {
compile 'com.nanohttpd:nanohttpd-webserver:2.1.1'
}