之前有掌握到了局域网内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