存在的结果. 如果文件已存在, 打印提示, 客户端退出. 如果不存在, 准备开始上传。
(7)long finishLen = Long.parseLong(msg); 服务器端文件的长度。
(8)FileInputStream fis = new FileInputStream(file); 创建FileInputStream从文件中读取数据,OutputStream out = socket.getOutputStream();输出字节流,输出流接收输出字节并将这些字节写出到Socket的输出流。
(9)fis.skip(finishLen); 从输入流中跳过并丢弃finishLen个字节的数据,即跳过服务端已完成的大小。
(10)len = fis.read(byte[] buffer));从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。
` (11)out.write(byte[] b,int off,int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
四.测试数据及运行结果
1.对话窗口
4
2.实验界面(JAVA)
五.实验总结
本次实习从选题到正式开始实习有些波折,最初因感兴趣选择了本题目,却因为个别原因没有成功选上,一番折腾之后还是拿到了这个题目。拿到题目后便开始查阅各种资料,借鉴前辈的经验之作,程序运行中确是屡屡受挫。五个做相同实验的人没有一个能够成功运行出来,后来多次操作和上网查阅之后发现问题有二,一为端口占用中,解决方法是不断修改端口,其二为运行顺序,应先运行服务端程序后运行客户端程序。对话窗口成功运行之后,觉得聊天窗口太过单调,又通过请教班里“大神”以及上网搜索、查阅书籍资料,终于能将聊天窗口设计的稍微合理和可观。不可否认的是,我们的一对一程序相对微信QQ太过简单,但是当聊天窗口出来的时候,真的是相当激动和自豪。
5
似乎所有的辛苦跟疲惫都烟消云散了。
本次实习,使我了解到理论和实践相结合的重要性,从理论中得出结论,才能真正掌握这门技术,才能提高自己独立思考的能力,在程序设计的过程中,我可以自己解决问题。这让我真正体会到要将一门知识学的更深入,必须加强实践,多练习。
六.主要参考文献
1、《JavaSE程序设计》;青岛东合信息技术有限公司 2、《Visual+C++网络高级编程》;人民邮电出版社
3、《Windows网络与通信程序设计》;人民邮电出版社;王艳平著 4、《UNIX网络编程》;Richard Stevens著 5、《JAVA程序设计基础》
6
七.附录(所有代码)
1.客户端
package src;//声明类所在的包
import java.awt.*;// 引入AWT图形开发包 import java.awt.event.*;//引入图形事件处理包 import java.io.*;//引入输入输出包 import java.net.*;//引入网络相关的包 public class Client extends Frame {
// 声明主类,继承窗体类,也就是客户端的窗体 Socket s = null; // 定义端口类对象 s,因为很多地方要使用到,所以定义为类的属性 DataOutputStream dos = null; // 定义输出流类的对象 DataInputStream dis = null; // 定义输入流类的对象 private boolean bConnected = false; // 客户端是否启动标志 TextField tfTxt = new TextField(); // 定义文本输入行,用来输入聊天内容 TextArea taContent = new TextArea(); // 定义文本域,用来显示聊天记录 Thread tRecv = new Thread(new RecvThread()); // 定义线程对对象,用来接收每个客户端 public static void main(String[] args) { // 主函数,程序入口 new Client().launchFrame(); // 创建客户端实例,并启动 } public void launchFrame() { // 服务端初始化函数 this.setTitle(\巴卫\); // 设置窗口标题 setLocation(400, 300); // 设置窗口位置 this.setSize(300, 300); // 设置窗口大小 add(tfTxt, BorderLayout.SOUTH); // 把文本行加入到窗口 ,并设置它的位置 add(taContent, BorderLayout.NORTH);
7
// 把文本域加入到窗口 pack();
// 把BorderLayout布局的其他模块隐藏
this.addWindowListener(new WindowAdapter() { // 为窗体增加关闭功能,设置窗口事件监听器 public void windowClosing(WindowEvent arg0) { // 覆写窗口关闭事件 disconnect(); // 关闭窗口时调用客户端结束函数 System.exit(0); // 系统退出 } });
tfTxt.addActionListener(new TFListener());
// 为文本行注册事件监听器,就是用户输入消息后,回车把消息发送出去 setVisible(true); // 使窗体可见 connect();
// 窗体初始化后,就立刻和服务器端相连 tRecv.start(); // 启动线程 }
public void connect() { // 服务器端连接函数 try { s = new Socket(\, 8888); // 初始化端口和服务器IP地址 dos = new DataOutputStream(s.getOutputStream()); // 初始化输出流 dis = new DataInputStream(s.getInputStream()); // 初始化输入流 System.out.println(\服务器连接成功\); // 调试语句 bConnected = true; // 客户端启动标志值为真
} catch (UnknownHostException e) { // 捕获未知服务器异常 e.printStackTrace(); // 输出异常信息 } catch (IOException e) { // 捕获输入输出异常 e.printStackTrace(); } }
8