java - Android Java - ServerSocket 在 wifi 上监听,发送带有蜂窝数据的帖子
问题描述
是否可以在 wifi 上使用 serversocket,同时在蜂窝数据上发送 POST 消息?
服务器套接字打开时,我不能使用 post 线程。如果我在打开套接字时尝试发布,没有任何反应,也不例外......
Iv 尝试创建两个单独的应用程序并且有效,但不幸的是我需要让它在一个中工作。
MainThread:这两个功能目前都是通过按钮单击激活的,仅用于测试目的。
public void testPost(View view) {
PostThread postThread = new PostThread("post test ", this);
new Thread(postThread).start();
}
public void testServer(View view) throws IOException {
ServerThread serverThread = new ServerThread(this);
new Thread(serverThread).start();
}
ServerSocket:意味着一直在运行,在 wifi 上监听。
package com.example.protiminglistener.listenerwidget;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import android.os.Handler;
import android.widget.Toast;
import androidx.annotation.RequiresApi;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
public class ServerThread implements Runnable {
private Context context;
private ServerSocket serverSocket;
public ServerThread(Context context) throws IOException {
this.context = context;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void run() {
try {
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(Network network) {
try {
serverSocket = new ServerSocket(6000, 50, InetAddress.getByName("192.168.1.101"));
} catch (IOException e) {
e.printStackTrace();
}
while(true){
try {
Socket socket = serverSocket.accept();
String value = new BufferedReader(new InputStreamReader(socket.getInputStream())).readLine();
//listenerDbHelper.insertData(value);
socket.close();
} catch (SocketTimeoutException s) {
System.out.println("Socket timed out!");
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
帖子主题:
package com.example.protiminglistener.postwidget;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.os.Build;
import androidx.annotation.RequiresApi;
import java.io.IOException;
import java.util.Calendar;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class PostThread implements Runnable {
String value;
Context context;
public PostThread(String value, Context context){
this.value = value;
this.context = context;
}
public static final MediaType FORM = MediaType.parse("multipart/form-data");
private OkHttpClient client = new OkHttpClient();
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void run() {
try {
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
request.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
final ConnectivityManager postConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
postConnectivityManager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onAvailable(Network network) {
try {
postConnectivityManager.bindProcessToNetwork(network);
client = new OkHttpClient.Builder()
.socketFactory(network.getSocketFactory())
.build();
post(client);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public void post(OkHttpClient client) throws Exception {
RequestBody formBody = new FormBody.Builder()
.add("message", value)
.build();
Request request = new Request.Builder()
.url("https://en19ef8d6jz5pi0.m.pipedream.net")
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
System.out.println(response.body().string() + Calendar.getInstance().getTime().toString());
}
}
}
我用来向套接字发送数据的 c# 应用程序:
using System.Net.Sockets;
using System.Text;
namespace pronetWidget_Socket {
class Program {
static void Main(string[] args) {
Socket sender = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sender.Connect("192.168.1.101", 6000);
byte[] messageSent = Encoding.ASCII.GetBytes("Test 555");
int byteSent = sender.Send(messageSent);
sender.Close();
}
}
}
解决方案
推荐阅读
- python - 隐藏python源代码以防止人们看到它..完整而正确的方法
- c# - .NET Core 中的 Nuget 包版本问题
- node.js - Sequlize 生成带有外键的表,同时明确要求不要
- javascript - 在纯 JavaScript 中只执行一次本地函数?
- sql - 我无法查询或检查 tempdb 中的现有表
- node.js - 在 Node 中为电子商务网站动态创建 Mongoose Schema
- python - 无法分配“'Single Bedded'”:“Patients.room_type”必须是“Accomodation”实例
- graph-theory - 我对树的最短路径长度有一些问题(具有 n 个顶点、n-1 个边的连接图)
- node.js - 无法发布 nodejs 和 mongodb
- c - 修补闭源网络应用程序以从文件中读取