标签:处理 import color 发送消息 iter 方向 应用 网络通信 cti
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 + "\n").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("\n" + 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() + "\r\n").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一些章节学完,漏了好多章节没看,现在写代码困难重重!!!!!
标签:处理 import color 发送消息 iter 方向 应用 网络通信 cti
原文地址:http://www.cnblogs.com/zengjiqiang/p/6663788.html