Android开发之局域网聊天软件

本文记录了使用Android开发一款局域网聊天软件的过程,通过UDP通信技术实现设备间的聊天功能。在ChatActivity.java中处理聊天逻辑,Constant.java则定义了通信常量。软件初期存在性能问题,通过优化ListView等技术解决了卡顿问题,使得在同一局域网内的Android手机可以流畅地进行聊天。
摘要由CSDN通过智能技术生成

之前有掌握到了局域网内UDP通信技术,当时就有点蠢蠢欲动,想写个聊天的软件。后来软件工程课,老师让写一个小程序,就把这个完成了。

ChatActivity.java   聊天activity

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.example.androidtest.R;
import com.example.ccjutils.Constant;
import com.example.ccjutils.Request;
import com.example.ccjutils.RequestDecode;
import com.example.ccjutils.Response;

public class ChatActivity extends Activity implements OnClickListener{
   
	private TextView myTitle;
	private ListView myListView ;
	private String str,sex;
	private EditText sendMsg;
	private Button sendBtn;
	private MyAdapter adapter;
    List<Map<String, String>> data ;
    Map<String,String> map,map1 ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_chat);
		SysApplication.getInstance().addActivity(this); 
		
		receiveListen();
		initView();
		Intent intent = getIntent();
		str = intent.getStringExtra("name");
		sex = intent.getStringExtra("sex");
	}
	private void receiveListen() {
		Thread thread = new Thread(new Listener(8080));
		thread.start();
	}
	private void initView() {
		data = new ArrayList<Map<String,String>>();
		sendMsg = (EditText)findViewById(R.id.send_et);
		sendBtn = (Button)findViewById(R.id.send_btn);
		adapter = new MyAdapter(this);
		myTitle=(TextView)findViewById(R.id.title_tv);
		myListView = (ListView)findViewById(R.id.listView1);
		myListView.setSelection(myListView.getBottom());
		myListView.setAdapter(adapter);
		myTitle.setText(R.string.chatroom);
		sendBtn.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		switch(v.getId()){
			case R.id.send_btn: 	doSendButton();break;
		}
			
	}
	private void doSendButton() {
		if(sendMsg.length() == 0){
			DisplayToast("发送消息不能为空!");
			return;
		}
		else {
			map = new HashMap<String, String>();
			map.put("myName", str);
			map.put("mySex",sex);
			map.put("myMsg", sendMsg.getText().toString());
			data.add(map);
			Thread thread = new Thread(new sendMsg(map));
			thread.start();
		}
		Message msg = new Message();
		msg.what = 1;
		myHandler.sendMessage(msg);
		sendMsg.setText("");
	}
	
	private void DisplayToast(String str){
		Toast toast = Toast.makeText(this, str, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.BOTTOM, 0, 220);
		toast.show();
	}
	
Handler myHandler = new Handler() {
	@Override
	public void handleMessage(Message msg) {
		if(msg.what == 1){
			if(sex.equals("male")){
				adapter.mySex = true;
			}else{
				adapter.mySex = false;
			}
			adapter.count++;
			adapter.notifyDataSetChanged();
			return;
		}
		else if(msg.what == 0){
			adapter.count++;
			adapter.notifyDataSetChanged();
			return;
		}
	}
	
};
class sendMsg implements Runnable {
	Request myRequest = new Request();
	Map<String,String> map ;
	
	public sendMsg(Map<String,String> map) {
		this.map = map;
	}
	@Override
	public void run() {
		try {
			myRequest.send(Constant.MESSAGE+";"+map.get("myName")+";"+map.get("mySex")+";"+map.get("myMsg")+";!", 
					InetAddress.getByName("255.255.255.255"), 8080);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		}
	}
}
/**
 * 监听端口类
 * @author 程长江
 *
 */
class Listener implements Runnable{
	
	
	private Response myResponse;
	private RequestDecode myDecode;
	private int port;//监听端口
	private boolean flag =true;//循环标志     
	public Listener(int port){
		this.port = port;
	}
	/**
	 * 循环接收port端口的请求
	 */
	@Override
	public void run() {
		while(flag){
			initData();
			try {
				myResponse.receive(port);
				myDecode.decode(myResponse.data);
				responseRun(myDecode.response);
			} catch (IOException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	private void responseRun(ArrayList<String> response) throws IOException, InterruptedException {
		if(response.get(0).equals(Constant.MESSAGE)&&!response.get(1).equals(str)){
			map1 = new HashMap<String, String>();
			map1.put("otherName", response.get(1));
			map1.put("otherSex", response.get(2));
			map1.put("otherMsg", response.get(3));
			data.add(map1);
			Message msg = new Message();
			msg.what = 0;
			myHandler.sendMessage(msg);
		}
	}
	private void initData() {
			
		myDecode = new RequestDecode();
		myResponse = new Response();
	}
	
}
class MyAdapter extends BaseAdapter{
	private LayoutInflater mInflater = null;  
	private boolean mySex = true;
	int count = 0;
	public MyAdapter(Context context) {
	    this.mInflater = LayoutInflat
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值