首页 > 解决方案 > 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();
            }
        }
    }

标签: javaandroidpostserversocket

解决方案


推荐阅读