• 20170403总结


    20170319 - 20170403学习内容:

           1.Android网络应用:

               (1) 基于TCP协议的网络通信:

                      IP协议负责将消息从一个主机传送到另一个主机,消息在传送过程中被分割成一个个小包。

             TCP协议负责收集这些信息包,并将其按适当的次序放好传送,在接收端收到后再将其正确的还原;

          (2)使用ServerSocket创建TCP服务器端

           在两个通信实体没有建立虚拟链路之前,必须有一个通信实体先做出“主动姿态”,主动接受来自其他通信实体的连接请求。

           Java中能接收其他通信实体连接请求的类是ServerSocket。

    /**
    *服务器端
    */
    1
    //创建一个ServerSocket,用于监听客户端Socket的连接请求 2 ServerSocket ss = new ServerSocket(30000); 3 //采用循环不断接收来自客户端的请求 4 while(true){ 5 //每当接收到客户端Socket的请求时,服务器端也对应产生一个Socket 6 Socket s = ss.accept(); 7 //下面就可以使用Socket进行通信了 8 ...... 9 }

         使用Socket进行通信

               

    1 //创建连接到服务器ip地址(例如:118.89.228.123、端口30000的Socket)
    2 Socket s = new Socket("118.89.228.123",30000);
    3 //使用Socket进行通信
    4 
    5 ....


         使用Socket建立聊天室:

              服务器端:

             

     1 import java.io.IOException;
     2 import java.io.OutputStream;
     3 import java.io.PrintStream;
     4 import java.net.ServerSocket;
     5 import java.net.Socket;
     6 import java.security.Provider.Service;
     7 import java.util.ArrayList;
     8 
     9 
    10 public class MySever {
    11     //定义保存所有Socket的ArrayList
    12     public static ArrayList<Socket> socketList = new ArrayList<Socket>();
    13 
    14     public static void main(String[] args) throws IOException {
    15         ServerSocket ss = new ServerSocket(40000);
    16         while(true){    
    17             //此行代码会阻塞,将一直等待别人的连接
    18             Socket s = ss.accept();
    19             socketList.add(s);
    20             //每当客户端连接后启动一条ServerThread线程为该客户端服务
    21             new Thread(new ServerThread(s)).start();
    22         }
    23     }
    24 }


     

     1 import java.io.BufferedReader;
     2 import java.io.IOException;
     3 import java.io.InputStreamReader;
     4 import java.io.OutputStream;
     5 import java.io.UnsupportedEncodingException;
     6 import java.net.Socket;
     7 import java.net.SocketException;
     8 import java.util.Iterator;
     9 
    10 /**
    11  * 作用:负责处理每条线程通信的线程类
    12  * @author lenovo
    13  *
    14  */
    15 
    16 public class ServerThread implements Runnable{
    17     //定义当前线程所处理的Socket
    18     Socket s = null;
    19     //该线程所处理的Socket所对应的输入流
    20     BufferedReader br = null;
    21     public ServerThread(Socket s) throws IOException{
    22         this.s = s;
    23         //初始化该Socket对应的输入流
    24         br = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));
    25     }
    26 
    27     public void run() {
    28         try{
    29             // TODO Auto-generated method stub
    30             String content = null;
    31             //采用循环不断从Socket中读取客户端发送过来的数据
    32             while((content = readFromClient()) != null){
    33                 //遍历socketList中的每个Socket
    34                 //将读到的内容向每个Socket发送一次
    35                 for(Iterator<Socket> it = MySever.socketList.iterator();it.hasNext();){
    36                     Socket s = it.next();
    37                     OutputStream os;
    38                     try {
    39                         os = s.getOutputStream();
    40                         os.write((content + "
    ").getBytes("utf-8"));
    41                     } catch (SocketException e) {
    42                         // TODO Auto-generated catch block
    43                         e.printStackTrace();
    44                         it.remove();
    45                         System.out.println(MySever.socketList);
    46                     }
    47                 }
    48             }    
    49         }catch(IOException e){
    50             e.printStackTrace();
    51         }        
    52     }
    53     
    54     //定义读取客户端数据的方法
    55     private String readFromClient(){
    56         try {
    57             return br.readLine();
    58         } catch (IOException e) {  //如果捕捉到异常,表明该Socket对应的客户端已经关闭
    59             // TODO Auto-generated catch block
    60             e.printStackTrace();
    61             //删除该Socket
    62             MySever.socketList.remove(s);
    63         }
    64         return null;
    65     }
    66 
    67 }


     

          客户端:

     1 package com.crazyit.test;
     2 
     3 import android.app.Activity;
     4 import android.os.Bundle;
     5 import android.os.Handler;
     6 import android.os.Message;
     7 import android.view.View;
     8 import android.widget.Button;
     9 import android.widget.EditText;
    10 import android.widget.TextView;
    11 
    12 public class MainActivity extends Activity {
    13     private EditText input;
    14     private TextView show;
    15     private Button send;
    16     private Handler handler;
    17 
    18     //定义与服务器通信的子线程
    19     private ClientThread clientThread;
    20 
    21     @Override
    22     protected void onCreate(Bundle savedInstanceState) {
    23         super.onCreate(savedInstanceState);
    24         setContentView(R.layout.activity_main);
    25         input = (EditText) findViewById(R.id.input);
    26         send = (Button) findViewById(R.id.send);
    27         show = (TextView) findViewById(R.id.show);
    28 
    29         handler = new Handler(){
    30             @Override
    31             public void handleMessage(Message msg) {
    32                 //如果消息来自于子线程
    33                 if (msg.what == 0x123){
    34                     //将读取的内容追加显示在文本框中
    35                     show.append("
    " + msg.obj.toString());
    36                 }
    37             }
    38         };
    39         clientThread = new ClientThread(handler);
    40         //客户端启动ClientThread线程创建网络连接,读取来自服务器的数据
    41         new Thread(clientThread).start();
    42         send.setOnClickListener(new View.OnClickListener() {
    43             @Override
    44             public void onClick(View v) {
    45                 //当用户点击发送按钮后,将用户输入的数据封装成Message,然后发送给子线程的Handler
    46                 Message msg = new Message();
    47                 msg.what = 0x345;
    48                 msg.obj = input.getText().toString();
    49                 clientThread.revHandler.sendMessage(msg);
    50                 //清空input文本框
    51                 input.setText("");
    52             }
    53         });
    54     }
    55 }
     1 package com.crazyit.test;
     2 
     3 import android.os.Handler;
     4 import android.os.Looper;
     5 import android.os.Message;
     6 
     7 import java.io.BufferedReader;
     8 import java.io.IOException;
     9 import java.io.InputStreamReader;
    10 import java.io.OutputStream;
    11 import java.net.Socket;
    12 import java.net.SocketTimeoutException;
    13 
    14 /**
    15  * Created by Zeng on 2017/3/27.
    16  */
    17 public class ClientThread implements Runnable{
    18     private Socket s;
    19     //定义向UI线程发送消息的Handler对象
    20     private Handler handler;
    21     //定义接收UI线程的消息的Handler对象
    22     public Handler revHandler;
    23     //该线程所处理的Socket所对应的输入流
    24     BufferedReader br = null;
    25     OutputStream os = null;
    26 
    27     public ClientThread(Handler handler){
    28         this.handler = handler;
    29     }
    30 
    31     @Override
    32     public void run() {
    33         try {
    34             s = new Socket("118.89.228.123",30000);//服务器
    35 //            s = new Socket("172.16.69.122",40000);//本地运行
    36             br = new BufferedReader(new InputStreamReader(s.getInputStream()));
    37             os = s.getOutputStream();
    38             new Thread(){
    39                 @Override
    40                 public void run() {
    41                     String content = null;
    42                     try{
    43                         while ((content = br.readLine()) != null){
    44                             Message message = new Message();
    45                             message.what = 0x123;
    46                             message.obj = content;
    47                             handler.sendMessage(message);
    48                         }
    49                     }catch (IOException e){
    50                         e.printStackTrace();
    51                     }
    52                 }
    53             }.start();
    54             //为当前线程初始化Looper
    55             Looper.prepare();
    56             //创建revHandler对象
    57             revHandler = new Handler(){
    58                 @Override
    59                 public void handleMessage(Message msg) {
    60                     //接收UI线程中用户输入的数据
    61                     if (msg.what == 0x345){
    62                         //将用户在文本框输入的内容写入网络
    63                         try {
    64                             os.write((msg.obj.toString() + "
    ").getBytes("utf-8"));
    65                         } catch (IOException e) {
    66                             e.printStackTrace();
    67                         }
    68                     }
    69                 }
    70             };
    71             //启动Looper
    72             Looper.loop();
    73         }catch (SocketTimeoutException e1){
    74             System.out.println("网络连接超时!!!");
    75         }
    76         catch (IOException e) {
    77             e.printStackTrace();
    78         }
    79     }
    80 }


    2.学习OKHttp使用方法及其部分源码,接下来继续学习其实现机制。

    3.学习Java部分设计模式:

        (四)工厂模式: (1)静态工厂模式:TextUtil.isEmpty()

               (2)简单工厂模式:卖肉夹馍

               (3)工厂方法模式:把类的实例化过程推迟到子类

               (4)抽象工厂模式:提供一个接口,用于创建相关的或者依赖对象的家族,而不需要明确指定具体类

      (五)单例模式:(1)饿汉模式

    1 public class Singleton  
    2 {  
    3     private static Singleton instance = new Singleton();  
    4       
    5     public static Singleton getInstance()  
    6     {  
    7         return instance ;  
    8     }  
    9 } 

             (2)赖汉  

     1 public class Singleton02  
     2 {  
     3     private static Singleton02 instance;  
     4   
     5     public static Singleton02 getInstance()  
     6     {  
     7         if (instance == null)  
     8         {  
     9             synchronized (Singleton02.class)  
    10             {  
    11                 if (instance == null)  
    12                 {  
    13                     instance = new Singleton02();  
    14                 }  
    15             }  
    16         }  
    17         return instance;  
    18     }  
    19 }

          (3)枚举:

    1 public enum Singleton03  
    2 {  
    3     INSTANCE;  
    4 }  

          (4)使用一个持有类

     1 public class Singleton04  
     2 {  
     3     private static final class InstanceHolder  
     4     {  
     5         private static Singleton04 INSTANCE = new Singleton04();  
     6     }  
     7   
     8     public static Singleton04 getInstance()  
     9     {  
    10         return InstanceHolder.INSTANCE;  
    11     }  
    12 }  

     3、学习了Git的基本使用,下阶段将继续学习更多操作;

    上述许多代码来自张鸿洋大神的博客:特此注明:http://blog.csdn.net/lmj623565791/article/category/2206597

    总结:

         这两星期来总体学习效率不高,在学习开源开源项目时经常遇到很多问题,很多问题解决不了就很难以进行下一步的学习,这两周来看了两个关于使用百度推送的即时通信软件,一直困扰在其推送机制上,弄明白是如何实现推送的;另外一方面可能是毕业论文方向的问题,看了好多论文关于分级保护的论文非常有限,遇到一些问题只能自己慢慢琢磨,问老师甩给我的第一句就是自己想,自己网上找!!!!

    下一阶段将继续学习上述存在的问题,并把Android一些章节学完,漏了好多章节没看,现在写代码困难重重!!!!!

      

            

  • 相关阅读:
    爬虫开头
    JAVA练习笔记---copyfile
    String
    十进制转化为八进制--栈实现
    一、给计算机专业的同学,计算机鸡汤
    数值的整数次方
    剪绳子-动态规划-贪婪
    二进制中为1 的数字个数
    机器人运动范围——回溯法应用
    矩阵的路径
  • 原文地址:https://www.cnblogs.com/zengjiqiang/p/6663788.html
Copyright © 2020-2023  润新知