`
yanghuidang
  • 浏览: 950205 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

用socket实现的文件服务器(3)

阅读更多

//主题帖cache规则:读则加入,否则不需要加入
private static Cache topicCache = new Cache(300*1000*1000);
//回帖cache
private static Cache replyCache = new Cache(300*1000*1000);

/**
* 取主题贴,首先应该从cache中取
*
* @param forumId
* @param topicId
* @return
*/
public String getTopicContent(int forumId, int topicId)
{
//如果cache中有,就从cache中取
Object content=topicCache.get(forumId+"_"+topicId);
if(content!=null)
{
return content.toString();
}
// 如果cache中没有,就从文件中读
try
{
BufferedReader in = new BufferedReader(new FileReader(getTopicFile(
forumId, topicId)));
String s = new String();
String s2 = new String();
while ((s = in.readLine()) != null)
{
s2 += s;
}
in.close();
//加入cache
topicCache.add(forumId+"_"+topicId,s2);
return s2;
}
catch (Exception e)
{
e.printStackTrace();
}
return "";
}

/**
* 取回贴,首先应该从cache中取
*
* @param forumId
* @param topicId
* @return
*/
public List getReplyList(int forumId, int topicId)
{
//如果cache中有,就从cache中取
Object replyList=replyCache.get(forumId+"_"+topicId);
if(replyList!=null)
{
return (ArrayList)replyList;
}
// 如果cache中没有,就从文件中读
List list = new ArrayList();// 回贴的文件记录的list,不需要分解。分解工作在client来完成
try
{
RandomAccessFile in = new RandomAccessFile(getReplyFile(forumId, topicId),"rw");
String s = new String();
while ((s = in.readLine()) != null)
{
list.add(s);
}
in.close();
//加入到cache中
replyCache.add(forumId+"_"+topicId,list);
}
catch (Exception e)
{
e.printStackTrace();
}
return list;
}

/**
* 发帖
*
* @param forumId
* @param topicId
* @return
*/
public void addTopic(int forumId, int topicId, String content)
{
try
{
String filePath=getTopicPath(forumId, topicId);
// 需要判断文件的目录是否存在
File path=new File(filePath);
if(!path.exists())
{
path.mkdirs();
}
//写入文件
PrintWriter out = new PrintWriter(new FileWriter(getTopicFile(forumId,topicId)));
out.write(content);
out.close();
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* 续贴
* @param forumId
* @param topicId
* @param content
*/
public void resumeTopic(int forumId, int topicId, String content)
{
try
{
String filePath=getTopicFile(forumId, topicId);
// 需要判断文件的目录是否存在
File path=new File(filePath);
if(!path.exists())
{
path.mkdirs();
}
//写入文件
content=getTopicContent(forumId,topicId)+content;
PrintWriter out = new PrintWriter(new FileWriter(filePath));
out.write(content);
out.close();
//如果cache中有,则需要更新
Object cacheContent=topicCache.get(forumId+"_"+topicId);
if(cacheContent!=null)
{
topicCache.add(forumId+"_"+topicId,content);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 回贴,如果没有回过贴,要新建文件;如果回过,要续加回贴
* @param forumId
* @param topicId
* @return
*/
public void addReply(int forumId, int topicId,String content,String qq,String replyTime)
{
int replyCount=0;//回贴数s
try
{
String filePath=getReplyFile(forumId, topicId);
String replyCountPath=getReplyCountFile(forumId,topicId);
// 需要判断文件是否存在
File file=new File(filePath);
if(!file.exists())//以前没有回过贴,回贴数为0+1=1
{
(new File(getReplyPath(forumId,topicId))).mkdirs();
(new File(getReplyCountPath(forumId,topicId))).mkdirs();
replyCount++;
}
else//以前回过贴,从文件中读出回贴数,并修改为+1
{
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream(replyCountPath)));
replyCount=in.readInt()+1;
in.close();
}
//修改回贴数
DataOutputStream out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(replyCountPath)));
out.writeInt(replyCount);
out.close();
//写入文件
RandomAccessFile rf=new RandomAccessFile(filePath,"rw");
rf.seek(rf.length());
String str=new Integer(replyCount)+"\0x1e"+qq+"\0x1e"+replyTime+"\0x1e"+content+"\n";
rf.write(str.getBytes());
rf.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 删主题贴和它的回贴
* @param forumId
* @param topicId
* @param content
*/
public void deleteTopic(int forumId, int topicId)
{
try
{
// 需要判断文件是否存在
File path=new File(getTopicFile(forumId, topicId));
if(path.exists())
{
path.delete();
}
//如果cache中有,则需要删除
Object cacheContent=topicCache.get(forumId+"_"+topicId);
if(cacheContent!=null)
{
topicCache.remove(forumId+"_"+topicId);
}
//删除回贴
File reply=new File(getReplyFile(forumId,topicId));
if(reply.exists())
{
reply.delete();
}
File replyCount=new File(getReplyCountFile(forumId,topicId));
if(replyCount.exists())
{
replyCount.delete();
}
//如果cache中有,需要删除
Object replyList=replyCache.get(forumId+"_"+topicId);
if(replyList!=null)
{
replyCache.remove(forumId+"_"+topicId);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
/**
* 删某个回贴
* @param forumId
* @param topicId
* @param content
*/
public void deleteReply(int forumId, int topicId,int replyId)
{
try
{
//把满足条件的记录写到bak文件中
String filePath=getReplyFile(forumId, topicId);
RandomAccessFile rf=new RandomAccessFile(filePath,"rw");
RandomAccessFile rfBak=new RandomAccessFile(filePath+".bak","rw");
String s;
while((s=rf.readLine())!=null)
{
String[] strs=s.split("\0x1e");
if((new Integer(replyId)).toString().equals(strs[0]))
{
//do nothing
}
else
{
rfBak.write((s+"\n").getBytes());
}
}
rfBak.close();
rf.close();
//原文件删除
File file=new File(filePath);
file.delete();
//新文件改名
File file2=new File(filePath+".bak");
file2.renameTo(new File(filePath));
//如果cache中有,需要删除
Object replyList=replyCache.get(forumId+"_"+topicId);
if(replyList!=null)
{
replyCache.remove(forumId+"_"+topicId);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

分享到:
评论

相关推荐

    JAVA Socket编程实现文件上传

    在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库中。这个过程涉及到多个关键知识点,下面我们将详细探讨。 1. **Java Socket基础**:...

    socket网络编程客户和服务器进行文件传输

    本文将深入探讨如何利用socket在C语言中实现客户端与服务器之间的文件传输。 首先,我们需要了解socket的基本概念。Socket是操作系统提供的一种进程间通信(IPC)机制,它允许不同计算机或同一计算机内的不同进程...

    SOCKET TCP 文件传输 客户端 服务器端 client svever

    总的来说,"SOCKET TCP 文件传输 客户端 服务器端 client svever"这个项目旨在教授如何利用TCP协议实现文件的可靠传输,这对于理解网络编程和提升实际应用技能非常有价值。通过深入学习和实践,开发者可以更好地掌握...

    利用socket实现客户端服务器之间简单通信

    在Python中,我们可以使用内置的socket库来实现客户端和服务器的通信。`TCP_server.py`文件通常包含了服务器端的代码,它会创建一个socket对象,绑定到特定的IP地址和端口,然后调用listen()方法监听连接。当有...

    C++开发基于TCPsocket实现的web服务器源码.zip

    基于TCP socket实现的支持报文解析并返回响应报文的Web服务器,可以响应多种文件需求并能够处理特定的错误情况 服务器实现及其功能: 1、读取配置文件,为服务器自身设置IP地址、端口号、阻塞模式、最大连接数目并...

    linux下的c++实现socket文件传输功能

    在Linux环境下,C++实现基于Socket的文件传输是一项常见的任务,尤其在分布式系统、网络编程以及服务器开发中。Socket是网络通信的一种接口,它允许进程间通过网络进行数据交换。本篇文章将深入探讨如何利用C++在...

    C# Socket实现大文件分包传输

    5. **客户端缓存**:在C#中,可以使用MemoryStream或FileStream来实现文件的读取和缓存,这样可以有效地管理内存,避免一次性加载整个文件。 6. **发送与接收**:客户端通过Socket的Send方法逐个发送数据包,服务器...

    用socket实现文件传输

    用socket实现文件传输在MFC中实现客户端和服务器的连接,相互通信。

    基于java socket实现的ftp客户端和服务端交互

    本项目是使用java Socket编程实现的一个简单的FTP服务器和客户端。 客户端目前实现的功能是登录,刷新,上传和下载。同时具有主动模式和被动模式两种模式。 服务器端实现的功能有登录、刷新、上传、下载、列出文件...

    python 使用socket传输图片视频等文件的实现方式

    在Python中,使用socket模块实现文件传输是一个基础且实用的技能。本文将详细介绍在Python环境下,如何使用socket传输包括图片和视频在内的各种文件。文章内容涵盖了服务器端和客户端的代码实现,以及文件处理的相关...

    socket编程(实现对服务器端的文件操作)

    在这个场景中,我们主要关注如何通过Socket来实现在服务器上进行文件的操作,包括下载、上传和删除等。下面将详细介绍Socket编程的基本原理及其在文件操作中的应用。 首先,Socket可以理解为网络上的“插座”,它为...

    java语言通过Socket实现文件传输

    Java语言通过Socket实现文件传输是一种常见的网络编程技术,它基于TCP/IP协议,可以在不同设备间进行数据的可靠传输。在Unix/Linux/Windows等操作系统环境下,无论是客户端(Client)还是服务器端(Server),都可以...

    Java Socket PC端传输文件简易服务器客户端

    在"Java Socket PC端传输文件简易服务器客户端"这个项目中,我们主要会涉及以下知识点: 1. **Java Socket类**: - Socket类代表了网络上的一个连接,它包含了IP地址和端口号。通过创建Socket实例,客户端可以连接...

    socket实现文件上传下载

    通过本文的介绍,我们可以了解到使用 Socket 实现文件上传下载的基本原理和步骤。这种实现方式适用于简单的文件传输需求。对于更复杂的场景,如大文件传输、断点续传等,可能需要考虑更高级的技术方案,例如使用 ...

    socket通信,客户端向服务器传文件

    在这个场景中,我们将讨论如何使用Java实现一个简单的文件传输功能,即客户端通过Socket连接将文件发送到服务器。 首先,我们需要理解Socket通信的基本流程: 1. **服务器端**: - 创建`ServerSocket`实例,指定...

    Socket实现文件传偷示例

    在这个示例中,我们将探讨如何使用Socket来实现文件传输。在互联网通信中,Socket是客户端和服务器之间通信的基础,它允许两个程序通过网络交换数据。 首先,我们需要理解Socket的基本概念。Socket可以看作是两台...

    Socket编程实现文件传输

    本篇文章将详细探讨如何利用Socket实现这一功能。 首先,我们需要了解Socket的基本概念。Socket是操作系统提供的一种接口,用于网络上不同主机间的进程通信。它分为两部分:服务器端的Socket和客户端的Socket。...

    C语言socket实现文件下载

    以上就是使用C语言socket实现文件下载的基本流程。实际应用中,还需要考虑更多的细节,如异常处理、内存管理、性能优化等。通过深入理解和实践这些知识点,可以更好地掌握网络编程,实现高效的文件下载服务。

    c# WinForm 使用Socket实现简单实现服务端与客户端连接,实现消息发送,服务器客户端重连

    本示例中,我们探讨的是如何利用C#的WinForm来创建一个基于Socket的服务端和客户端,实现两者之间的消息传递,以及在服务器断线后的重连机制。 首先,Socket在C#中是System.Net.Sockets命名空间下的类,它提供了TCP...

    Socket实现文件上传下载,含多线程

    在本示例中,"Socket实现文件上传下载,含多线程" 提到了通过Socket在客户端和服务器之间进行文件传输,并且服务器端采用了多线程处理连接请求,提高了服务的并发能力。下面我们将详细探讨相关的知识点。 1. **...

Global site tag (gtag.js) - Google Analytics