[Android通信]基于socket的聊天app(二):实现聊天界面

参考链接:http://blog.csdn.net/way_ping_li/article/details/8008435


效果图:



主要就三个类,在上一篇的基础上对客户端代码进行了修改。

package com.example.mysocketclient;

public class ChatMsgEntity {
	
	private String name;//消息来自  
    private String date;//消息日期  
    private String message;//消息内容  
    private boolean isSend = true;//是否为发送的消息  
    
    public String getName() {  
        return name;  
    }  
  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    public String getDate() {  
        return date;  
    }  
  
    public void setDate(String date) {  
        this.date = date;  
    }  
  
    public String getMessage() {  
        return message;  
    }  
  
    public void setMessage(String message) {  
        this.message = message;  
    }  
 
    public boolean getMsgType() {  
        return isSend;  
    }  
  
    public void setMsgType(boolean isSend) {  
        this.isSend = isSend;  
    } 
    
    public ChatMsgEntity() {
    	
    }
    
    public ChatMsgEntity(String name, String date, String message, boolean isSend) {  
        this.name = name;  
        this.date = date;  
        this.message = message;
        this.isSend = isSend;
    }
}


package com.example.mysocketclient;

import java.util.List;

import android.R.bool;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class ChatMsgListViewAdapter extends BaseAdapter {

	private List<ChatMsgEntity> list;//存放所有消息对象
	private LayoutInflater layoutInflater;//用于加载layout
	
	public ChatMsgListViewAdapter(Context context,List<ChatMsgEntity> list) {
		this.list = list;
		layoutInflater = LayoutInflater.from(context);
	}
	
	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ChatMsgEntity chatMsgEntity = list.get(position);
		ViewHolder viewHolder;
		
		//if(convertView == null) {
			if(chatMsgEntity.getMsgType()) {
				convertView = layoutInflater.inflate(R.layout.chatting_item_msg_text_left, null);
			}
			else {
				convertView = layoutInflater.inflate(R.layout.chatting_item_msg_text_right, null);
			}
			
			viewHolder = new ViewHolder();  
            viewHolder.tvSendTime = (TextView)convertView.findViewById(R.id.tv_sendtime);  
            viewHolder.tvUserName = (TextView)convertView.findViewById(R.id.tv_username);  
            viewHolder.tvContent = (TextView)convertView.findViewById(R.id.tv_chatcontent);
            
            //convertView.setTag(viewHolder);
		//}else {
			//viewHolder = (ViewHolder)convertView.getTag();
		//}
		
		viewHolder.tvSendTime.setText(chatMsgEntity.getDate());  
        viewHolder.tvUserName.setText(chatMsgEntity.getName());  
        viewHolder.tvContent.setText(chatMsgEntity.getMessage());  
        return convertView;
	}

	static class ViewHolder {
		public TextView tvSendTime;  
        public TextView tvUserName;  
        public TextView tvContent;
	}
}

package com.example.mysocketclient;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	private EditText editText;
	private Button sendButton;
	private Button backButton;
	
	private ListView listView;
	private ChatMsgListViewAdapter adapter;
	private List<ChatMsgEntity> list;
	
	private Socket socket;
	private BufferedWriter bWriter;//输出流,发送、写入信息
	private BufferedReader bReader;//输入流,接受、读取信息
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		editText = (EditText)findViewById(R.id.editText);
		sendButton = (Button)findViewById(R.id.btn_send);
		backButton = (Button)findViewById(R.id.btn_back);
		listView = (ListView)findViewById(R.id.listview);
		
		sendButton.setOnClickListener(new OnClickListener() {		
			@Override
			public void onClick(View v) {
				send();
			}
		});
		
		list = new ArrayList<ChatMsgEntity>();
		adapter = new ChatMsgListViewAdapter(this, list);
		listView.setAdapter(adapter);
		
		connect();
	}
	
	private void connect()
	{
		new AsyncTask<Void, String, Void>() {
			
			//在主线程中执行,不能用来初始化socket
			protected void onPreExecute() { }
			
			protected Void doInBackground(Void[] params) {
				try {
					socket = new Socket("172.25.225.24",1989);
					bWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
					bReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					publishProgress("connect success");
				} catch (IOException e) {
					Log.e("connect error", "error");
				}
				
				String s;		
				//readLine()是一个阻塞函数,当没有数据读取时,就一直会阻塞在那,而不是返回null
				//接受信息
				try {
					while ((s = bReader.readLine()) != null) {
						publishProgress(s);		
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
				return null;
			}
			
			protected void onProgressUpdate(String[] values) {
				if(values[0].equalsIgnoreCase("connect success")) {
					Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
				}	
				else {
					String content = values[0] + "\n";
					if(content.length() > 0) {
						ChatMsgEntity entity = new ChatMsgEntity();
						entity.setName("other");
						entity.setDate(getDate());
						entity.setMessage(content);
						entity.setMsgType(false);
						
						list.add(entity);
						adapter.notifyDataSetChanged();//通知ListView,数据已发生改变
						listView.setSelection(listView.getCount() - 1);//发送一条消息时,ListView显示选择最后一项
					}
				}
			}
		}.execute();
	}
	
	//发送信息
	private void send()
	{
		try {
			String content = editText.getText().toString() + "\n";
			if(content.length() > 0) {
				ChatMsgEntity entity = new ChatMsgEntity();
				entity.setName("me");
				entity.setDate(getDate());
				entity.setMessage(content);
				entity.setMsgType(true);
				
				list.add(entity);
				adapter.notifyDataSetChanged();//通知ListView,数据已发生改变
				listView.setSelection(listView.getCount() - 1);//发送一条消息时,ListView显示选择最后一项
				
				editText.setText("");
				
				bWriter.write(content);
				bWriter.flush();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private String getDate() {  
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
        return format.format(new Date(0));  
    } 
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值