使用Android网络编程实现简易聊天室
在Java中我们可以利用socket编程实现聊天室,在Android中也一样,因为Android完全支持JDK本身的TCP、UDP网络通信API。我们可以使用ServerSocket、Socket来建立基于TCP/IP协议的网络通信;也可以使用DatagramSocket、Datagrampacket、MulticastSocket来建立基于UDP协议的网络通信。下面实现一个简单的聊天室,服务器端完全用Java代码实现,跟Android无关,客户端用Android应用来实现。
服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显示在界面上。这样就实现了客户端与客户端之间的即时聊天功能,为简便起见,本文中只写了一个客户端,代码如下:
服务器端:
创建服务器的主类:
[java]
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<Socket> socketList = new ArrayList<Socket>();
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<Socket> socketList = new ArrayList<Socket>();
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]
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;
import java.net.Socket;
public class ServerThread implements Runnable {
// 定义当前线程所处理的Socket
private Socket socket = null;
// 该线程所处理的Socket所对应的输入流
BufferedReader br = null;
补充:移动开发 , Android ,