网络编程基础(socket,httpurlconnection)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值