
参见英文答案 > 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客户端.服务器仅在进程停止后接收消息所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)