zoukankan      html  css  js  c++  java
  • 《精通android网络开发》--使用Socket实现数据通信

    No1:

    网络传输应用通常使用TCP、IP或UDP这三种协议实现数据传输。在传输数据的过程中,需要通过一个双向的通信连接实现数据的交互。在这个传输过程中,通常将这个双向链路的一端称为Socket,一个Socket通常由一个IP地址和一个端口号来确定。

    No2:

    在网络编程中有两个主要的问题,一个是如何准确地定位网络上的一台或多台主机,另一个就是找到主机后如何可靠高效地进行数据传输。

    在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。而TCP层则提供面向应用的可靠(TCP)的或非可靠(UDP)的数据传输机制。

    No3:

    Socket工作过程基本步骤:

    1)创建Socket

    2)打开连接到Socket的输入/输出流

    3)按照一定的协议对Socket进行读/写操作

    4)关闭Socket

    No4:

    聊天室程序在服务端包含多条线程,其中每个Socket对应一条线程,该线程负责读取Socket对应输入流的数据(从客户端发送过来的数据),并将读到的数据向每个Socket输出流发送一遍(将衣蛾客户端发送的数据“广播”给其他客户端),因此需要在服务器端使用List来保存所有的Socket。

    public class IServer{
        //定义保存所有Socket的ArrayList
        public static ArrayList<Socket> socketList = new ArrayList<Socket>();
        public static void main(String[] args) throws IOException{
            ServerSocket ss = new ServerSocket(3000);
            while(true){
                //此行代码会阻塞,将一直等待别人的连接
                Socket s = ss.accept();
                socketList.add(s);
                //每当客户端连接后启动一条ServerThread线程为该客户端服务
                new Thread(new Serverxian(s)).satart();
            }
        }
    }
    //负责处理每个线程通信的线程类
    public class Serverxian implements Runnable{
        //定义当前线程所处理的Socket
        Socket s = null;
        //该线程所处理的Socket所对应的输入流
        BufferedReader br = null;
        public Serverxian(Socket s) throws IOException{
            this.s = s;
            //初始化该Socket对应的输入流
            br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        }
        
        public void run(){
            try{
                String content = null;
                //采用循环不断从Socket中读取客户端发送过来的数据
                while((content = readFromClient())!=null){
                    //遍历socketList中的每个Socket
                    //将读到的内容向每个Socket发送一次
                    for(Socket s:IServer.socketList){
                        PrintStream ps = new PrintStream(s.getOutputStream());
                        ps.println(content);
                    }
                }
            }catch(IOException e){
                //e.printStackTrace();
            }
        }
        //定义读取客户端数据的方法
        private String readFromClient(){
            try{
                return br.readLine();
            }catch(IOException e){
                //如果捕捉到异常,表明该Socket对应的客户端已经关闭
                //删除该Socket
                IServer.socketList.remove(s);
            }
            return null;
        }
    }
  • 相关阅读:
    Android:RelativeLayout相对布局(转)
    Android:LayoutInflater作用及使用(转)
    keepalive安装配置
    nginx 多级7层代理安装配置
    k8s使用cephfs
    haproxy安装及配置
    通过nodeSelector配置项实现pod部署至指定node
    SFTP使用key文件登录
    k8s使用ceph存储
    nginx开启gzip压缩后导致apk包下载不能正常安装
  • 原文地址:https://www.cnblogs.com/anni-qianqian/p/8423439.html
Copyright © 2011-2022 走看看