计算机网络综合实习一对一聊天Word格式.docx
- 文档编号:20914697
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:15
- 大小:185.29KB
计算机网络综合实习一对一聊天Word格式.docx
《计算机网络综合实习一对一聊天Word格式.docx》由会员分享,可在线阅读,更多相关《计算机网络综合实习一对一聊天Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
用户编译运行后,在窗口选择----连接。
(2)本软件实现的功能有:
1)允许服务器侦听客户端,客户端连接到服务器
2)允许服务区与客户端之间进行聊天;
3)允许服务器与客户端更改背景颜色;
4)允许服务器与客户端更改字体颜色;
5)服务器与客户端时,会显示内容发送时间;
6)允许服务器与客户端用鼠标点击“发送”,按ENTER键均可发送内容
7)允许服务器与客户端用鼠标点击关闭时关闭聊天窗口
2.功能要求
(1)在服务器端和客户端分别创建一个套接字对象,通过输入输出流连接在一起。
套接字调用close()方法关闭双方的套接字连接。
(2)使用多线程处理套接字连接,把服务器端或客户端读取的数据放在一个单独的线程中去进行,防止服务器端或客户端读取数据可能引起的堵塞。
服务器端收到一个客户的套接字后,应该启动一个专门为该客户服务的线程。
(3)成功连接后,在图形界面中用户可以根据自己的需要进行不同的操作,如:
群聊天、和某一个用户单独聊天(可加入生动的表情描述)、发送文件等。
在界面中会显示用户的聊天记录。
(4)登录功能.
(5)客户可以通过服务器转发,实现一对一和多对多聊天.
(6)实现呼叫功能.
(7)客户端程序应该可以实时显示目前其它用户的状态.
3.功能设计
1)流程图
客户进程
Socket(host,port)
OutputStream
IutputStream
Socket.close()
交换程序
服务器与客户利用ServerSocket和Socket来通信
2)功能实现
(1)Socketsocket=newSocket(Stringhost,intport);
客户端创建Socket对象,host是服务器端的IP地址,port是一个端口号,该对象用于连接服务器。
(2)BufferedReaderbr=newBufferedReader
(newInputStreamReader(socket.getInputStream()));
创建一个使用默认大小输入缓冲区的缓冲字符输入流。
该输入流的指向是一个Reader流,Reader流将数据读入缓冲区,BufferedReader再从缓冲区中读取数据。
InputStreamReader是字节流通向字符流的桥梁:
它使用指定的charset读取字节并将其解码为字符。
getInputStream()获取字节输入流。
(3)PrintStreamps=newPrintStream(socket.getOutputStream());
创建新的打印流,PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
它还提供其他两项功能。
与其他输出流不同,PrintStream永远不会抛出IOException;
而是,异常情况仅设置可通过checkError方法测试的内部标志。
(4)Filefile=getFile();
调用getFile()函数返回一个file的的路径,提示用户输入一个路径,判断是否存在该文件,如果输入非法给予提示,重新输入。
(5)ps.println(file.getName());
ps.println(file.length());
将文件名和大小发送到服务端。
(6)Stringmsg=br.readLine();
if("
已存在"
.equals(msg)){}接收服务器发送回来的是否存在的结果.如果文件已存在,打印提示,客户端退出.如果不存在,准备开始上传。
(7)longfinishLen=Long.parseLong(msg);
服务器端文件的长度。
(8)FileInputStreamfis=newFileInputStream(file);
创建FileInputStream从文件中读取数据,OutputStreamout=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.对话窗口
2.实验界面(JAVA)
五.实验总结
本次实习从选题到正式开始实习有些波折,最初因感兴趣选择了本题目,却因为个别原因没有成功选上,一番折腾之后还是拿到了这个题目。
拿到题目后便开始查阅各种资料,借鉴前辈的经验之作,程序运行中确是屡屡受挫。
五个做相同实验的人没有一个能够成功运行出来,后来多次操作和上网查阅之后发现问题有二,一为端口占用中,解决方法是不断修改端口,其二为运行顺序,应先运行服务端程序后运行客户端程序。
对话窗口成功运行之后,觉得聊天窗口太过单调,又通过请教班里“大神”以及上网搜索、查阅书籍资料,终于能将聊天窗口设计的稍微合理和可观。
不可否认的是,我们的一对一程序相对微信QQ太过简单,但是当聊天窗口出来的时候,真的是相当激动和自豪。
似乎所有的辛苦跟疲惫都烟消云散了。
本次实习,使我了解到理论和实践相结合的重要性,从理论中得出结论,才能真正掌握这门技术,才能提高自己独立思考的能力,在程序设计的过程中,我可以自己解决问题。
这让我真正体会到要将一门知识学的更深入,必须加强实践,多练习。
六.主要参考文献
1、《JavaSE程序设计》;
青岛东合信息技术有限公司
2、《Visual+C++网络高级编程》;
人民邮电出版社
3、《Windows网络与通信程序设计》;
人民邮电出版社;
王艳平著
4、《UNIX网络编程》;
RichardStevens著
5、《JAVA程序设计基础》
七.附录(所有代码)
1.客户端
packagesrc;
//声明类所在的包
importjava.awt.*;
//引入AWT图形开发包
importjava.awt.event.*;
//引入图形事件处理包
importjava.io.*;
//引入输入输出包
import.*;
//引入网络相关的包
publicclassClientextendsFrame{
//声明主类,继承窗体类,也就是客户端的窗体
Sockets=null;
//定义端口类对象s,因为很多地方要使用到,所以定义为类的属性
DataOutputStreamdos=null;
//定义输出流类的对象
DataInputStreamdis=null;
//定义输入流类的对象
privatebooleanbConnected=false;
//客户端是否启动标志
TextFieldtfTxt=newTextField();
//定义文本输入行,用来输入聊天内容
TextAreataContent=newTextArea();
//定义文本域,用来显示聊天记录
ThreadtRecv=newThread(newRecvThread());
//定义线程对对象,用来接收每个客户端
publicstaticvoidmain(String[]args){
//主函数,程序入口
newClient().launchFrame();
//创建客户端实例,并启动
}
publicvoidlaunchFrame(){
//服务端初始化函数
this.setTitle("
巴卫"
);
//设置窗口标题
setLocation(400,300);
//设置窗口位置
this.setSize(300,300);
//设置窗口大小
add(tfTxt,BorderLayout.SOUTH);
//把文本行加入到窗口,并设置它的位置
add(taContent,BorderLayout.NORTH);
//把文本域加入到窗口
pack();
//把BorderLayout布局的其他模块隐藏
this.addWindowListener(newWindowAdapter(){
//为窗体增加关闭功能,设置窗口事件监听器
publicvoidwindowClosing(WindowEventarg0){
//覆写窗口关闭事件
disconnect();
//关闭窗口时调用客户端结束函数
System.exit(0);
//系统退出
}
});
tfTxt.addActionListener(newTFListener());
//为文本行注册事件监听器,就是用户输入消息后,回车把消息发送出去
setVisible(true);
//使窗体可见
connect();
//窗体初始化后,就立刻和服务器端相连
tRecv.start();
//启动线程
publicvoidconnect(){
//服务器端连接函数
try{
s=newSocket("
127.0.0.1"
8888);
//初始化端口和服务器IP地址
dos=newDataOutputStream(s.getOutputStream());
//初始化输出流
dis=newDataInputStream(s.getInputStream());
//初始化输入流
System.out.println("
服务器连接成功"
//调试语句
bConnected=true;
//客户端启动标志值为真
}catch(UnknownHostExceptione){
//捕获未知服务器异常
e.printStackTrace();
//输出异常信息
}catch(IOExceptione){
//捕获输入输出异常
}
publicvoiddisconnect(){
//断开连接函数
dos.close();
//关闭输出流
dis.close();
//关闭输入流
s.close();
//关闭断口
privateclassTFListenerimplementsActionListener{
//声明文本行的事件监听器类
publicvoidactionPerformed(ActionEvente){
//覆写文本域的事件响应方法
Dated=newDate();
Stringstr=d.toLocaleString()+"
:
巴卫说:
"
+tfTxt.getText().trim();
//获取文本行的内容
tfTxt.setText("
"
//把文本行的内容显示到文本域
try{
dos.writeUTF(str);
//向输出流缓冲写数据
dos.flush();
//数据发送
}catch(IOExceptione1){
e1.printStackTrace();
privateclassRecvThreadimplementsRunnable{
//声明线程类,用来接收服务器对应线程发来的消息
publicvoidrun(){
//线程启动函数
while(bConnected){
Stringstr=dis.readUTF();
//读取缓冲区数据
taContent.setText(taContent.getText()+str+'
\n'
//把缓冲区内容显示在文本域上
}
}catch(SocketExceptione){
System.out.println("
退出了,bye!
//对方退出提示,非正常退出,像断电之类的
}catch(EOFExceptione){
退出了,bye-bye!
//正常退出提示
}catch(IOExceptione){
//捕获其他异常
e.printStackTrace();
}
2.服务器端
importjava.util.*;
//引入线程相关包
publicclassServer{
//定义服务器端类
booleanstarted=false;
//服务器启动标志
ServerSocketss=null;
List<
Client>
clients=newArrayList<
();
//因为要使用多个客户端相连,所以声明客户端数组
newServer().start();
publicvoidstart(){
ss=newServerSocket(8888);
//设置服务器端口,TCP端口为8888
started=true;
}catch(BindExceptione){
//捕获打开多个服务器端的异常
端口使用中...."
请关掉相关程序并重新运行服务器!
System.exit(0);
while(started){
Sockets=ss.accept();
//服务器启动后,接收自客户端的消息
Clientc=newClient(s);
//创建客户端进程
newThread(c).start();
//启动客户端进程
clients.add(c);
//加入到客户端列表
}finally{
ss.close();
classClientimplementsRunnable{
//声明客户端线程类
privateSockets;
privateDataInputStreamdis=null;
privateDataOutputStreamdos=null;
privatebooleanbConnected=false;
publicClient(Sockets){
//客户端线程构造函数
this.s=s;
dis=newDataInputStream(s.getInputStream());
dos=newDataOutputStream(s.getOutputStream());
bConnected=true;
publicvoidsend(Stringstr){
//发送消息函数
clients.remove(this);
对方退出了!
//向每个客户端发消息
for(inti=0;
i<
clients.size();
i++){
Clientc=clients.get(i);
c.send(str);
}
客户端退出!
}finally{
try{
if(dis!
=null)
dis.close();
if(dos!
dos.close();
if(s!
=null){
s.close();
}catch(IOExceptione1){
e1.printStackTrace();
课程设计成绩评定表
学生姓名
专业班级
设计题目
实现一个一对一的聊天程序
指导教师评语及意见:
指导教师评阅成绩:
指导教师签字:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 综合 实习 一对一 聊天