```````````````````````````````````````````````````````````````````````````````
socket:
1.网络七层由下往上:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层
2.ip协议--网络层 tcp协议--传输层 http协议(基于tcp链接)--应用层
3.tcp/ip是传输层协议,解决数据如何在网络中传输;而http是解决如何包装数据.
4.socket主要有两种传输方式:面向连接(tcp,安全性高,效率低) 和 无连接(udp? 安全性不高,效率高)
5.套接字连接过程三个步骤:服务器监听,客户端请求,连接确认。
6.socket的代码实现:
Socket 客户端
要想使用Socket来与一个服务器通信,就必须先在客户端创建一个Socket,并指出需要连接的服务器端的IP地址和端口,代码如下:
Socket socket = new Socket("192.168.1.110",33221);//"192.168.1.110"是IP地址,33221是端口号
ServerSocket 服务器端
创建一个服务器端的代码:
ServerSocket server = null;
server = new ServerSocket(33221);//服务器端在33221端口号监听客户请求,在这里服务器端只能接收一个请求,接收后服务器端就退出了。实际的应用中总是让他不
停地循环接收,一旦有客户请求,服务器端总是会创建一个服务器线程来服务新来的客户,而自己则继续监听。
Socket socket = server.accpet();//accpet()为一个阻塞函数,即该方法被调用后将等待客户的请求,直到有一个客户启动并请求连接到相同的端口,然后accept
返回一个对应于客户端的Socket.这时,客户方和服务方都建立了用于通信的Socket,接下来就由各个Socket分别打开各自的输入
输出流。
输入、输出流
Socket 提供了getInputStream()和getOutPutStream()来得到对应的输入(输出)流以进行读(写)操作,这两个方法分别返回InputStream和OutputStream类对象。
为了便于读(写)数据,可以在返回输入、输出流对象上建立过滤流。如:DataInputStream、DataOutPutStream、或PrintStream类对象。对于文本方式流对象,可以采用
InputStreamReader和OutputStreamWriter、PrintWirter处理 代码如下:
PrintStream os = new PrintStream(new BufferedOutputStream(Socket.getOutputStream()));
DataInputStream is = new DataInputStream(socket.getInputStream());
PrintWriter out = new PrintWriter(socket.getOutStream(),true);
BufferedReader in = new ButfferedReader(new InputStreamReader(Socket.getInputStream()));
关闭Socket和流
在Socket使用完毕后需要将其关闭,以释放资源。
注意:在关闭Socket之前,应将与Socket相关的所有的输入、输出流先关闭,以释放资源。要注意关闭的顺序。
os.close();//输出流先关闭
is.close();//输入流其次
socket.close();//最后关闭Socket
算法:
1.分治法:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,各个击破.
特征:①问题规模缩小到一定程度可以容易解决
②分解成若干规模较小的相同问题
③子问题的解可以合并为问题的解(关键)
④各个子问题是相互独立的
2.动态规划算法:
条件:①满足最优化原理(每一个子策略对于它的初态和终态都是最优的)
②满足无后效性(当前状态与前后的没有关系)
步骤:初始状态→│决策1│→│决策2│→…→│决策n│→结束状态(是最优路线)
①划分阶段(按照时间/空间)
②确定状态和变量(将问题发展到各个阶段的不同状态表示出来。状态的选择要满足无后效性)
③确定决策并写出状态转移方程
④寻找边界条件:状态转移方程是一个递推式,需要一个递推终止的边界条件
三要素:问题的阶段/阶段的状态/阶段转化间的递推关系
3贪心算法:对问题求解时,总是做出在当前看来是最好的选择.
思路:①简历数学模型来描述问题
②把问题分成若干个子问题
③对每一个子问题求最优解
④把子问题的解合成原来问题的解
值得注意的是:贪心算法并不是完全不可以使用,贪心策略一旦经过证明成立后,它就是一种高效的算法,可以依赖先前做出的选择,但不能一来后来的选择。
贪心算法还是很常见的算法之一,这是由于它简单易行,构造贪心策略不是很困难。可惜的是,它需要证明后才能真正运用到题目的算法中。
4.回溯法:是一种选优搜索法,按选优条件向前搜索以达到目标.如果探索到某一步发现前面的选择不忧或达不到目标,就回退一步重新选择.(例子:走迷宫)
步骤:①针对所给的问题,定义问题的解空间
②确容易搜索的解空间结构
③搜索解空间,在搜索过程中用剪枝函数避免无效搜索
5.穷举法:列出问题的所以可能解,逐一进行判别,找出满足条件的解.
关键:如何列出所有的可能解
如何判断可能解是否满足条件
数据结构:数据元素相互之间的关系成为结构.
四种基本结构:集合,线性,树形,图形
集合:
线性:元素之间一对一,如数组,链表,队列,栈
树形:一对多关系,如二叉树,查找树
图形:多对多关系,
特点
数组:长度不可变,直接算出内粗地址去读,所以通过索引访问效率很高
列表(List):数组的延伸,长度可变
|--ArrayList 通过index访问效率高,但中间插入数据效率低(需要把插入点后的数据都往后挪)
|--LinkedList 中间插入数据效率高(只改变指针指向),索引访问没有ArrayList快.
集合(Set):其中的数据都是唯一的,不保证元素的顺序
LinkedHashSet 有序,查询快,元素去重
袋子(Bag):和Set类似,不一样的是: 袋子里面对每个key计数,所以如果同一个key被加入多次那么可以通过接口获取这个key在这个袋子里面的个数
树(Tree):
堆(heap):任意一个节点的值都比它的子节点大
二叉搜索树(binary search tree):树的左边的所有key值都比根节点的key值小,右边的所以key值都比根节点的key值大.从左向右遍历就可以得到一个有序序列.
Merkle Tree(Hash Tree)
merkle tree主要用在对数据的校验上,对于一个很大的文件在两个机器之间进行传输的时候, 会这个文件切成很多的小块,然后对每一块计算hash值然后再把这些hash组成一个tree结构: 这个tree里面的每个叶节点对应具体的文件块的hash, 而非叶节点的值则是它子节点的hash的hash, 这样传输好了之后计算hash tree, 把这个hash tree和之前传输过来的hash tree进行对比就可以在logN的比较次数内找到那些数据有问题
B-/B+ Tree
B-树是二叉搜索树的一种泛化 — m叉搜索树, 每个节点可以有多于两个子节点。B-/B+树多用在数据库/文件系统的设计中, 树中存储的数据实际是实际数据的一级索引,二级索引,三级索引, 这样可以保证在确定的时间内查找到一个具体的数据 – 具体时间取决于每个节点上的数据量以及索引的层数。
红黑树
红黑树是一种特殊的二叉搜索树, 它在插入,删除数据的时候自动调整树结构,保证树结构的平衡。 它比AVL树对于平衡的要求弱一点,所以在插入数据的时候比AVL树要快, 在查询数据的时候比AVL可能要稍微慢一点。 TreeMap就是利用红黑树来存储数据的.
2014-01-06 夜