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

发表于:2013-07-19来源:Csdn作者:孤云点击数: 标签:Android
在Java中我们可以利用socket编程实现聊天室,在Android中也一样,因为Android完全支持JDK本身的TCP、UDP网络通信API。我们可以使用ServerSocket、Socket来建立基于TCP/IP协议的网络通信;也可以使用DatagramSocket、Datagrampacket、MulticastSocket来建立基于

  在Java中我们可以利用socket编程实现聊天室,在Android中也一样,因为Android完全支持JDK本身的TCP、UDP网络通信API。我们可以使用ServerSocket、Socket来建立基于TCP/IP协议的网络通信;也可以使用DatagramSocket、Datagrampacket、MulticastSocket来建立基于UDP协议的网络通信。下面实现一个简单的聊天室,服务器端完全用Java代码实现,跟Android无关,客户端用Android应用来实现。

  服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显示在界面上。这样就实现了客户端与客户端之间的即时聊天功能,为简便起见,本文中只写了一个客户端,代码如下:

  服务器端:

  创建服务器的主类:

  [java] view plaincopyprint?

  package com.home.server;

  import java.io.IOException;

  import java.net.ServerSocket;

  import java.net.Socket;

  import java.util.ArrayList;

  public class MyServer {

  // 定义保存所有Socket的集合

  public static ArrayList socketList = new ArrayList();

  public static void main(String[] args) throws IOException {

  ServerSocket ss = new ServerSocket(20000);

  System.out.println("服务器创建成功!");

  System.out.println("等待客戶端的连接。。。");

  while (true) {

  // 此行代码会阻塞,等待用户的连接

  Socket socket = ss.accept();

  System.out.println("有客户端连接进来!");

  socketList.add(socket);

  // 每当客户端连接后启动一条ServerThread线程为该客户端服务

  new Thread(new ServerThread(socket)).start();

  }

  }

  }

  package com.home.server;

  import java.io.IOException;

  import java.net.ServerSocket;

  import java.net.Socket;

  import java.util.ArrayList;

  public class MyServer {

  // 定义保存所有Socket的集合

  public static ArrayList socketList = new ArrayList();

  public static void main(String[] args) throws IOException {

  ServerSocket ss = new ServerSocket(20000);

  System.out.println("服务器创建成功!");

  System.out.println("等待客戶端的连接。。。");

  while (true) {

  // 此行代码会阻塞,等待用户的连接

  Socket socket = ss.accept();

  System.out.println("有客户端连接进来!");

  socketList.add(socket);

  // 每当客户端连接后启动一条ServerThread线程为该客户端服务

  new Thread(new ServerThread(socket)).start();

  }

  }

  }

  服务器的线程类:

  [java] view plaincopyprint?

  package com.home.server;

  import java.io.BufferedReader;

  import java.io.IOException;

  import java.io.InputStreamReader;

  import java.io.OutputStream;

  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;

  }

  }

  package com.home.server;

  import java.io.BufferedReader;

  import java.io.IOException;

  import java.io.InputStreamReader;

  import java.io.OutputStream;

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