——客户机、服务器连接通信

最近刚做完一个基于Android的即时通信的项目工程,主要完成类似于QQ群的功能。项目涉及的知识面比较广,都是在网络通信上很实用的技术,非常适合初学者学习。其中也是遇到了各种错误、异常。在解决的过程中自己也收获了不少。在此分几个部分简述一下我的调试过程,也和大家分享一下我的收获,希望对大家有帮助。

所要了解的主要知识点:

  • TCP/IP网络协议
  • 文件IO流
  • 二进制IO流
  • Activity的生命周期
  • Android多媒体开发(相机、媒体播放器)
  • Android Intent的使用
  • 多线程控制
  • Handler对象
  • ListView类

以上是针对项目归纳的几个主要的知识点,接下来我会按照相关知识点分几篇文章来介绍整个项目过程。

一、终端的网络连接

既然是通信,首先要调通的就是网络连接。这里采用TCP/IP协议,使用JAVA的socket对象很容易实现。客户端代码如下:

final int PORT = 6666;try{socket = new Socket();socket.connect(new InetSocketAddress("220.181.111.85",PORT), 3000);sendMsg(CONNECT_SUCCESS);} catch (Exception e){sendMsg(CONNECT_FAILED);}try{while ((obj = dataTransmission.rev()) != null)                   // 判断数据类型{sendMsg(obj);}} catch (Exception e){e.printStackTrace();}

这里新建一个Socket对象,然后Socket.connect会去连接指定IP地址的相应端口,设置超时时间为3000 ms。

服务器端连接代码如下:

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;public class Main
{public static ArrayList<Socket> socketList = new ArrayList<Socket>();public static void main(String[] args) throws IOException{@SuppressWarnings("resource")ServerSocket ss = new ServerSocket(6666);String ip = InetAddress.getLocalHost().getHostAddress();System.out.println(ip);while (true){Socket s = ss.accept();socketList.add(s);}}
}

和客户端一样,首先创建socket对象。然后Socket.accept()阻塞式等待连接,一旦有客户端连接,就会加入到socketList中(相当于登记客户端)。这样就完成了多个客户的连接。

注意
理论上Socket的端口可以任意指定0~65535中的任意一个,但是为了避免冲突,尽量选用1024以上的端口,这样可以避免占用。

二、接受和发送对象

在服务器与客户端建立连接之后就可以相互传送数据了。由于考虑到传送的不同数据的兼容问题,这里我采用了对象传输流(ObjectOutputStream / ObjectInputStream)。传输过程相比连接过程稍微复杂一点,大致流程如下:

1.通过Socket.getOutputStream()方法获取该Socket对象的OutputStream。
2.创建ObjectOutputStream用于发送对象。
3.调用ObjectOutputStream的Writexxx()方法写入xxx类型的数据。
4.调用flush()方法清空数据流,完成本次发送。

相关代码如下(两端收发代码保持统一):

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.StreamCorruptedException;public class DataTransmission        //收发数据类
{static int revType;/**
send用于发送数据
data:表示要发送的数据对象
type:表示要发送的对象的类型
*/public void send(Object data,int type) throws IOException                          {OutputStream os = ClientThread.socket.getOutputStream();ObjectOutputStream out = new ObjectOutputStream(os);out.writeInt(type);out.writeObject(data);out.flush();}/**
rev用于接收数据
*/public Object rev() throws StreamCorruptedException, IOException,ClassNotFoundException{ObjectInputStream in = new ObjectInputStream(ClientThread.socket.getInputStream());revType = in.readInt();return in.readObject();}
三、断开连接

程序中涉及到的并不是两点通信,而对于多机通信而言,随时都允许有用户离线,这时候就需要在用户登记表中除去该用户。
这里需要在服务器上完成,登记的时候是在建立的socketList中注册的,所以除去也需要在这个对象中完成。代码实现如下:

public Object getObj(){Object obj;try{obj = data.rev();                                   //用于接收数据并且将数据返回,return obj;} catch (Exception e){                                                       //如果有用户离线,则进入异常,随后在List中删除该socket对象Main.socketList.remove(socket);System.out.println("remove success");}return null;}

这样就完成了对用户离线的记录,sockeList里面存放的始终是在线的用户。

网络连接是通信工具最基本的功能,也是本次开发最初期的任务。至此已经完成了基本的网络通信,接下来我会继续和大家分享余下的各个功能模块。。。

持续更新中....

完整源代码地址:

http://github.com/hust-MC/Instance-Message



Android即时通信软件设计(一)(网络通信)相关推荐

  1. 科聊——即时通信软件原型设计

    原型展示地址:科聊 原型设计工具:墨刀 运行环境:Android,Web浏览器(Chrome测试) 安卓下载: 说明:产品原型是整个产品面市之前的一个框架设计,本产品原型对框架结构做出了基本搭建,未注 ...

  2. 计算机网络课程设计即时通讯,计算机网络课程设计报告-基于LAN的即时通信软件.doc...

    一.概述 1.1 设计目的: 利用MFC编程实现客户端之间通过服务器进行通信. 1.2 设计内容: 网络通信软件的数据通信是通过网络套接字进行的.根据该原理,其编程步骤应分为创建套接字.在套接字上进行 ...

  3. (Android 即时通讯) [悬赏],不管是谁发现一个漏洞奖励人民币1000元!

    悬赏,不管是谁发现一个漏洞奖励人民币1000元! 3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通! 适用于:小米  ...

  4. 和java通信_[源码和文档分享]基于JAVA的即时通信软件

    一.设计任务书 1.1 设计任务 本文设计的是一个简单的即时通信软件,利用 Java Socket 进行点到点通信,其工作机制模仿即时通信软件的基本功能,已实现的功能有:客户端登录 客户端退出 群组成 ...

  5. Android 即时通讯开发小结(一)

    本文将基于 IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对 IM 开发做一个全面的总结. 客户端架构 作为一个 IM 软件,最重要的一个特性就是保证消息的达到率和实时性. ...

  6. [源码和文档分享]基于JAVA的即时通信软件

    一.设计任务书 1.1 设计任务 本文设计的是一个简单的即时通信软件,利用 Java Socket 进行点到点通信,其工作机制模仿即时通信软件的基本功能,已实现的功能有: 客户端登录 客户端退出 群组 ...

  7. 即时通信软件开发的年轻开发者曾注意到

    微软"迷失"的十年,已成为美国企业发展史上最大的谜团之一.为了解其中缘由,曾两次获得乔治·波尔卡新闻奖(George Polk Award)的美国知名记者.最近刚刚担任<名利 ...

  8. C语言项目(四)——基于Linux系统下的带有GUI界面的即时通信软件

    二十一.TCP是如何保证可靠数据传输的? TCP提供一种面向连接的.可靠的字节流服务. 面向连接:意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接.在 ...

  9. Android即时聊天系统设计

    Android即时聊天系统设计 最近比较闲,当工作比较闲是意味着什么呢(⊙﹏⊙) 于是,总结一下前几个月的毕业设计吧,说不好对一些有需要的朋友有帮助呢,也算是为社会做贡献了( 简单的即时聊天系统,设计 ...

最新文章

  1. 显卡暴涨,等等党输了,这我万万没想到啊
  2. mysql注入ctf_CTF SQL注入
  3. 字节跳动内部学习资料泄露!mysql的安装与配置
  4. python教程第四版pdf下载-笨办法学python第四版 电子书(pdf格式)
  5. javascript 常用校验代码 2
  6. Maven之(二)Maven生命周期
  7. JDBC+Servlet+JSP整合开发之22.JSP简介
  8. java地址值每个字母,Java--------在控制台输入一句英语, 获得每个字母出现的次数...
  9. 去重+排序板子(set+map)
  10. Kettle报错:Entry to update with following key could not be found
  11. Linux系统编程:使用mutex互斥锁和条件变量实现多个生成者和消费者模型
  12. php pcre回溯攻击,PHP利用PCRE回溯次数限制绕过某些安全限制 | 码农网
  13. python 近期用到的基础知识汇总(五)
  14. 计算机中 堆 、栈、
  15. AttributeError: module 'socketio' has no attribute 'Server'
  16. 一建机电实务教材电子版_一建案例学不透?新版一建机电案例一本通,6大模板案例高清讲解...
  17. AS 更新项目gradle方法
  18. Python中用冒号表达式对列表切片
  19. PMP认证考试情况整理
  20. Mathematic Mac 中文版的下载和破解

热门文章

  1. linux 环境命令随记
  2. 郑州各类软件开发公司各类软件开发
  3. 驯龙高手java版_石器时代2驯龙高手BT版
  4. C++ 内连接与外连接
  5. Haskell学习笔记4 -- Monad
  6. Win系统下打开串口转换USB口的RS232串口,打不开问题
  7. Gatsby静态网站导航高亮
  8. android studio 导入工程问题总结
  9. 美团秋招笔试——算法岗
  10. r语言 林元震_方差分析--T检验和F检验的异同