使用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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97