java–Android上两个应用程序之间的套接字通信

java–Android上两个应用程序之间的套接字通信,第1张

概述我的Android应用程序存在很大问题,我想请求您的帮助.我目前正在使用套接字编写AndroidClietn-Server应用程序.我在互联网上找到了很多辅导员,从中我已经为我的项目创建了基础知识.但是,所有教程仅适用于一个消息发送,这就是全部.我需要发送更多它们,所以我一直在尝试修改它.这是

我的Android应用程序存在很大问题,我想请求您的帮助.

我目前正在使用套接字编写AndroID ClIEtn-Server应用程序.我在互联网上找到了很多辅导员,从中我已经为我的项目创建了基础知识.但是,所有教程仅适用于一个消息发送,这就是全部.我需要发送更多它们,所以我一直在尝试修改它.

这是负责服务器和客户端的代码片段.其余的在这个时候并不重要.

服务器:

@OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.main);        serverStatus = (TextVIEw) findVIEwByID(R.ID.server_status);        recivedMsg = (TextVIEw)findVIEwByID(R.ID.rec_msg);        SERVERIP = getLocalipAddress();        Thread fst = new Thread(new ServerThread());        fst.start();    }    public class ServerThread implements Runnable {        public voID run() {            try {                if (SERVERIP != null) {                    handler.post(new Runnable() {                        @OverrIDe                        public voID run() {                            serverStatus.setText("Listening on IP: " + SERVERIP);                        }                    });                    serverSocket = new ServerSocket(SERVERPORT);                    while (true) {                        // Listen for incoming clIEnts                        Socket clIEnt = serverSocket.accept();                        handler.post(new Runnable() {                            @OverrIDe                            public voID run() {                                serverStatus.setText("Connected." + System.getProperty("line.separator"));                            }                        });                        try {                            line = null;                            while (connected) {                                BufferedReader in = new BufferedReader(new inputStreamReader(clIEnt.getinputStream()));                                if((line = in.readline())!=null)                                {                                    Log.d("ServerActivity", line);                                    handler.post(new Runnable() {                                        @OverrIDe                                        public voID run() {                                            if(recivedMsg.equals("CLOSE"))                                            {                                                recivedMsg.append("CLOSE socket");                                                connected = false;                                            }                                            else                                            {                                                recivedMsg.append("MSG: " + line + System.getProperty("line.separator"));                                            }                                            // do whatever you want to the front end                                            // this is where you can be creative                                        }                                    });                                }                                else                                {                                    recivedMsg.append("empty" + System.getProperty("line.separator"));                                }                            }                            break;                        } catch (Exception e) {                            handler.post(new Runnable() {                                @OverrIDe                                public voID run() {                                    serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");                                }                            });                            e.printstacktrace();                        }                    }                } else {                    handler.post(new Runnable() {                        @OverrIDe                        public voID run() {                            serverStatus.setText("Couldn't detect internet connection.");                        }                    });                }            } catch (Exception e) {                handler.post(new Runnable() {                    @OverrIDe                    public voID run() {                        serverStatus.setText("Error");                    }                });                e.printstacktrace();            }        }    }

客户

@OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.main);        serverIp = (EditText) findVIEwByID(R.ID.server_ip);        connectPhones = (button) findVIEwByID(R.ID.connect_phones);        sendFIEld = (EditText) findVIEwByID(R.ID.send_fIEld);        sendMsg = (button) findVIEwByID(R.ID.msg_send);        connectPhones.setonClickListener(connectListener);        sendMsg.setonClickListener(sendMessage);    }    @OverrIDe    protected voID onStop() {         super.onStop();         try {                 BuffereDWriter out = new BuffereDWriter(new OutputStreamWriter(s.getoutputStream()));                 //send output msg                 String outMsg = "CLOSE";                  out.write(outMsg);                 out.flush();                 // make sure you close the socket upon exiting                 s.close();         } catch (IOException e) {                 e.printstacktrace();         }    }    private OnClickListener connectListener = new OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            serverIpAddress = serverIp.getText().toString();            runTcpConnection();            sendMessagetoServer("Msg");        }    };    private OnClickListener sendMessage = new OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            sendMessagetoServer(sendFIEld.getText().toString());        }    };    private voID runTcpConnection() {        try {            s = new Socket(serverIpAddress, SERVERPORT);            BuffereDWriter out = new BuffereDWriter(new OutputStreamWriter(s.getoutputStream()));            //send output msg            String outMsg = "TCP connecting to " + SERVERPORT + System.getProperty("line.separator");             out.write(outMsg);            out.flush();            Log.i("TcpClIEnt", "sent: " + outMsg);            SystemClock.sleep(10);            s.close();        } catch (UnkNownHostException e) {            e.printstacktrace();        } catch (IOException e) {            e.printstacktrace();        }    };    public voID sendMessagetoServer(String str) {        try {                    s = new Socket(serverIpAddress, SERVERPORT);                    BuffereDWriter out = new BuffereDWriter(new OutputStreamWriter(s.getoutputStream()));                    //send output msg                    String outMsg = str + System.getProperty("line.separator");                     out.write(outMsg);                    out.flush();                    Log.i("TcpClIEnt", "sent: " + outMsg);                    s.close();                } catch (UnkNownHostException e) {                    // Todo auto-generated catch block                    e.printstacktrace();                    Log.d("", "hello222");                } catch (IOException e) {                    // Todo auto-generated catch block                    e.printstacktrace();                    Log.d("", "hello4333");                }            }

目前设备连接正确.此外,他们正在发送第一个连接消息(OnClickListener connectListener中的消息).问题是,当我尝试使用sendMessagetoServer发送另一条消息时,这是不可能的.这些消息仅在客户端活动被销毁后显示.

非常有趣的是没有SystemClock.sleep(10);监听器runTcpConnection()表现得很奇怪.只有’连接’.显示在服务器上.

有人能告诉我我必须做些什么才能正常发送消息吗?

编辑:
这是我发现的事情:

>如果我在连接发送的消息多于所有消息(空)并且在第二个连接错误显示之后 – 请重新连接电话
>如果我在sendMessagetoServer中没有s.close行发送更多消息的连接,则只传递一条消息.之后没有显示错误.
>消息表单runTcpConnection始终显示(除非在此函数中没有SystemClock.sleep(10))

希望它能帮助别人诊断我的错误.

解决方法:

正如我所看到的,每当用户点击按钮发送时你都会创建一个新套接字,对吧?我建议您在用户单击connect时只启动一次,然后在send click事件中使用它(因为这是TCP,如果您创建新的socket实例,您将断开连接到服务器)
所以,你应该在sendMessagetoServer中删除这些行:

s = new Socket(serverIpAddress, SERVERPORT);s.close();

和runTcpConnection中的这一行

s.close();

每当您不希望与服务器通信时,套接字应该关闭(onstop是一个示例,或者当更改活动时……)
此外,您也应该只创建一个BuffereDWriter实例.
希望这有帮助.

总结

以上是内存溢出为你收集整理的java – Android上两个应用程序之间的套接字通信全部内容,希望文章能够帮你解决java – Android上两个应用程序之间的套接字通信所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1117698.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存