参考链接: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));
}
}