使用Android网络编程实现简易聊天室(2)

发表于:2013-07-19来源:Csdn作者:孤云点击数: 标签:Android
import java.net.Socket; public class ServerThread implements Runnable { // 定义当前线程所处理的Socket private Socket socket = null; // 该线程所处理的Socket所对应的输入流 Buffer

  import java.net.Socket;

  public class ServerThread implements Runnable {

  // 定义当前线程所处理的Socket

  private Socket socket = null;

  // 该线程所处理的Socket所对应的输入流

  BufferedReader br = null;

  public ServerThread(Socket socket) throws IOException {

  this.socket = socket;

  // 初始化该Socket对应的输入流

  br = new BufferedReader(new InputStreamReader(socket.getInputStream(),

  "utf-8"));

  }

  @Override

  public void run() {

  try {

  String content = null;

  // 采用循环不断从Socket中读取客户端发送过来的数据

  while ((content = readFromClient()) != null) {

  // 遍历socketList中的每个Socket,将读到的内容向每个Socket发送一次

  for (Socket s : MyServer.socketList) {

  OutputStream os = s.getOutputStream();

  os.write((content + "\n").getBytes("utf-8"));

  }

  }

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  /**

  * 定义读取客户端数据的方法

  *

  * @return

  */

  private String readFromClient() {

  try {

  return br.readLine();

  }

  // 如果捕捉到异常,表明该Socket对应的客户端已经关闭

  catch (Exception e) {

  // 删除该Socket

  MyServer.socketList.remove(socket);

  e.printStackTrace();

  }

  return null;

  }

  }

  客户端主类(Activity):

  [java] view plaincopyprint?

  package com.home.activity;

  import java.io.OutputStream;

  import java.net.Socket;

  import android.app.Activity;

  import android.os.Bundle;

  import android.os.Handler;

  import android.os.Message;

  import android.view.View;

  import android.view.View.OnClickListener;

  import android.widget.Button;

  import android.widget.EditText;

  import com.home.R;

  import com.home.util.ClientThread;

  public class MultiThreadClient extends Activity {

  private EditText input, show;

  private Button sendBtn;

  private OutputStream os;

  private Handler handler;

  @Override

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.activity_main);

  input = (EditText) findViewById(R.id.main_et_input);

  show = (EditText) findViewById(R.id.main_et_show);

  sendBtn = (Button) findViewById(R.id.main_btn_send);

  handler = new Handler() {

  @Override

  public void handleMessage(Message msg) {

  // 如果消息来自子线程

  if (msg.what == 0x234) {

  // 将读取的内容追加显示在文本框中

  show.append("\n" + msg.obj.toString());

  }

  }

  };

  Socket socket;

  try {

  socket = new Socket("192.168.0.101", 20000);

  // 客户端启动ClientThread线程不断读取来自服务器的数据

  new Thread(new ClientThread(socket, handler)).start();

  os = socket.getOutputStream();

  } catch (Exception e) {

  e.printStackTrace();

  }

  sendBtn.setOnClickListener(new OnClickListener() {

  @Override

  public void onClick(View v) {

  try {

  // 将用户在文本框内输入的内容写入网络

  os.write((input.getText().toString() + "\r\n").getBytes());

  // 清空input文本框数据

  input.setText("");

  } catch (Exception e) {

  e.printStackTrace();

  }

  }

  });

  }

  }

  package com.home.activity;

  import java.io.OutputStream;

  import java.net.Socket;

  import android.app.Activity;

  import android.os.Bundle;

  import android.os.Handler;

  import android.os.Message;

  import android.view.View;

  import android.view.View.OnClickListener;

  import android.widget.Button;

  import android.widget.EditText;

  import com.home.R;

  import com.home.util.ClientThread;

  public class MultiThreadClient extends Activity {

  private EditText input, show;

  private Button sendBtn;

  private OutputStream os;

原文转自:http://blog.csdn.net/u010142437/article/details/9327541