java简单聊天程序实验报告及代码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验内容
实验题目:
1、使用URL访问用户指定网站,获取该网页的HTML代码显示给用户,并能保存至指定文件中。
2、使用ServerSockt,Socket对象实现两个用户之间的端到端聊天。
要求:采用UI界面设计,界面友好。
二、实验过程
(这是实验报告极其重要的内容。要抓住重点,可以从理论和实践两个方面考虑。这部分要写明依据什么知识点以及使用方法进行实验以及实验步骤。不要简单照抄实习指导,更不可写一大堆源代码)
题目1、
1、分析题目,了解URL类及其方法。
2、设计一个模拟浏览器界面,有一个文本框,文本区域,一个搜索按钮,一个保存按钮。
3、在搜索事件里面写获取HTML的代码,在保存你面写将内容保存至文件中。
题目2、
1、分析题目,了解import .*,包下用到的一些类,比如URL, Socket和ServerSocket,以及这些类的方法,根据要实现的功能,进行调用。了解端到端的通讯,以及怎样建立连接。
2、设计界面:服务器界面,客户端界面。
3、写出对内容的读写代码,注意哪部分功能,在什么时候实现,应该写在哪部分。以及怎样通信:如图
三、实验结果
(应先列出测试数据,要写明实验的现象,实验数据的处理等。对于实验结果的表述,一般有三种方法:文字叙述(根据实验目的将实验结果系统化、条理化,用准确的专业术语客观地描述实验现象和结果,要有时间顺序以及各项指标在时间上的关系),图表(用表格或坐标图的方式使实验结果突出、清晰,便于相互比较,尤其适合于分组较多,且各组观察指标
一致的实验,使组间异同一目了然;每一图表应有表目和计量单位,应说明一定的中心问题),屏幕截图(实验结果也可以是屏幕截图,充分表明实验的实际情况)。在实验报告中,可任选其中一种或几种方法并用,以获得最佳效果。)
题目一、
界面与结果截图:
题目2、
服务器端截屏:
客户端截屏:
四、讨论与分析
(这是实验报告的主要部分。根据相关的知识点以及编程规范和经验对所得到的实验结果进行解释和分析。如果所得到的实验结果和预期的结果一致,那么它可以验证什么知识点,可以验证语言的什么使用方法?实验结果有什么意义?说明了什么问题?这些是实验报告应该讨论的;如果所得到的实验结果和预期的结果不相符,那么误差在什么地方,是什么原因造成的,准备怎么改进;如果实验根本就进行不下去,那么原因在什么地方。不要简单地复述课本上的理论而缺乏自己主动思考的内容。)
1、了解了URL类的应用和方法,比如通过openStream()方法打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream,将读入的内容显示到文本域,保存按钮实现的功能和记事本的另存功能一样,这里就不再叙述。
2、在写实现端到端的聊天的过程中遇到很多问题:
刚开始把所有的代码都写到发送按钮里,造成很多错误,而在经过老师的分析过后,才清楚了serversocket和socket的通信是怎样建立起来的,如下图,是服务器端和客户端建立通信的过程:
后来重写的时候就把循环读的代码写在界面的一个构造函数里面,结果造成,界面不能显示,后来经过仔细分析代码之后,了解了APPLICATION自身生成的方法之后,才知道程序停留在循环读取那里,之后的代码都不能执行。应该把读取操作写在界面显示之后。
3、在服务器和客户的定义那里frame.ss = new ServerSocket(6240)和frame.s = new Socket("127.0.0.1", 6240)其中port部分应该是两个一致,来建立连接。但是如果在我的代码里面把其中的6240改成6000就不能进行通信。所以就很疑问,不是两个定义的端口号一样就可以进行通信的吗?为什么有些值就不行?
五、附录:关键代码
(给出适当注释,可读性高)
客户端:
在Frame类中定义变量:
Socket s;
OutputStream os;
InputStream is;
1、将以下代码写在界面可见后面,即进行循环的读操作。
try {
frame.s = new Socket("127.0.0.1", 6240);
frame.os = frame.s.getOutputStream();
frame.is = frame.s.getInputStream();
while (true) {
byte[] buf = new byte[100];
int len = 0;
try {
len = frame.is.read(buf);
frame.txt2.append("Server say:" + new String(buf, 0, len) + "\n");
}
catch (IOException ex1) {
}
}
}
catch (Exception ex) {
}
2、发送按钮实现以下代码
public void send_actionPerformed(ActionEvent e) {
try {
os.write(txt1.getText().getBytes());
txt2.append("I say:" + txt1.getText() + "\n");
}
catch (Exception ex) {
}
txt1.setText("");
}
即进行写操作。将文本框的内容写出去。
服务器端:
在Frame类中定义变量:
ServerSocket ss;
Socket s;
OutputStream os;
InputStream is;
1、将以下代码写在界面可见后面,即进行循环的读操作。
try {
frame.ss = new ServerSocket(6240);
frame.s = frame.ss.accept();
frame.txt2.append("已和客户端建立连接可以通信\n");
frame.os = frame.s.getOutputStream();
frame.is = frame.s.getInputStream();
while (true) {
byte[] buf = new byte[100];
int len = 0;
len = frame.is.read(buf);
frame.txt2.append("Client say:" + new String(buf, 0, len) + "\n"); }
2、发送按钮实现以下代码
public void send_actionPerformed(ActionEvent e) {
try {