聊天交流是目前互联网提供的主要内容。聊天系统有多种实现方式,类似ICQ属于一种点对点的聊天系统,还有一种是基于Socket的集中式聊天系统,这种聊天系统需要登录统一的聊天服务器,每个人的聊天信息其他人都可以看到,类似一种会议室,当然,两个人之间也可以进行保密的私语。
在基于Socket的聊天系统中,主要有两种角色:服务器和客户端,不同的客户端登录集中式的服务器,通过服务器将一个客户端发出的信息推送到其他所有客户端。
点对点聊天系统 v1.0
【系统需求】
【基本功能要求】
· 必须能够支持两个客户端一起聊天。
· 客户端和服务器必须保持随时随地的连接,一个客户端发出聊天信息的同时,另一个客户端接受发送过来的聊天信息。
· 客户端和服务器必须保持随时随地的连接,一个客户端发出聊天信息的同时,另一个客户端接受发送过来的聊天信息。
【目标】
· 熟悉使用网络编程,socket编程
· 熟悉使用多线程编程
· 复习Swing图形化设计
· 熟悉使用多线程编程
· 复习Swing图形化设计
【程序说明】
本程序应许多个客户端连接服务器进行聊天。
客户端发送信息给服务器,服务器接收信息并通知给所有已连接上的客户端。
【运行截图】
【源码】
服务器端:Server.java
-
import java.util.*;
-
import java.io.*;
-
import java.net.*;
-
-
/**
-
* 服务端
-
* @author Linyq.
-
* @author YOYO.1989x.net
-
* @version 1.0
-
*/
-
public class Server{
-
-
/**
-
* 服务器使用的端口
-
*/
-
int port = 1989;
-
-
/**
-
* 连接中的客户端列表
-
*/
-
List<UpdateClient> ClientList = new ArrayList<UpdateClient>();
-
-
/**
-
* 入口方法
-
* @param args
-
*/
-
new Server();
-
}
-
-
/**
-
* 构造方法
-
*/
-
public Server(){
-
try {
-
while(true){
-
UpdateClient Client = new UpdateClient(socket);
-
ClientList.add(Client);
-
}
-
}
-
e.printStackTrace();
-
}
-
}
-
-
/**
-
* 接收/发送客户端信息的线程类。
-
* @author Linyq.
-
* @author YOYO.1989x.net
-
* @version 1.0
-
*/
-
-
/**
-
* 客户端Socket
-
*/
-
-
/**
-
* 数据输出流
-
*/
-
private DataOutputStream dos;
-
-
/**
-
* 数据输入流
-
*/
-
private DataInputStream dis;
-
-
/**
-
* 构造方法:创建一个指定Socket的客户端更新类对象
-
* @param socket 客户端Socket
-
*/
-
this.socket = socket;
-
try {
-
}
-
}
-
-
/**
-
* 向客户端发送信息
-
* @param content 信息
-
*/
-
try {
-
dos.writeUTF(content);
-
ClientList.remove(socket);
-
}
-
}
-
-
/**
-
* 接收客户端信息并向所有已连接上客户端发送信息
-
*/
-
public void run(){
-
try {
-
while(true){
-
for(UpdateClient Client: ClientList){
-
Client.update(content);
-
}
-
}
-
}
-
}
-
-
}
-
-
}
-
客户端:Client.java
-
import java.io.*;
-
import java.net.*;
-
import javax.swing.*;
-
-
import java.awt.*;
-
import java.awt.event.*;
-
import java.io.*;
-
import java.util.Date;
-
-
import javax.swing.*;
-
-
/**
-
* 客户端
-
* @author Linyq.
-
* @author YOYO.1989x.net
-
* @version 1.0
-
*/
-
-
-
/**
-
* 聊天内容显示区域
-
*/
-
/**
-
* 聊天内容滚动条框架
-
*/
-
-
/**
-
* 发送区域
-
*/
-
/**
-
* 名字输入框
-
*/
-
/**
-
* 信息输入框
-
*/
-
-
/**
-
* 服务器Socket
-
*/
-
Socket server = null;
-
/**
-
* 服务器数据输出流
-
*/
-
DataOutputStream dos = null;
-
/**
-
* 服务器数据输入流
-
*/
-
DataInputStream dis = null;
-
/**
-
* 服务器IP地址
-
*/
-
String ip = "127.0.0.1";
-
/**
-
* 服务器端口号
-
*/
-
int port = 1989;
-
-
/**
-
* 接收服务器信息线程
-
*/
-
-
/**
-
* 构造窗体
-
*/
-
public Client(){
-
init();
-
connect();
-
serverThread.start();
-
}
-
-
/**
-
* 初始化窗口信息
-
*/
-
private void init(){
-
this.setTitle("点对点聊天系统");
-
this.setSize(430,220);
-
this.setResizable(false);
-
-
chatArea.setEditable(false);
-
this.add(chatPane,"Center");
-
-
submitPanel.setSize(500,80);
-
submitPanel.add(nameText);
-
submitPanel.add(contentText);
-
-
this.add(submitPanel,"South");
-
-
// contentText.addKeyListener(new EnterListener());
-
contentText.addActionListener(new EnterListener());
-
-
this.addWindowListener(new CloseWindowListener());
-
-
this.setVisible(true);
-
}
-
-
/**
-
* 按下回车键触发的监听器
-
* @author Linyq.
-
* @author YOYO.1989x.net
-
* @version 1.0
-
*/
-
-
@Override
-
sendContent(nameText.getText() + ": " + contentText.getText() + " ["+ nowTime + "]");
-
contentText.setText(null);
-
}
-
-
}
-
// private class EnterListener implements KeyListener{
-
//
-
// /**
-
// * 按下回车键后发送信息
-
// * @param e 键盘事件
-
// */
-
// public void keyPressed(KeyEvent e) {
-
// if(e.getKeyCode()==KeyEvent.VK_ENTER){
-
// String nowTime = new Date().getHours() + ":" + new Date().getMinutes() + ":" + new Date().getSeconds();
-
// sendContent(nameText.getText() + ": " + contentText.getText() + " ["+ nowTime + "]");
-
// contentText.setText(null);
-
// }
-
// }
-
//
-
// public void keyReleased(KeyEvent e) {
-
// }
-
//
-
// public void keyTyped(KeyEvent e) {
-
// }
-
//
-
// }
-
-
/**
-
* 关闭窗口触发的监听器
-
* @author Linyq.
-
* @author YOYO.1989x.net
-
* @version 1.0
-
*/
-
-
}
-
-
}
-
-
sendContent(nameText.getText() + " 退出了聊天室。");
-
disconnect();
-
}
-
-
}
-
-
}
-
-
}
-
-
}
-
-
}
-
-
/**
-
* 更新聊天内容
-
* @param content 信息
-
*/
-
chatArea.append("\n"+content);
-
chatArea.selectAll();
-
}
-
-
/**
-
* 连接服务器
-
*/
-
private void connect(){
-
try {
-
updateContent("已连接上服务器..");
-
sendContent(nameText.getText() + "进入聊天室。");
-
updateContent("服务器未启动。");
-
updateContent("找不到服务器。");
-
}
-
}
-
-
/**
-
* 断开连接
-
*/
-
private void disconnect(){
-
try {
-
dos.close();
-
dis.close();
-
server.close();
-
updateContent("找不到服务器。");
-
}
-
}
-
-
/**
-
* 向服务器端发送信息
-
* @param content 信息
-
*/
-
try {
-
dos.writeUTF(content);
-
dos.flush();
-
updateContent("找不到服务器。");
-
}
-
}
-
-
/**
-
* 接收服务器端信息
-
* @author Linyq.
-
* @author YOYO.1989x.net
-
* @version 1.0
-
*/
-
-
/**
-
* 重载run方法,接收服务器信息并更新聊天内容
-
*/
-
public void run() {
-
try {
-
while(true){
-
updateContent(content);
-
}
-
updateContent("找不到服务器。");
-
}
-
-
}
-
-
}
-
-
/**
-
* 入口方法
-
* @param args
-
*/
-
new Client();
-
}
-
-
}