Java实现聊天室可以采用网络编程中的Socket和ServerSocket技术来实现。具体实现步骤如下:
服务器端创建ServerSocket对象,并指定一个端口号来监听客户端的连接请求。
客户端创建Socket对象,并指定服务器端的IP地址和端口号来连接服务器。
服务器端通过ServerSocketaccept()方法等待客户端的连接请求,当有新的连接请求到达时,创建一个新的线程来处理该客户端的请求,并将该线程加入到线程池中。
客户端连接服务器后,通过SocketgetInputStream()方法获取输入流,并通过SocketgetOutputStream()方法获取输出流,向服务器发送消息或接收来自服务器的消息。
服务器端通过线程池中的线程来处理客户端的请求,服务器可以实现广播功能,将接收到的客户端消息转发给其他所有客户端,也可以实现点对点的私聊功能。
当客户端退出聊天室时,需要关闭相应的Socket连接,并通知其他客户端该客户端已经离开。
聊天室中的消息可以使用特定的格式进行编码和解码,以便服务器端和客户端可以正确地解析和处理消息。
需要注意的是,在实现聊天室时需要考虑线程安全、消息编解码、异常处理等问题,以确保聊天室的稳定和可靠性。同时,还需要进行充分的测试和优化,以提高聊天室的性能和用户体验。
weblogic和websphere都有自己集群的session共享设定,打开就可以session共享了。不过速度比较慢。tomcat可以通过配置memcached实现session同步。网上可以查到。
补充一下。如果使用apache转发的话,相同客户请求发起的会被转发到相同的sever,就不需要session共享了。方法一: 客户端需要登录 用户发送的消息 后台自动在最前面加上#要接收消息的用户的名字# 在后台解析
方法二: 每个用户(线程)在产生的时候 多产生一个随机数(可以用synchronized new Date()getTime()),叫做ThreadId 然后制作一个线程的Map,key是ThreadId,value是该Thread几种常见的解决方案实现原理
1)轮询(Pull)方式:客户端定时向服务器发送询问消息,一旦服务器有变化则立即同步消息。
2)SMS(Push)方式:通过拦截SMS消息并且解析消息内容来了解服务器的命令,但这种方式一般用户在经济上很难承受。
3)持久连接(Push)方式:客户端和服务器之间建立长久连接,这样就可以实现消息的及时行和实时性。
3、消息推送解决方案概述
A、C2DM云端推送方案
在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android
Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。
该方案存在的主要问题是C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用。
B、MQTT协议实现Android推送
采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
wmqttjar
是IBM提供的MQTT协议的实现。我们可以从这里(>可以直接通过流的形式上传或者下载。
import javaioFile;
import javaioFileInputStream;
import javaioFileOutputStream;
import javautilProperties;
import comjcraftjschChannel;
import comjcraftjschChannelSftp;
import comjcraftjschJSch;
import comjcraftjschSession;
import comjcraftjschSftpException;
import hkrtb2bviewutilLog;
import javautilVector;
import znccfccbutilCCFCCBUtil;
/
/
public class CCFCCBSftp {
/
连接sftp服务器
@return
/
public static ChannelSftp connect() {
ChannelSftp sftp = null;
try {
JSch jsch = new JSch();
jschgetSession(CCFCCBUtilCCFCCBHOSTNAME, CCFCCBUtilCCFCCBHOSTNAME, 22);
Session sshSession = jschgetSession(CCFCCBUtilCCFCCBLOGINNAME, CCFCCBUtilCCFCCBHOSTNAME, 22);
Systemoutprintln("Session created");
sshSessionsetPassword(CCFCCBUtilCCFCCBLOGINPASSWORD);
Properties sshConfig = new Properties();
sshConfigput("StrictHostKeyChecking", "no");
sshSessionsetConfig(sshConfig);
sshSessionconnect();
Systemoutprintln("Session connected");
Systemoutprintln("Opening Channel");
Channel channel = sshSessionopenChannel("sftp");
channelconnect();
sftp = (ChannelSftp) channel;
Systemoutprintln("Connected to " + CCFCCBUtilCCFCCBHOSTNAME + "");
} catch (Exception e) {
}
return sftp;
}
/
连接sftp服务器
@param host 主机
@param port 端口
@param username 用户名
@param password 密码
@return
/
public static ChannelSftp connect(String host, int port, String username,
String password) {
ChannelSftp sftp = null;
try {
JSch jsch = new JSch();
jschgetSession(CCFCCBUtilCCFCCBHOSTNAME, CCFCCBUtilCCFCCBHOSTNAME, 22);
Session sshSession = jschgetSession(CCFCCBUtilCCFCCBLOGINNAME, host, port);
Systemoutprintln("Session created");
sshSessionsetPassword(CCFCCBUtilCCFCCBLOGINPASSWORD);
Properties sshConfig = new Properties();
sshConfigput("StrictHostKeyChecking", "no");
sshSessionsetConfig(sshConfig);
sshSessionconnect();
Systemoutprintln("Session connected");
Systemoutprintln("Opening Channel");
Channel channel = sshSessionopenChannel("sftp");
channelconnect();
sftp = (ChannelSftp) channel;
Systemoutprintln("Connected to " + host + "");
} catch (Exception e) {
}
return sftp;
}
/
上传文件
@param directory 上传的目录
@param uploadFile 要上传的文件
@param sftp
/
public void upload(String directory, String uploadFile, ChannelSftp sftp) {
try {
sftpcd(directory);
File file = new File(uploadFile);
sftpput(new FileInputStream(file), filegetName());
} catch (Exception e) {
eprintStackTrace();
}
}
/
下载文件
@param directory 下载目录
@param downloadFile 下载的文件
@param saveFile 存在本地的路径
@param sftp
@return
/
public static String download(String directory, String downloadFile, String saveFile, ChannelSftp sftp) {
try {
sftpcd(directory);
File file = new File(saveFile);
FileOutputStream fos = new FileOutputStream(file);
sftpget(downloadFile, fos);
sftpdisconnect();
fosclose();
} catch (Exception e) {
Loginfo("下载文件过程出错:" + egetMessage());
return "false";
}
return "true";
}
/
删除文件
@param directory 要删除文件所在目录
@param deleteFile 要删除的文件
@param sftp
/
public void delete(String directory, String deleteFile, ChannelSftp sftp) {
try {
sftpcd(directory);
sftprm(deleteFile);
} catch (Exception e) {
}
}
/
列出目录下的文件
@param directory 要列出的目录
@param sftp
@return
@throws SftpException
/
public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException {
return sftpls(directory);
}
public static void main(String[] args) {
CCFCCBSftp sf = new CCFCCBSftp();
String host = CCFCCBUtilCCFCCBHOSTNAME;
int port = 22;
String username = CCFCCBUtilCCFCCBLOGINNAME;
String password = CCFCCBUtilCCFCCBLOGINPASSWORD;
String directory = "/ccfccb/904999900099/download/";
//String uploadFile = "D:\\tmp\\uploadtxt";
String downloadFile = "CCF_904999900099_20150317_0001zip";
String saveFile = CCFCCBUtilCCFCCBUploadFilePath + "//" + "CCF_904999900099_20150317_0001zip";
//String deleteFile = "deletetxt";
ChannelSftp sftp = CCFCCBSftpconnect(host, port, username, password);
//sfupload(directory, uploadFile, sftp);
CCFCCBSftpdownload(directory, downloadFile, saveFile, sftp);
//sfdelete(directory, deleteFile, sftp);
try {
sftpcd(directory);
// sftpmkdir("ss");
Systemoutprintln("finished");
} catch (Exception e) {
}
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)