java实验五.docx
《java实验五.docx》由会员分享,可在线阅读,更多相关《java实验五.docx(16页珍藏版)》请在冰点文库上搜索。
![java实验五.docx](https://file1.bingdoc.com/fileroot1/2023-5/28/9fe4b4d3-1ace-40f7-ad24-e95882c62fb3/9fe4b4d3-1ace-40f7-ad24-e95882c62fb31.gif)
java实验五
《Java程序设计》实验报告
班级:
12计科
(2)班学号:
姓名:
一.题目
1.编写一个程序,实现访问一个网站并将指定的一个页面保存到本地
2.图形界面编程,利用socket和TCP编写,允许客户器指定一个文件名,并让服务器发回文件的内容,或者指出文件不存在。
3.图形界面编程,利用socket和UDP编写,客户端和服务器端程序可以进行多次对话
目的和要求
二.功能说明
1.实现将网站的全部内容通过以将io流包装,把网站上的内容以字符串形式复制到data.htm
2.利用socket和TCP,在客户端和服务端实现多次对话,并实现文件内容传送。
3.利用socket和UDP,在客户端和服务端实现多次对话。
三.设计流程图
首先实现聊天程序
用io流包装url资源,把网站上的内容以字符串形式复制到data.htm
用URL找到相应的页面资源
关闭窗口结束
在服务器端当有输入路径的时候,取得文件的内容,并传给客户端
关闭窗口结束
用循环不断捕获UDP数据包,并且监听“发送”按钮,实现数据包的发送
输入相应的端口号和对方ip地址
四.源程序
1.
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.FileOutputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
import.URL;
import.URLConnection;
publicclassGetUrl{
publicstaticvoidmain(String[]args)throwsException{
URLurl=newURL("");
URLConnectionuc=url.openConnection();
BufferedReaderin=newBufferedReader(newInputStreamReader(uc.getInputStream()));
FileOutputStreamf=newFileOutputStream("data.htm");
BufferedWriterbw=newBufferedWriter(newOutputStreamWriter(f));
StringlineString;
while((lineString=in.readLine())!
=null){
bw.write(lineString);
}
bw.close();
in.close();
System.out.println("保存成功!
");
}
}
2.
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.BufferedReader;
importjava.io.DataInputStream;
importjava.io.DataOutputStream;
importjava.io.FileInputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
import.ServerSocket;
import.Socket;
importjavax.swing.JFrame;
importjavax.swing.JTextArea;
importjavax.swing.JButton;
importjavax.swing.JScrollPane;
importjavax.swing.JTextField;
importjavax.swing.JLabel;
publicclassTCPChatimplementsRunnable,ActionListener{
privateJFramefrmUdp;
JTextAreatextArea;
JTextAreatextArea_1;
JButtonbutton;
JButtonbutton_1;
ServerSocketserverSocket;
Socketsocket;
Threadthread;
JButtonbutton_2;
inti=0;
privateJTextFieldtextField;
privateJLabellabel;
/**
*@wbp.parser.entryPoint
*/
publicTCPChat(){
frmUdp=newJFrame();
frmUdp.setTitle("TCP\u804A\u5929");
frmUdp.setResizable(false);
frmUdp.setBounds(100,100,450,300);
frmUdp.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmUdp.getContentPane().setLayout(null);
textArea_1=newJTextArea();
textArea_1.setBounds(10,228,279,23);
frmUdp.getContentPane().add(textArea_1);
button=newJButton("\u53D1\u9001");
button.setBounds(308,228,93,23);
button.addActionListener(this);
frmUdp.getContentPane().add(button);
button_1=newJButton("\u65B0\u5EFA\u670D\u52A1\u5668");
button_1.setBounds(308,33,116,23);
button_1.addActionListener(this);
frmUdp.getContentPane().add(button_1);
button_2=newJButton("\u8FDE\u63A5\u670D\u52A1\u5668");
button_2.setBounds(308,77,116,23);
button_2.addActionListener(this);
frmUdp.getContentPane().add(button_2);
JScrollPanescrollPane=newJScrollPane();
scrollPane.setBounds(10,10,279,199);
frmUdp.getContentPane().add(scrollPane);
textArea=newJTextArea();
scrollPane.setViewportView(textArea);
textField=newJTextField();
textField.setBounds(318,175,66,21);
frmUdp.getContentPane().add(textField);
textField.setColumns(10);
label=newJLabel("\u53D1\u9001\u6587\u4EF6\r\n\u7684\u8DEF\u5F84\u6846\uFF1A");
label.setBounds(308,142,126,23);
frmUdp.getContentPane().add(label);
frmUdp.setVisible(true);
}
/**
*@wbp.parser.entryPoint
*/
publicstaticvoidmain(String[]args){
newTCPChat();
}
publicvoidactionPerformed(ActionEvente){
try{
if(e.getSource()==button_1){
serverSocket=newServerSocket(8888);
textArea.append("服务器开始运行,连接成功!
\n");
socket=serverSocket.accept();
thread=newThread(this);
thread.start();
}
if(e.getSource()==button_2){
socket=newSocket("127.0.0.1",8888);
textArea.append("客户端开始运行!
\n");
textField.setEditable(false);
thread=newThread(this);
thread.start();
}else{
Stringstring;
DataOutputStreamout=newDataOutputStream(
socket.getOutputStream());
string=textArea_1.getText();
textArea_1.setText("");
if(textField.getText().equals("")){
textArea.append("----自己说----\n"+string+"\n");
out.writeUTF(string);
}else{
Stringstr;
FileInputStreamf=newFileInputStream(textField.getText());
BufferedReaderbw=newBufferedReader(
newInputStreamReader(f));
textArea.append("----自己说----\n");
while((str=bw.readLine())!
=null){
textArea.append(str);
out.writeUTF(str);
}
}
}
}catch(Exceptione1){
//TODO:
handleexception
textArea.append("服务器连接出错!
\n");
}
}
publicvoidrun(){
Stringstring;
while(true){
try{
DataInputStreamin=newDataInputStream(
socket.getInputStream());
string=in.readUTF();
textArea.append("----对方说----\n"+string+"\n");
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
textArea.append("读入错误!
\n");
}
}
}
}
3.
importjava.io.*;
import.*;
importjava.awt.event.*;
importjava.awt.*;
importjavax.swing.*;
publicclassUDPChatimplementsRunnable,ActionListener{
JTextAreashowArea;
JLabellbl1,lbl2,lbl3;
JTextFieldmsgText,sendPortText,receivePortText,IPAddressText;
JFramemainJframe;
JButtonsendBtn,startBtn;
JScrollPaneJSPane;
JPanelpane1,pane2;
Containercon;
Threadthread=null;
DatagramPacketsendPack,receivePack;
DatagramSocketsendSocket,receiveSocket;
privateInetAddresssendIP;
privateintsendPort,receivePort;//存储发送端口和接收端口
privatebyteinBuf[],outBuf[];
publicstaticfinalintBUFSIZE=256;
publicUDPChat(){
mainJframe=newJFrame("基于UDP聊天");
con=mainJframe.getContentPane();
showArea=newJTextArea();
showArea.setEditable(false);
showArea.setLineWrap(true);
lbl1=newJLabel("接收端口号:
");
lbl2=newJLabel("发送端口号:
");
lbl3=newJLabel("对方的地址:
");
sendPortText=newJTextField();
sendPortText.setColumns(5);
receivePortText=newJTextField();
receivePortText.setColumns(5);
IPAddressText=newJTextField();
IPAddressText.setColumns(8);
IPAddressText.setText("127.0.0.1");
startBtn=newJButton("开始");
startBtn.addActionListener(this);
pane1=newJPanel();
pane1.setLayout(newFlowLayout());
pane1.add(lbl1);
pane1.add(receivePortText);
pane1.add(lbl2);
pane1.add(sendPortText);
pane1.add(lbl3);
pane1.add(IPAddressText);
pane1.add(startBtn);
JSPane=newJScrollPane(showArea);
msgText=newJTextField();
msgText.setColumns(40);
msgText.setEditable(false);
msgText.addActionListener(this);
sendBtn=newJButton("发送");
sendBtn.setEnabled(false);
sendBtn.addActionListener(this);
pane2=newJPanel();
pane2.setLayout(newFlowLayout());
pane2.add(msgText);
pane2.add(sendBtn);
con.add(pane1,BorderLayout.NORTH);
con.add(JSPane,BorderLayout.CENTER);
con.add(pane2,BorderLayout.SOUTH);
mainJframe.setSize(600,400);
mainJframe.setVisible(true);
mainJframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
publicstaticvoidmain(String[]args){
newUDPChat();
}
publicvoidactionPerformed(ActionEvente){
try{
if(e.getSource()==startBtn){//按下了开始按钮
inBuf=newbyte[BUFSIZE];
sendPort=Integer.parseInt(sendPortText.getText());
sendIP=InetAddress.getByName(IPAddressText.getText());
sendSocket=newDatagramSocket();
receivePort=Integer.parseInt(receivePortText.getText());
//创建接收数据包
receivePack=newDatagramPacket(inBuf,BUFSIZE);
//指定接收数据的端口
receiveSocket=newDatagramSocket(receivePort);
//创建线程准备接收对方的消息
thread=newThread(this);
thread.start();
startBtn.setEnabled(false);
sendBtn.setEnabled(true);
msgText.setEditable(true);
}else{//按下了发送按钮或回车键
outBuf=msgText.getText().getBytes();
//组装要发送的数据包
sendPack=newDatagramPacket(outBuf,outBuf.length,sendIP,
sendPort);
//发送数据
sendSocket.send(sendPack);
showArea.append("----自己说----\n"+msgText.getText()+"\n");
msgText.setText(null);
}
}catch(UnknownHostExceptionel){
showArea.append("无法连接到指定地址\n");
}catch(SocketExceptionel){
showArea.append("无法打开指定端口\n");
}catch(IOExceptionel){
showArea.append("发送数据失败\n");
}
}
//在线程中接收数据
publicvoidrun(){
Stringmsgstr;
while(true){
try{//注意这个try的位置
receiveSocket.receive(receivePack);
msgstr=newString(receivePack.getData(),0,
receivePack.getLength());
showArea.append("----对方说----\n"+msgstr+"\n");
}catch(IOExceptionel){
showArea.append("接收数据出错\n");
}
}
}
}
五.数据结果
第一题:
第二题:
第三题:
六.实验心得与体会
熟练掌握了网络中的URL资源获取方式,网络编程中的UDP,TCP通讯方式,以及结合文件操作,实现文件内容的传送。