在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