详解基于java的Socket聊天程序——服务端(附demo)攻略
1. 简介
本文将详细介绍如何使用Java中的Socket编写一个简单的聊天程序。文章分为客户端和服务端两部分,本文将着重讲解服务端的实现过程,并提供对应示例代码。
2. 整体流程
- 创建ServerSocket
- 等待客户端连接,创建Socket
- 创建线程处理客户端连接
- 服务端处理客户端的消息
3. 具体实现
- 创建ServerSocket
使用Java中的ServerSocket可以很容易地创建一个基于TCP的服务端口。服务端端口和客户端端口号不用相同,可以自己定义。示例如下:
ServerSocket serverSocket = new ServerSocket(9999);
- 等待客户端连接,创建Socket
一旦ServerSocket创建完成,服务端就可以开始监听客户端的连接请求,并通过ServerSocket的accept()方法等待客户端连接。一旦有客户端连接,则会返回一个Socket实例。示例如下:
Socket socket = serverSocket.accept();
- 创建线程处理客户端连接
服务端需要处理多个客户端连接,所以我们需要为每个客户端都创建一个线程。而线程的实现,需要继承Thread或实现Runnable接口。以下是线程的示例代码:
class ServerThread implements Runnable {
private Socket socket;
public ServerThread (Socket socket) {
this.socket = socket;
}
@Override
public void run() {
//线程处理代码
}
}
- 服务端处理客户端的消息
一旦连接被建立,服务端就可以发送和接收数据。
使用InputStream可以获取客户端发送过来的数据,使用OutputStream可以将服务端的数据传输到客户端。
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
4. 示例说明
以下是一个简单的ServerSocket聊天程序示例:
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
public static List<Socket> clients = new ArrayList<>();
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("Waiting for clients …");
while (true) {
Socket socket = serverSocket.accept();
clients.add(socket);
Thread thread = new Thread(new ServerThread(socket, clients));
thread.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class ServerThread implements Runnable {
private Socket socket;
private List<Socket> clients;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public ServerThread(Socket socket, List<Socket> clients) {
this.socket = socket;
this.clients = clients;
}
@Override
public void run() {
try {
System.out.println("Client connected:" + socket.getInetAddress() + ":" + socket.getPort());
DataInputStream dis = new DataInputStream(socket.getInputStream());
while (true) {
String str = dis.readUTF();
System.out.println("Received message from client:" + socket.getInetAddress() + ":" + socket.getPort() + " " + str);
for (int i = 0; i < clients.size(); i++) {
Socket temp = clients.get(i);
if (temp == socket || temp.isClosed()) {
continue;
}
DataOutputStream dos = new DataOutputStream(temp.getOutputStream());
dos.writeUTF(sdf.format(new Date()) + " " + socket.getInetAddress() + ":" + socket.getPort() + " said:" + str);
dos.flush();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
上述示例中,首先会创建一个ServerSocket,然后会一直等待客户端的连接。每当有新客户端连接上来,就会为其创建一个独立的线程,并且将该线程加入一个静态的List中。
当有客户端发送消息时,线程会将该消息广播给所有其他的客户端。同时,线程还会记录下行为发生的时间,以及消息的来源。
结论
本文已经详细讲解了如何使用Java中的Socket编写一个简单的聊天程序的整个流程,以及提供了一个对应示例代码,希望对有需要的读者有所帮助。 需要注意的是,在真正的项目开发中,可能需要考虑更多的异常情况和边界条件。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解基于java的Socket聊天程序——服务端(附demo) - Python技术站