java–Android TCP客户端.服务器仅在进程停止后接收消息

java–Android TCP客户端.服务器仅在进程停止后接收消息,第1张

概述参见英文答案>JavaSocketwhyservercannotreplyclient                                    4个我有简单的用Java编写的TCP服务器,我正在尝试为Android编写一个简单的TCP客户端,它将与在本地机器上运行的TCP服务器进行通信.我可以让

参见英文答案 > Java Socket why server can not reply client                                    4个
我有简单的用Java编写的TCP服务器,我正在尝试为AndroID编写一个简单的TCP客户端,它将与在本地机器上运行的TCP服务器进行通信.

我可以让服务器接收消息,但奇怪的是它只是在我通过Eclipse中的“设备”窗口停止应用程序进程后才收到消息.

在AndroID客户端上,我有主UI线程,其中包含输入IP地址和端口号的字段(这一切都正常,所以我不包括它的代码).单击连接按钮时,它会启动一个新的ASyncTask来执行TCP套接字工作.

这是ConnectionTask类的doInBackground方法的代码:

    protected VoID doInBackground(VoID... params)     {       String authMessage = "Authorize";    boolean connected=false;    try     {                   Socket clIEntSocket = new Socket();        SocketAddress serverAddress = new InetSocketAddress(address,port);        Log.v("Connection Thread", serverAddress.toString());        clIEntSocket.connect(serverAddress, 15);        if(clIEntSocket.isConnected())        {            connected = true;            Log.v("Connection Thread", "Connection Successful");            DataOutputStream outToServer = new DataOutputStream(clIEntSocket.getoutputStream());            BufferedReader inFromServer = new BufferedReader(new inputStreamReader(clIEntSocket.getinputStream()));            outToServer.writeBytes(authMessage);            Log.v("Connection Thread", "Sent Auth Message");            String response = inFromServer.readline();            Log.v("TCP ClIEnt", "Response: " + response);            hash = computeHash(response.getBytes());            //send the computed hash to the server            outToServer.writeBytes(hash);            outToServer.close();            inFromServer.close();            clIEntSocket.close();        }        else        {            Log.v("Connection Thread", "Not Connected yet...");        }    }     catch (Exception e)     {        Log.v("Connection Thread", e.getMessage());    }       return null;}

当我按下连接按钮时,在模拟器中我看到日志最多为“已发送身份验证消息”但我的服务器在我通过DDMS终止进程之前没有收到消息“授权”.

这是服务器代码:

    public class Server{       private static SecureRandom random = new SecureRandom();       public static voID main(String argv[]) throws Exception       {             String rawClIEntMessage,lcclIEntMessage;             ServerSocket welcomeSocket = new ServerSocket(5000);             System.out.println("Starting Server...");             while(true)             {                Socket connectionSocket = welcomeSocket.accept();                BufferedReader inFromClIEnt = new BufferedReader(new inputStreamReader(connectionSocket.getinputStream()));                DataOutputStream outToClIEnt = new DataOutputStream(connectionSocket.getoutputStream());                rawClIEntMessage = inFromClIEnt.readline();                if(rawClIEntMessage!=null)                {                    lcclIEntMessage = rawClIEntMessage.tolowerCase() + '\n';                    System.out.println("Received Message! Contents: " + rawClIEntMessage);                    if(lcclIEntMessage=="authorize")                    {                        System.out.println("Received auth request message, generating key...");                        String key = generateKey();                        //send key back                        outToClIEnt.writeBytes(key);                        System.out.println("Key sent!");                    }                }                try                {                    inFromClIEnt.close();                    outToClIEnt.close();                    connectionSocket.close();                }                catch(Exception e)                {                    System.out.println(e.getMessage());                }             }       }       private static String generateKey()       {             return new BigInteger(130, random).toString(32);       }}

编辑:

以下是对所发生情况的逐步总结:

>我启动服务器(它阻止等待连接并读取“服务器启动…”)
>我输入192.168.0.100端口5000进入androID客户端并点击“连接”按钮
>单击时创建ASyncTask,上面列出了我的套接字代码
>服务器控制台上还没有收到任何内容……
>(我可以再次按连接,不会发生任何事情)(LogCat也会读取“发送验证消息”日志)
>我通过Eclipse设备窗口在模拟器上终止进程
>服务器控制台打印:收到消息!内容:授权(如果我点击连接两次,则显示两次消息)

基本上它似乎是存储消息,并在程序结束后让它们全部出线.

任何帮助表示赞赏,谢谢!可以发布更多代码,包括主UI线程和其他扩展ASyncTask的ConnectionTask类(如果需要).

谢谢!

解决方法:

你正在读行,但你不是在写行. readline()将阻塞,直到它收到一个行终止符,你永远不会发送一个.由于您收到的数据是二进制的,因此您不应该尝试使用readline()来读取它.重新考虑您的数据流.

总结

以上是内存溢出为你收集整理的java – Android TCP客户端.服务器仅在进程停止后接收消息全部内容,希望文章能够帮你解决java – Android TCP客户端.服务器仅在进程停止后接收消息所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存