我正在开发一个Android客户端应用程序,它通过普通的TCP Socket与服务器通信,我们假设服务器ip 192.168.1.2和androdi设备ip是192.168.1.3。
我打开套接字,检查套接字是否已连接(我的结果是真的)然后我写了一条演示文稿消息。
这是我的代码
// scoket setup
Sockets = new Socket(addressToConnect, 2015);
s.setSoTimeout(2500);
setTcpNoDelay(true);
// if i'm connected
if (s.isConnected()) {
// wrapping streams
DataInputStream dis = new DataInputStream(s.getInputStream());
DataOutputStream dos = new DataOutputStream(s.getOutputStream());
// sending data
String presentationMessage = "Presentation message content--- TERM";
dos.write(presentationMessage.getBytes("UTF-8");
dos.flush();
// buffers
byte[] readBuffer = new byte[4096];
StringBuffer responseBuffer = new StringBuffer();
// read data until command terminator string is found
boolean readResponse = true;
while (readResponse) {
int dataBufferLength = dis.read(readBuffer);
String chunk = new String(readBuffer, 0, dataBufferLength, "UTF-8"));
responseBuffer.append(chunk);
readResponse = ! chunk.endWith("--- TERM");
}
// Process data here
} else {
// Notify missing connection here
}
// here i close the socket
当我执行这段代码时,执行似乎就像一个魅力,直到第一次读取超时。
使用第三台机器嗅探使用过的WIFI网络即使代码在读取超时之前没有抛出任何异常,我也看不到连接建立和写入的流。
我在清单中授予 android.permission.INTERNET 。
是否还有其他权限可以授予?或者我做错了什么?
在标准Java SE环境中执行相同的代码一切顺利。
我正在测试Nexus 5,Nexus 9和Samsung S3和S4上的代码,该项目与API 14 +兼容
修改:修复了代码示例中的拼写错误
答案 0 :(得分:0)
你正在阅读dos并写信给dis。你应该改变这一点。