转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!


山寨版微信(上)

即时通信

我们使用了Socket编程(套接字编程)

服务器

创建ServerSocket

等待客户端的连接

Socket s =ss.qccpet();

客户端

Soket s = new Socket();

原理图:

服务端:
Server

public class Server {// 记录所有的客户端private List<ThreadClient> list = new ArrayList<ThreadClient>();// 启动服务器public void start() throws Exception {// 创建一个服务器final ServerSocket serverSocket = new ServerSocket(8809);System.out.println(serverSocket.getLocalPort());
System.out.println(serverSocket.getInetAddress().getHostAddress());// 开线程去反馈给用户的信息new Thread(new Runnable() {@Overridepublic void run() {// 开启循环接受客服端反馈的信息while (true) {try {// 得到客户端反馈的信息Socket socket =serverSocket.accept();// 取出客户的信息ThreadClient client = new ThreadClient(socket);System.out.println("ip:"+client.ip+",port:"+client.port);/**自定义通信协议* 服务器通知用户刷新列表,* 用户上线 refresh:* 关键字 name:上线的ip地址* port:上线的端口* refresh@name@port*/// 告诉别人我上线了// 通知之前上线的人/***  迭代所有客户端:发送消息给每一个客户端*  c:之前上线的用户(别人)*/for (ThreadClient c : list) {String msg = "refresh@" +client.ip+ "@" +client.port;c.sendMessge(msg);}// 上线后得到上线的人// 自己上线之后,也要知道之前上线的人for (ThreadClient c : list) {String msg = "refresh@" +c.ip+ "@" +c.port;client.sendMessge(msg);}list.add(client);} catch (Exception e) {// TODO: handle exception}}}}).start();}public static void main(String[] args) {Server server = new Server();try {server.start();} catch (Exception e) {// TODO Auto-generated catchblocke.printStackTrace();System.out.println("启动失败");}}
}

ThreadClient:

Socket详细信息

// 用户相信信息
public class ThreadClient extends Thread {// ip 地址public String ip;// 端口号public int port;// 客户端套接字public Socket socket;// 字节输入流public InputStream is;// 字节输出流public OutputStream os;// 字符打印流public PrintWriter pw;// 字符缓存流public BufferedReader br;public ThreadClient(Socketsocket){try {this.socket = socket;this.port = socket.getPort();this.ip =socket.getInetAddress().getHostAddress();this.is = socket.getInputStream();this.os =socket.getOutputStream();this.br = new BufferedReader(new InputStreamReader(is));this.pw = new PrintWriter(os);} catch (Exception e) {// TODO: handle exception}}// 向客户端发送消息的方法public void sendMessge(String msg){pw.println(msg);pw.flush();}   @Overridepublic void run() {// TODO Auto-generated method stubsuper.run();}
}

客户端:

Adapter:

public class MyAdapter extends BaseAdapter {private List<UserInfo> infos;private Context context;private LayoutInflater mInflater;publicMyAdapter(List<UserInfo> infos,Context context){this.infos = infos;this.context = context;mInflater = LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn infos.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn infos.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubView view = null;ViewHodler hodler = null;if(convertView!=null){view = convertView;hodler = (ViewHodler) view.getTag();}else{view = mInflater.inflate(R.layout.item, null);hodler = new ViewHodler();hodler.tv_ip = (TextView) view.findViewById(R.id.tv_ip);hodler.tv_port = (TextView)view.findViewById(R.id.tv_port);hodler.tv_isnew = (TextView) view.findViewById(R.id.tv_isnew);view.setTag(hodler);}// 得到数据UserInfo info = infos.get(position);hodler.tv_ip.setText(info.ip);hodler.tv_port.setText(info.port+"");return view;}private class ViewHodler{TextView tv_ip;TextView tv_port;TextView tv_isnew;}
}

Client:

public class ThreadClient extends Thread {public List<UserInfo> userInfos= new ArrayList<UserInfo>();public Socket socket;public String ip;public int port;public InputStream is;public OutputStream os;public PrintWriter pw;public BufferedReader br;public static Context context;private static ThreadClient threadClient;public synchronized static ThreadClient  getThreadClient(Context c){context = c;if(threadClient == null){try {//创建SocketSocket socket = new Socket("192.168.16.2", 8809);threadClient = new ThreadClient(socket);threadClient.start();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}return threadClient;}private ThreadClient(Socketsocket){this.socket = socket;this.ip = socket.getInetAddress().getHostAddress();this.port = socket.getPort();try {this.is = socket.getInputStream();this.os =socket.getOutputStream();this.pw = new PrintWriter(os);this.br = new BufferedReader(new InputStreamReader(is));} catch (Exception e) {e.printStackTrace();}}@Overridepublic void run() {super.run();while(true){try {String message = br.readLine();if(message!=null){
//StringTokenizer 用户截取有规律符号的字符串的StringTokenizer token = new StringTokenizer(message,"@");String msg = token.nextToken();// 判断是否是上线通知if("refresh".equals(msg)){String ip1 =token.nextToken();int port1 = Integer.parseInt(token.nextToken());// 发送广播刷新列表
如果不是自己上线就发送广播刷新用户列表boolean flag = this.ip.equals(ip1)&&this.port == port1;if(!flag){userInfos.add(new UserInfo(ip1, port1));Intent intent = new Intent();intent.setAction("com.cym.MainActivity");context.sendBroadcast(intent);}}}} catch (Exception e) {// TODO: handle exception}}}
}

Domain:

public class UserInfo {public String ip;public int port;public boolean isNew;public UserInfo(String ip, int port) {super();this.ip = ip;this.port = port;}}

Ui:

public class MainActivity extends Activity {private ListView lv_user;private MyAdapter adapter;private MyRefreshBroadCastReceiverreceiver;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);lv_user = (ListView) findViewById(R.id.lv_user);// 客户端ThreadClient threadClient = ThreadClient.getThreadClient(this);List<UserInfo> userInfos =threadClient.userInfos;adapter = new MyAdapter(userInfos, this);lv_user.setAdapter(adapter);receiver = new MyRefreshBroadCastReceiver();IntentFilter filter = new IntentFilter();filter.addAction("com.cym.MainActivity");registerReceiver(receiver, filter);}
private class MyRefreshBroadCastReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context,Intent intent) {// TODO Auto-generated methodstubadapter.notifyDataSetChanged();}}
}

ym——Android从零开始(27)(山寨版微信-上)(新)相关推荐

  1. ym——Android从零开始(28)(来电铃声的设置、手机闹钟、手势识别)(新)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 来电铃声的设置.手机闹钟.手势识别来电铃声的设置 MediaStore简介 Media ...

  2. 微信上线新表情且微信可以直接向QQ转账啦!

    1月14日,有网友发现,微信悄悄地上架了一堆新的系统表情包.平时在微博上流行的"吃瓜""狗头"等表情,微信里都上新了类似的表情包.目前这些新表情包只出现在部分用 ...

  3. android 更换软件提示音,修改微信APP新消息提示音(教程)!

    熟悉我的朋友都知道,我只带来干货,每天都是实用技能!今天教大家如何自定义 消息通知铃声.来电铃声.闹铃铃声,Android操作系统由于其特征,自定义这些很简单,目前很多音乐APP软件都有个" ...

  4. Android:Umeng(友盟) 微信,QQ,新浪分享 (三)

    第一步: 下载并安装SDK 添加代码和资源引用,我们提供了添加资源文件和jar文件的两种方式,可以根据需求选择 解压SDK压缩包,将文件夹中的'main/libs'和'main/res'文件夹复制到你 ...

  5. 类似matlab安卓,【Android 杂货派】理科生神器 Matlab、联通网络解锁助手、高颜值的糖果色任务列表等上新...

    新鲜的货物再次上架.我们几个派老板会从各大应用商店进点杂货,所谓杂货,上到优质的应用,中到实用的教程,下到热腾腾的行业资讯,只为丰富大家的玩机体验,当然还保质保量.以下是今日杂货派上架的新玩意,欢迎挑 ...

  6. android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...

  7. android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id(修改版)

    首先注明该文章是借签别人的博客,原文博文地址点击打开链接 android 仿QQ,微信群组里的@功能,支持@多人,并能一键删除,能获取上传对应的id 这个需求来源:本人做集成环信聊天时,项目需要@功能 ...

  8. 商品上新微信排版教程

    趁着发工资之际 手头还比较富裕 约上三五好友逛个街 发现好多商场都已经开始上新 新一季的衣服包包鞋子了 640?wx_fmt=jpeg 所以 今天135编辑器和大家分享一个 商品上新推文微信排版 和配 ...

  9. 微信开挂怎么防止封号_2019史上最严微信封号“新规则”,有人无辜被封,请各位小心使用...

    原标题:2019史上最严微信封号"新规则",有人无辜被封,请各位小心使用 这两年微信可谓是发展的顺风顺水,随着微信的不断更新,腾讯官方发布了最新封号标准,一旦有人触犯底线,账号就会 ...

最新文章

  1. UVA-1515 Pool construction (最小割)
  2. 【转】软件需求分析方法
  3. matlab远程桌面访问:License Manager Error - 103
  4. 房贷是不是越多越久越好?
  5. 必填校验加变色,点击颜色消失
  6. leetcode 39. 组合总和 思考分析
  7. ABAP:从例子学习ABAP
  8. python解析xml+得到pascal voc xml格式用于目标检测+美化xml
  9. AE插件Stardust for mac(最强粒子特效)
  10. Python笔记-函数装饰器
  11. 遗传算法 优化 工具箱 matlab pareto front,matlab遗传算法三目标优化,出来的pareto前沿图只是二维图...
  12. 读懂Java代码总结
  13. 【Docker端口映射】
  14. 粗浅看Struts2和Hibernate框架
  15. 什么是漏极开路【转】
  16. keytool 错误:Keystore was tampered with, or password was incorrect
  17. 易岸公考:国考公务员高频常识
  18. 韩老师坦克大战2.0版本
  19. UML建模与软件开发设计(六)——类图设计与类之间的关系
  20. openwrt桥接上海电信宽带+高清4KIptv适用

热门文章

  1. Vue.js笔记(一)
  2. Python中的 len() 是什么?如何使用 len() 函数查找字符串的长度
  3. 云数据库PostgreSQL新人怎样上手
  4. 云脉相册检索,关键词快速定位图片
  5. Dunnett-t 检验~新复极差法检验
  6. 【优化算法】改进的侏儒猫鼬优化算法(IDMO)【含Matlab源码 2314期】
  7. 4.2.4 Kafka高级特性解析(物理存储、稳定性:事物,控制器,可靠性,一致性,_consumer_offsets、延时队列、自定义重试队列)
  8. Outlook无法启动一直显示“正在启动”的解决方法
  9. 关于中台的深度思考和中台实战
  10. C语言中delay的用法