问题:1、更改课堂案例功能,实现即时通信功能,即两个客户端进行文字聊天。(提示:每个客户端和服务端之间建立一个线程,同时可以把接收和发送消息操作再分离成两个子线程。通过Map使用QQ号为key,把socket存下来,发送消息时,在消息内加入接收者的QQ号以便服务器进行判断并转发)
扩展功能(选做):
2、实现文件上传功能。
3、实现群聊功能。
4、使用swing实现聊天界面
5、使用swing实现显示在线客户,并可选择发送对象进行聊天。
6、更多扩展功能可模仿QQ实现。如需持久化数据,可暂时先使用文件保存,后期可用数据库替代。
代码:
ChatClient:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class ChatClient {
public static void main(String[] args) {
try {
// 连接服务器
Socket socket = new Socket(“127.0.0.1”, 8888);
// 监听键盘输入的线程
KeyReceiverThread krt = new KeyReceiverThread(socket, “22222”);
// 设置接收者的QQ号
krt.setReceiverQQ(“11111”);
krt.start();
// 监听服务器输入的线程
ServerReceiverThread srt = new ServerReceiverThread(socket);
srt.start();
System.out.println(krt.getSenderQQ() + “上线”);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 接收键盘输入,并发送
class KeyReceiverThread extends Thread {
private Socket socket;
private String senderQQ;// 发送者QQ,即自己
private String receiverQQ;// 接收者QQ
public KeyReceiverThread(Socket socket, String senderQQ) {
super();
this.socket = socket;
this.senderQQ = senderQQ;
}
public void setReceiverQQ(String receiverQQ) {
this.receiverQQ = receiverQQ;
}
public String getSenderQQ() {
return senderQQ;
}
@Override
public void run() {
super.run();
try {
PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);
// 连接成功后,马上发送qq号
pw.println(senderQQ);
// 监听键盘输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String content = br.readLine();
// 发送给服务器
pw.println(receiverQQ + “#” + content);
if (content.toLowerCase().equals(“bye”)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
System.out.println(senderQQ + “下线了”);
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 接服务器输入,并显示
class ServerReceiverThread extends Thread {
private Socket socket;
public ServerReceiverThread(Socket socket) {
super();
this.socket = socket;
}
@Override
public void run() {
super.run();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
String content = br.readLine();
System.out.println(content);
}
} catch (IOException e) {
// e.printStackTrace();
// System.out.println("客户端已退出");
}
}
}
ChatServer:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
public class ChatServer {
public static void main(String[] args) {
System.out.println(“服务器开启…”);
Map