在Android上实现局域网络聊天功能
- 问题
- 1.服务器以什么形式保存客户端链接,如何检索和区分这些链接?
- 2.通信协议
- 3.客户端的线程如何实现?
- 4.依靠RecyclerView实现聊天框。设置adapter匹配数据。
- 5.服务器监听socket连接代码
- 6.adapter必须重写的三个方法:
问题
1.服务器以什么形式保存客户端链接,如何检索和区分这些链接?
通过建立hushmap来存储socket链接。
private static Map<String,Socket> clientList = new HashMap<>();
final String address = socket.getRemoteSocketAddress().toString();//返回此套接字连接的端点的地址,通过不同的端口区分这些链接
final Socket socket = server.accept();//accept函数返回的新socket其实指代的是本次创建的连接。
2.通信协议
名字,消息内容,消息时间,以及加载哪种布局等,根据需求更改
public MyBean(String data, int number,String time,String name) {
this.data = data;
this.number = number;
this.name = name;
this.time = time;
}
3.客户端的线程如何实现?
new一个runable,重写run(),首先连接socket,包括本地ip地址和端口号。
接着InputStream inputStream = socket.getInputStream();//获取数据.
利用message和handler.sendMessage(message);方法
4.依靠RecyclerView实现聊天框。设置adapter匹配数据。
//设置两个viewholder,内容包括 tv,name,time。分别表示对方和自己。
// RecyclerView会传入ViewHolder及其位置,调用onBindViewHolder(ViewHolder, int)方法。
// Adapter会找到目标位置的数据并将其绑定到Vie wHolder的视图上。
//在AS的MainActivity中建立handler,
int localPort = socket.getLocalPort();//localPort是socket中的localPort
String[] split = ((String) msg.obj).split("//");//返回对象,split通过'//'分开字符串
if (split[0].equals(localPort + "")) {
//这里判断是不是自己发送的消息,equals用来对比两个元素是否相同,相同则返回true;
//比较的元素是socket.localport和本机port。是的话就在我里面发送。
MyBean bean = new MyBean(split[1],1,split[2],"我:");
list.add(bean);
} else {
MyBean bean = new MyBean(split[1],2,split[2],("来自:" + split[0]));
list.add(bean);
}
//(这里有一点不完善。在RecyclerView中的list内容默认靠左,所在“我”发送消息时也会使得消息出现在左半部分,
//所以在item自定义组件中设置内容全部靠右android:layout_gravity="right"。也就是为什么“我”发送消息绿色box沾满一行)
5.服务器监听socket连接代码
public void run() {
try {
while (!isExit) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// 单线程索锁,可能多手机连接,所以加入线程锁,单线程工作。
}。。。。。
}
}//进行循环等待。
或者利用循环,
for (;;){//无限循环
//得到客户端
Socket client = server.accept();
Clienthandle clienthandle = new Clienthandle(client);//有多个客户端,采用异步操作 ClientHandle-异步处理类
//启动线程
clienthandle.start();//启动客户端
}
6.adapter必须重写的三个方法:
1.onCreateViewHolder:这个方法就是用来创建出一个新的ViewHolder,可以根据需求的itemType,创建出多个ViewHolder。创建多个itemType时,需要getItemViewType(int position)方法配合。
2.onBindViewHolder:绑定创建的ViewHolder。
3。getItemCount:获取Item的数目。