Socket编程之通信原理

来源:互联网 发布:office for mac 2016 编辑:程序博客网 时间:2024/06/14 00:50

    socket网络编程原理:

  

              通信原理图 

              

             通过这幅原理图我们不难发现,两个socket实体之间通过TCP/ip协议进行通信。所以为了方便理解,便有了服务器端和客户端(其实它们之间并没有严格的界限,因为它们都可以进行I/O操作)

         1.使用ServerSocket创建TCP的服务器端(主动姿态去接收请求)

                              构造方法如下:

                ServerSocket    ss =  new ServerSocket(int port);//port是一个有效的端口0~65535(一般推荐使用1024以上的端口)

                ServerSocket    ss =  new ServerSocket(int port,int backlog);//backlog是一个用来改变队列长度的参数

                ServerSocket    ss =  new ServerSocket(int port,int backlog,InetAddress localAddr);//localAddr是机器出现多个IP地址的情况下允许绑定固定的IP地址

                 监听客户端请求的方法

         Socket      accept();该方法返回一个客户端请求的Socket对象,如果没能发现,则一直处于等候状态,线程也会被堵塞。

一段代码示例:


                                ServerSocket    ss = new ServerSocket(3000);

                               while(true){

                                Socket   s = ss.accept();

                                 OutputStream  os =s.OutputStream();

                                os.write("hello world!!!".getBytes("utf-8"));

                                os.close();

s.close();  

                                }

               该段代码能实现向3000端口发送请求的客户端发送hello  world!!!

      2.使用socket进行通信

                    构造方法如下
              Socket   s  = new Socket(InetAddress/String remoteAddress,int port);
          // 指定远程的主机,远程端口
            Socket   s  = new Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort);
          // 指定远程的主机,远程端口,本地的IP地址和本地的端口,适合本地IP地址比较多的情况
                       例:(一下代码不能运行在UI线程中,防止造成主线程的堵塞)
                  Socket   s = new Socket("192.168.1.100",30000);
            //运行这个就相当于一个请求,下面就可以对服务端进行通信了
                 BufferedReader br = new BufferedReader(
                               new InputStreamReader(
                               s.getInputStream()));
               //创建一个字符流对象用来读来自服务器端的信息
              //注:为了提高传输速率,数据在链路层是以字节流的形式存在。所以需要封装成字节流输出
                String  s = br.readLine();
                .......
                 br.close();
                 s.close();
                   
                <uses-permission android:name="android.perssion.INTERNET"/>

                授予访问网络的权限

                  

         

1 0
原创粉丝点击