使用网络文本文件查看器的步骤
使用网络文本文件查看器的步骤
这是一个课后练习。主要是熟练掌握IO流,还有TCP程序的一般开发步骤。
TCP程序开发的一般步骤:
Server端:
1. 创建ServerSocket ss在这里要指定监听端口。
2. 获得Socket s 通过ss.accept()方法获得客户端的连接请求。
3. 获得IO流 通过s.getInputStream和s.getOutputStream两个方法获得输入输出流
4. 处理数据,传送数据。
5. 关闭IO流
6. 关闭Socket s
7. 关闭ServerSocket ss
Client端:
1. 创建Socket s 在这里指定网络主机及其相应端口。
2. 获得IO流
3. 处理数据,传送数据
4. 关闭IO流
5. 关闭Socket s
本程序的基本功能是连接到服务器,在提交一个文件路径后,服务器判断是否是文本文件,是并且存在的话就传送文件内容到客户端。
为了功能更加人性化点,在客户端界面加入主机及其端口和文件地址文本框,还有连接,断开连接,下载文件按钮,下载的文件内容显示在文本域中,另外加一条状态栏,用于显示当前客户端状态。在服务器端界面加入监听端口文本框和开始监听按钮,日志信息显示在文本域中。
本程序基本功能实现,但容错性还不是很好。异常没进行处理。
本程序源码如下(开发语言JAVA,开发环境JDK 1.5 Windows 2003):
开发过程中遇到一个难点就是不知道如何判断网络流的结束,文件流中的readLine==null和read==-1都判断不出来,使客户端在等着读但服务器端已经结束。最后通过在服务器端传送完文件后,加传一个标志字符串(quit)用于通知客户端本次数据已经传送完毕。在客户端通过判断接收到的字符串是不是标志字符来结束读循环。但是这样又想到一个问题,那就是服务器端如果不是自己开发的,那怎么样实现两者间的通信呢?现在课程太紧了,暂时没时间处理。
字节流实现:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.net.*;
importjava.io.*;
importjava.util.*;
classDownServerextendsWindowAdapterimplementsActionListener
{
JFramejframe=newJFrame("远程文件查看器服务端");
JPaneljpanel=newJPanel();
JButtonstartJButton=newJButton("启动");
JLabellabel=newJLabel("监听端口");
JTextFieldportJTextField=newJTextField(6);
JTextArealogJTextArea=newJTextArea();
JScrollPanelogJScrollPane=newJScrollPane(logJTextArea);
Dated=newDate();
ServerSocketss;
Sockets;
InputStreamis;
OutputStreamos;
BufferedInputStreambis;
BufferedOutputStreambos=null;
BufferedReaderbr;
PrintWriterpw;
byte[]b=newbyte[1024];
intlen;
StringBuffersb;
Stringfilename;
Stringport="6666";
publicDownServer()
{
jpanel.add(label);
jpanel.add(portJTextField);
jpanel.add(startJButton);
startJButton.addActionListener(this);
jframe.getContentPane().add(jpanel,"North");
jframe.getContentPane().add(logJScrollPane);
jframe.addWindowListener(this);
jframe.setSize(400,300);
jframe.setResizable(true);
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setVisible(true);
}
publicvoidactionPerformed(ActionEvente)
{
Stringstr=e.getActionCommand();
if(str.equals("启动"))
{
port=portJTextField.getText();
logJTextArea.append(d.toString()+":在"+port+"端口启动服务 ");
Servers=newServer();
s.start();
}
if(str.equals("停止"))
{
}
}
classServerextendsThread
{
publicvoidrun()
{
try{ss=newServerSocket(Integer.parseInt(port));}catch(Exceptione){e.printStackTrace();}
while(true)
{
try
{
s=ss.accept();
is=s.getInputStream();
os=s.getOutputStream();
bos=newBufferedOutputStream(os);
br=newBufferedReader(newInputStreamReader(is));
logJTextArea.append(s.getInetAddress()+"在"+d.toString()+"请求连接成功! ");
}
catch(Exceptione){e.printStackTrace();}
sb=newStringBuffer();
while(true)
{
try{filename=br.readLine();}catch(Exceptione){e.printStackTrace();}
if(filename.equals("quit"))
{
logJTextArea.append(s.getInetAddress()+"在"+d.toString()+"与服务器断开连接 ");
try
{
bos.close();
s.close();
}
catch(Exceptione){e.printStackTrace();}
finally
{
break;
}
}
logJTextArea.append(s.getInetAddress()+"在"+d.toString()+"请求查看文件"+filename+" ");
Filef=newFile(filename);
if(f.exists())
{
if(filename.endsWith(".java")||filename.endsWith(".txt")||filename.endsWith(".html")||filename.endsWith(".jsp")||filename.endsWith(".asp")||filename.endsWith(".css")||filename.endsWith(".xml"))
{
try
{
FileInputStreamfis=newFileInputStream(f);
BufferedInputStreambis=newBufferedInputStream(fis);
byte[]b=newbyte[1024];
intlen=0;
StringBuffersb=newStringBuffer();
while((len=bis.read(b))!=-1)