Jac*_*ack 3 sockets android http
所以我已经搜索了网络(主要是SO,谷歌),以找到Android的套接字编程的好例子.我做了很多Android开发(只是没有套接字).我不明白为什么我的readLine()总是返回NULL.请忽略这些可怕的代码,这对于朋友来说是一个快速而肮脏的原型.我的总体目标是建立与服务器的连接,发送标题数据(GET/MOUNTPOINT Content-Type:... etc ...),并根据我需要继续流或关闭的响应接收响应它.这是我最近的尝试代码:
String userPass = new String(Base64.encodeToString("user:password".getBytes(), Base64.DEFAULT));
boolean connected = false;
String requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
requestmsg += "User-Agent: MYCUSTOMAGENT\r\n";
requestmsg += "Accept: */*\r\n";
requestmsg += "Connection: close\r\n";
requestmsg += "Authorization: Basic " + userPass;
requestmsg += "\r\n";
DataOutputStream dos = null;
DataInputStream dis = null;
try {
Log.d("ClientActivity", "Connecting...");
Socket socket = new Socket("1.2.3.4", 9000);
connected = true;
String data = "";
while (connected) {
try {
Log.d("ClientActivity", "C: Sending command.");
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream());
dos.write(requestmsg.getBytes());
Log.i("ClientActivity", "RequestMsg Sent");
StringBuilder sb = new StringBuilder();
while ((data = dis.readLine()) != null)
{
sb.append(data);
}
Log.i("ClientActivity", "C: Sent.");
} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
}
socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
connected = false;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用HttpClient API,但它在标题中插入了"GET /"消息,我需要指定"GET/MOUNTPOINT".另外我不知道HttpClient是否允许流式传输.我也尝试过URLConnection,但它默认也会插入GET或POST.谢谢你的帮助!
我也尝试过以下方法:
SocketAddress sockaddr = new InetSocketAddress("1.2.3.4", 9000);
nsocket = new Socket();
nsocket.connect(sockaddr, 10 * 1000); // 10 second connection timeout
if (nsocket.isConnected()) {
//nsocket.setSoTimeout(20 * 1000); // 20 second timeout once data is flowing
nis = nsocket.getInputStream();
nos = nsocket.getOutputStream();
Log.i(NTAG, "Socket created, streams assigned");
// Build request message
requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
requestmsg += "User-Agent: MYANDROIDAGENT\r\n";
requestmsg += "Accept: */*\r\n";
requestmsg += "Connection: close\r\n";
requestmsg += "Authorization: Basic " + userPass;
requestmsg += "\r\n";
nos.write(requestmsg.getBytes());
nos.write(genGPGGA().getBytes());
Log.i(NTAG, "Waiting for inital data...");
byte[] buffer = new byte[4096];
int read = nis.read(buffer); // This is blocking
//Log.i("ReadNTRIP", tempdata.toString());
String test = "TESTING";
while (read != -1) {
tempdata = new byte[read];
System.arraycopy(buffer, 0, tempdata, 0, read);
read = nis.read(buffer, 0, 4096); // This is blocking
}
}
} catch (SocketTimeoutException ex) {
ex.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
nis.close();
nos.close();
nsocket.close();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Log.i(NTAG, "Finished");
}
Run Code Online (Sandbox Code Playgroud)
但是read总是返回-1.我准备把头发拉出来.
编辑:我添加了一个赏金(值得很少) - 我没有太多代表给予,但这个问题已经成为我的一个显示阻止.为了得到赏金,写一个简单的android程序连接到thor.lsu.edu,端口9000,发送一个简单的GET/HTTP/1.0命令并实际获取数据(使用套接字 - 不能与URLConnection或HttpClient).发布程序和结果的屏幕截图.我尝试了很多不同的方法,我不知道还能做什么(使用InputStreams,BufferedInputStreams,InputStreamReaders等...).我甚至使用了一个示例Android程序(THAT WORKS),但我仍然没有在我的实现中获取数据.我不知道它是时间问题还是什么问题.
谢谢
编辑:我注意到我甚至无法浏览到Androids浏览器中的http://thor.lsu.edu:9000.它给出了数据连接问题.知道为什么这个端口可能被阻止了吗?
我所做的只是对您的代码进行了一些修改.我认为主要的变化就是不使用DataInputStream,因为文档明确表示不再对此数据结构使用readLine().http://download.oracle.com/javase/1.4.2/docs/api/java/io/DataInputStream.html#readLine%28%29
我也删除了授权内容,因为它不是必需的.如果您在某处运行此代码,您会注意到日志打印出HTTP响应.
String requestmsg = "GET /MOUNTPOINT" + " HTTP/1.0\r\n";
requestmsg += "User-Agent: MYCUSTOMAGENT\r\n";
requestmsg += "Accept: */*\r\n";
requestmsg += "Connection: close\r\n";
// requestmsg += "Authorization: Basic " + userPass;
requestmsg += "\r\n";
DataOutputStream dos = null;
BufferedReader dis = null;
try {
Log.d("ClientActivity", "Connecting...");
Socket socket = new Socket("thor.lsu.edu", 9000);
String data = "";
try {
Log.d("ClientActivity", "C: Sending command.");
dos = new DataOutputStream(socket.getOutputStream());
dis = new BufferedReader(new InputStreamReader(socket.getInputStream()));
dos.write(requestmsg.getBytes());
Log.i("ClientActivity", "RequestMsg Sent");
StringBuilder sb = new StringBuilder();
while ((data = dis.readLine()) != null) {
sb.append(data);
}
Log.i("ClientActivity", "C: Sent.");
Log.i("ClientActivity", "C: Received " + sb.toString());
} catch (Exception e) {
Log.e("ClientActivity", "S: Error", e);
}
socket.close();
Log.d("ClientActivity", "C: Closed.");
} catch (Exception e) {
Log.e("ClientActivity", "C: Error", e);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5262 次 |
| 最近记录: |