在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的数目。