1.socket 需要 主机地址和端口
2.url 由主机地址端口号资源地址组成(端口号没有时默认为-1 通常设置成80,主机地址为域名时需要DNS解析服务器或者本地host)
3.二者协同合作 是在传输层
4.urlconnection 是在应用层
5.urlconnection 封装了协议和Socket. 所以请求头和响应头的自动封包拆包了。
6.Socket是在传输层所以头信息都会被读下来因为无法拆包。
7.ServerSocket 绑定的是本地的IP(内网IP)内网连接外网是可以的 。而其他外网想要连接这个内网需要在外网上做一个端口映射。
8.ServerSocket 参数中 除了端口,还有队列数,这里指的是可连接的客户端数目。由于ServerSocket 的accept()循环调用所以设置最大连接数。
9.url对象可以直接开流 openStream() 返回一个inputStream对象。 本质是先url连接后执行开流方法。用url这个方法可以直接读取网络资源。
10.urlConnection对象 是url openConnection()方法返回的。这个方法只是建立了对象并没有连接。执行connect()才是建立实际连接(可省!因为开流后会自动触发该方法)
11.GET和POST请求,头字段有默认设置可不用设置。都需要配合流进行操作。inputStream 默认设置是ture,而outputStream 默认设置是false.所以post请求一定要设置setDoOutpu(ture)。
12.HTTPURLConnection 有getResponsecode() 200说明连上了。 设置SetRequestMethod().其他的和urlConnnection很像。disconnect()用于关闭HTTP连接。
13 HTTPUrlConnection 更为灵活 因为是用流的方式对服务端进行请求的发送。而用HTTPClient 则要将参数按照指定的形式放进去
14HTTPClient 需要定义一个客户端 defaultHttpClient(); 对于POST方法而言 调用
setEntiy(UrlEncodedFormEntity entity(list<?extends NameValuePair> (BasicNameValuePair("key",)value)))各种参数要注意一层一层的参数。最后是键值对形式的数据。
显然这种方式不够灵活。
15使用httpClient 执行方法后获取httpResponse对象后也可以进行返回码的判断,内容的处理(返回流对象)要注意在finally块中关闭HTTP连接的方法是 if(client!=null)
client.getConnectionManager().shutdown()
最后粘上一段HttpUrlconnection获取返回信息的示例代码:
public class HttpUtils {
public HttpUtils() {
super();
}
//通过传入接口 对收到的数据进行后续的操作。减少了程序之间的耦合性。
public void sendhttprequest(final String adress , final HttpCallbackListner listner) {
//在参数中加fianl 是出于安全性考虑防止变量在方法内被修改发生不可知的事情。
new Thread(new Runnable() {
@Override
public void run() {
HttpURLConnection connection=null;
try {
URL url=new URL(adress);
connection=(HttpURLConnection)url.openConnection();
connection.setReadTimeout(8000);
connection.setRequestMethod("GET");
//必须大写
InputStream inputStream=connection.getInputStream();
BufferedReader bfinputStream=new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder=new StringBuilder();
String line;
while((line=bfinputStream.readLine())!=null){
builder.append(line);
}
if (listner!=null){
listner.onFinish(builder.toString());
}
} catch (IOException e) {
if(listner==null){
listner.onError(e);
}
e.printStackTrace();
if (connection!=null);
connection.disconnect();
}
}
}).start();
}
}
定义接口:
public interface HttpCallbackListner {
void onFinish(String response);
void onError(Exception e);
}
附上socket 客户端测试:
public class Connectservice {
Socket client=null;
public Connectservice() {
try {
client=new Socket("115.159.42.189",18088);
client.setSoTimeout(5000);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 发送数据到服务器socket
* @param data 要发送数据
*/
public void sentservice(String data) {
try {
OutputStream outputStream = client.getOutputStream();//写入服务器信息流
if(outputStream!=null){
//转换成字符流
BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(outputStream));
//写入
writer.write(data);
//发送
writer.flush();
//缓冲流刷新
outputStream.flush();
}else {
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 读取服务端socket数据方法
* @return 返回数据
*/
public String receiveservice() {
String content=null;
try {
InputStream inputStream = client.getInputStream();
if(inputStream!=null) {
byte[] temp = new byte[1024 * 3];
int contents = inputStream.read(temp);
content = new String(temp, 0, contents);
}
else {
Log.d("连接失败","连接失败");
content="连接失败";
}
} catch (IOException e) {
e.printStackTrace();
}
return content ;
}
注意 服务端认为 关闭了流则断开连接 这里我们没有关闭流
另外发送数据注意flash!!