java多人聊天怎么搭建?求介绍!
要搭建一个Java多人聊天应用程序,您需要按照以下步骤进行操作:
设计用户界面:设计聊天界面,包括消息列表、输入框、发送按钮等组件。
建立服务器:在云服务商或自己的服务器上建立一个服务器,用于存储和转发消息。您可以选择使用现有的聊天服务器,如Firebase Realtime Database、Google Cloud Messaging、XMPP等,也可以自己编写服务器端代码。
登录和注册:在应用中实现用户登录和注册功能,以便用户可以使用应用。
建立Socket连接:使用Socket API建立与服务器的Socket连接。您可以使用Java中的Socket或Android中的Socket类来建立连接。
发送消息:在应用中实现发送消息的功能。当用户在应用中输入一条消息并点击发送按钮时,应用将该消息发送到服务器。
接收消息:使用Socket API监听服务器发送的消息。当服务器有新消息时,应用将其接收并显示在消息列表中。
处理消息:在应用中处理接收到的消息。当应用接收到一条消息时,它需要将消息保存到本地数据库中,并更新消息列表。
实现通知:当应用在后台运行时,您需要使用通知来通知用户有新消息到达。您可以使用Android中的通知API来实现通知功能。
实现其他功能:您可能还需要实现其他功能,如消息撤回、表情符号、和文件发送等。
需要注意的是,聊天应用中的数据传输需要使用安全的方式进行,以确保用户数据不被窃取。您可以使用SSL或TLS等安全协议来保护数据传输。
同时,为了实现多人聊天,您需要在服务器端实现广播机制,将消息广播到所有连接的客户端。在Java中,您可以使用多线程来实现广播机制,每个客户端连接都在单独的线程中运行。当服务器接收到一条消息时,它将该消息发送到所有客户端连接的线程中,以便广播到所有客户端。
以上是搭建Java多人聊天应用程序的基本步骤,具体实现方式因应用需求和技术选择而异。
先导smartupload jar包!在写form表单<input tyle="file" enctype="multipart/form-data" method="post">enctype和method别写错了!
写一个简单的吧!
<%page import="comjspsmartupload"%>
<%
SmartUpload su=new SmartUpload ();//初始化SmartUpload对象
try{ //捕获他可能出现的异常
suupload();//执行上传
}catch(Exception ex){
exprintStackTrace;
}
File file=sugetFile()getFile(0); //(得到单个的上传文件的信息)这里得到的File对象是你到的jar包里的comjspsmartuploadFile类型 别写成IO 里面的File了
String filepath="upload\\"; //在这之前要在你所建项目的目录下单建一个upload文件夹
filepath+=filegetFileName();
filesaveAs(filepath,SmartUploadSAVE-VIRTUAL);
不知道是否建了与它相对应的数据库表啊?
不懂得再玩吧!
%>
您好,提问者:
1、这个我建议使用FTP传输,如果不是自动传输的可以使用FTP方便。
2、写程序的话要建立Socket客户端、和 ServerSocket服务端才可以实现。
这里你弄错了一个问题;\x0d\你的程序是要传递的二进制数据\x0d\而不是传递路径,然后再到服务器读取文件数据(你的服务器有这个文件)\x0d\只有当你的服务器下有这个文件了,你传递一个路径,读取是可以的\x0d\//---\x0d\关于如何上传文件, 自己google一下,很多教程
Java开发高并发的处理方法:
最基础的地方做起,优化我们写的代码,减少必要的资源浪费
避免频繁的使用new对象,对于整个应用只需要存在一个实例的类,我们可以使用单例模式。对于String连接操作,使用 StringBuffer或StringBuilder,对于工具类可以通过静态方法来访问。
避免使用错误的方式,尽量不用instanceof做条件判断。使用java中效率高的类,比如ArrayList比Vector性能好。
服务器分离
对于web服务器来说,是最消耗资源的,于是我们有必要把与页面进行分离,我们把放到独立的服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为的问题而崩溃。在服务器上,我们可以对不同的配置进行优化。
缓存
具体接触过的缓存机制是hibernate的缓存机制。为了避免每次都向数据库中取得数据,我们把用户常常访问到的数据放到内存中,甚至缓存十分大的时候我们可以把内存中的缓存放到硬盘中。还有高级的分布式缓存数据库使用,都可以增加系统的抗压力。
分批传送
在做某项目的时候,一次传递的参数太多,而且数据库规定一次最多传递的参数最多是三万条,当时有五万条记录,那怎么传送呢?最终是分批传送,电梯里一次乘不下那么多的人,会报超重的bug,那就分批把人送上去。
还有一次在考试系统中,如果那么多的考试人员同时提交到数据库中,数据库的压力增大,有时会被down掉,当时采用的方法是使用ajax异步传输,没有等待考生点击提交按钮的时候,就把考生的答案自动提交,这样也避免了突然断电考生前面做过的题出现丢失的现象。
DB优化
在数据库设计的时候就要考虑到后期的维护,数据库三范式是我们设计数据库索要遵循的原则。
索引的建立:建立索引要适当,如果一个表经常用来被查询,对于增加和修改很少被用到,我们就可以为这个表建立索引,因为对于增加和修改和删除操作时,我们对索引的维护要大大超过索引给我们带来的效率。
表字段的类型选择要恰当。包括字段的长度、类型等,要根据实际存储的数据进行选择,长度不要过长,否则会影响效率。
外键要慎用,因为主键代表这一张表,而外键代表一群表,对表之间进行了关联,在删除修改等需要我们关联。
在数据库操作上。 尽量使用prepareStatement,少用Statement,因为PrepareStatement是进行预编译的。
connection设置为readOnly,Connection是对书库连接,属于重量级,我们使用即可。
连接池的使用,我们可以修改数据库默认的连接数。
上传到服务器上会比较好,数据库可以记录一些必要的信息,比如文件的名称,类型(扩展名),大小,创建时间及谁的文件等等;如果把文件放入数据库,读写性能不如文件系统,还会加大数据库的压力。放到服务器上注意要设计好一个文件结构,不然以后一个文件夹里有成千上万个文件,打开那个文件夹就要好久,更不用说查找和下载了。
package eductguJTwacker;
import javaawtBorderLayout;
import javaawtCursor;
import javaawtDimension;
import javaawtGraphics;
import javaawtRectangle;
import javaawtToolkit;
import javaawteventActionEvent;
import javaawteventActionListener;
import javaawteventWindowAdapter;
import javaawteventWindowEvent;
import javaawteventWindowListener;
import javaawtimageBufferedImage;
import javaioFile;
import javaioFileInputStream;
import javaxswingJButton;
import javaxswingJComboBox;
import javaxswingJFrame;
import javaxswingJPanel;
import javaxswingJScrollPane;
import javaxswingJToolBar;
import javaxswingSwingUtilities;
import comsunimagecodecjpegJPEGCodec;
import comsunimagecodecjpegJPEGImageDecoder;
import eductgutwainJTwain;
/
这是显示扫描的frame
/
public class JTwacker extends JFrame {
class JPEGPanel extends JPanel {
/ Image for the inner class
/
protected BufferedImage mJPEGPanelBufferedImage;
/ Pnale to diaply the image
/
public JPEGPanel() {
// no op
}
/ Sets the bufferedimage into the class
@param bi BufferedImage
/
public void setBufferedImage(BufferedImage bi) {
if (bi == null) {
return;
}
mJPEGPanelBufferedImage = bi;
Dimension d = new Dimension(mJPEGPanelBufferedImagegetWidth(this),
mJPEGPanelBufferedImagegetHeight(this));
setPreferredSize(d);
revalidate();
repaint();
}
/ Paints the component
@param g Graphics object used for the painting
/
public void paintComponent(Graphics g) {
superpaintComponent(g);
Dimension d = getSize();
gsetColor(getBackground());
gfillRect(0, 0, dwidth, dheight);
if (mJPEGPanelBufferedImage != null) {
gdrawImage(mJPEGPanelBufferedImage, 0, 0, this);
}
}
}
protected JPEGPanel mJpegPanel;
protected BufferedImage mBufferedImage;
protected JComboBox mSourcesCombo;
protected JToolBar mToolBar;
/ Constructor
/
public JTwacker() {
super("测试");
mJpegPanel = new JPEGPanel();
JScrollPane ps = new JScrollPane(mJpegPanel,
JScrollPaneVERTICAL_SCROLLBAR_ALWAYS,
JScrollPaneHORIZONTAL_SCROLLBAR_ALWAYS);
getContentPane()add(ps, BorderLayoutCENTER);
WindowListener wndCloser = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
Systemexit(0);
}
};
addWindowListener(wndCloser);
mToolBar = new JToolBar("Twain");
mToolBarsetFloatable(false);
addButtons();
getContentPane()add(mToolBar, BorderLayoutNORTH);
setSize(800, 600);
/ Center the frame /
Dimension screenDim = ToolkitgetDefaultToolkit()getScreenSize();
Rectangle frameDim = getBounds();
setLocation(
(screenDimwidth - frameDimwidth) / 2,
(screenDimheight - frameDimheight) / 2
);
setVisible(true);
}
protected void addButtons(){
JButton _ab = new JButton("扫描");
_abaddActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
acquireImage();
}
});
mToolBaradd(_ab);
mToolBaraddSeparator();
if (eductgutwainJTwaingetInstance()isTwainAvailble()) {
String[] twainSources = JTwaingetInstance()getAvailableSources();
if (twainSources != null) {
mSourcesCombo = new JComboBox(twainSources);
} else {
mSourcesCombo = new JComboBox();
mSourcesComboaddItem("<NONE AVAILABLE>");
}
} else {
mSourcesCombo = new JComboBox();
mSourcesComboaddItem("<NONE AVAILABLE>");
}
mToolBaradd(mSourcesCombo);
}
protected void acquireImage() {
if (JTwaingetInstance()isTwainAvailble()){
if (mSourcesCombogetItemCount() > 0 ){
String _source = (String)mSourcesCombogetSelectedItem();
if (_source != null){
String _filename = JTwaingetInstance()acquire(_source);
Systemoutprintln(_filename);
if (_filename != null && _filenamelength() > 0) {
File fChoosen = new File(_filename);
// savetofile(fChoosen);
showImage(fChoosen);
} else {
Systemoutprintln("哎呀,怎么出错了!");
}
} // end if
} // end if
} // end if
}
protected void showImage(final File file) {
if (file == null || !fileexists()) {
return;
}
setCursor(CursorgetPredefinedCursor(CursorWAIT_CURSOR));
Thread runner = new Thread() {
public void run() {
try {
FileInputStream in = new FileInputStream(file);
JPEGImageDecoder decoder = JPEGCodeccreateJPEGDecoder(in);
mBufferedImage = decoderdecodeAsBufferedImage();
inclose();
SwingUtilitiesinvokeLater( new Runnable() {
public void run() {
reset();
}
});
}
catch (Exception ex) {
exprintStackTrace();
}
setCursor(CursorgetPredefinedCursor( CursorDEFAULT_CURSOR));
}
};
runnerstart();
}
//把扫描得到的保存为文件,然后上传到服务器或保存到数据库中
protected void savetofile(final File file) {
try {
File mfile=new File("c:\\ddjpg");
if (mfileexists()) {
mfiledelete();
}else {
filerenameTo(mfile);
}
} catch (Exception e) {
eprintStackTrace();
// TODO: handle exception
}
}
protected void reset() {
if (mBufferedImage != null) {
mJpegPanelsetBufferedImage(mBufferedImage);
}
}
public static void main(String argv[]) {
new JTwacker();
}
}
-------------------------
package eductgutwain;
/
这是调用动态链接库的类
/
public class JTwain {
private static final JTwain mInstance = new JTwain();
protected final String DLL_NAME = "jtwain";
private JTwain() {
initLib();
}
public static JTwain getInstance(){
return mInstance;
}
public native boolean isTwainAvailble();
public native String[] getAvailableSources();
public native String acquire();
public native String acquire(String sourceName);
private void initLib(){
try {
SystemloadLibrary(DLL_NAME);
}catch(Exception e) {
eprintStackTrace();
}
finally {
// Systemoutprintln("Loading : " + DLL_NAME + "dll");
}
}
}
一般有两种情况,
一种是前端开发需要显示的,这个是页面构成必须的元素,一般这些会做 动静分离,后台接口 跟 前端资源会部署在不同的服务器上,有不同的优化,一般会有转发的服务器,判断是后台接口,就转发到后台的服务器,如果是前端资源,就转发到前台的服务器。一般情况下,前端服务器,跟后台的服务器,是分离开的,有不同的人去管理,如果项目小的话,可能就全放在一个。这个优化的化,你可以去了解下 CDN原理。这个是用来优化静态资源加载情况的。
另一种情况是,显示的,不是前端构成的,是用户上传文件产生的,这种情况下,现在一般有专门的对象存储,用过 七牛云,跟阿里的。这个的逻辑是文件上传的时候,不是上传到我们自己的服务器,上传到专门的云服务器,我们自己数据库只需要保存这些上传文件的地址,真正使用的时候,把连接给前端,前端自动会根据内容到专门的云服务器上去获取。所有的安全,优化,带宽,缓存命中,这些都有由云服务器去保证。 简单来说,只有有钱,这些东西根本不会成为你项目的瓶颈。
作为技术,我们讨论的应该不是这些。会做备份,这个可以有专门的磁盘阵列去实现,简单来说,就是上传的内容保存到磁盘的时候,会自动多保存几个备份到不同的磁盘上。还是那句话,多去了解下CDN的原理,最后这段,个人理解,不一定对。
0条评论