网络编程基础(socket,httpurlconnection)

来源:互联网 发布:最优化理论与算法pdf 编辑:程序博客网 时间:2024/06/07 12:12

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!!

1 0
原创粉丝点击