网路编程实验报告.docx
- 文档编号:9539165
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:20
- 大小:52.62KB
网路编程实验报告.docx
《网路编程实验报告.docx》由会员分享,可在线阅读,更多相关《网路编程实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
网路编程实验报告
院系:
计算机科学学院
专业:
网络工程产业班
年级:
2013级
课程名称:
网络编程
学号:
201321093021
姓名:
彭艳
指导教师:
朱剑林
2015年12月18日
实验名称
实验一:
Client/Server模式下的网络编程
实
验
目
的
及
要
求
实验目的:
学习并且实践Client/Server模式下网络如何进行通信
实验要求:
编写一个基于Client/Server模式下的程序,能够实现服务器端和客户端的通信。
实
验
原
理
(
操
作
步
骤
)
基于client/server模型通讯的基本原理,在服务器端来监听服务的请求,当客户端向该地址提出连接请求时,服务器端会对他的请求做出相应的反应。
程序源代码:
服务器端:
packagecs;
importjava.awt.BorderLayout;
importjava.awt.Container;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
import.ServerSocket;
import.Socket;
importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
publicclassServerextendsJFrame{
privateObjectInputStreammInput;//输入流
privateObjectOutputStreammOutput;//输出流
privateJTextFieldmEnter;//输入区域
privateJTextAreamDisplay;//输出区域
privateintmClientNumber=0;//连接的客户端数
//在图形界面中添加组件
publicServer(){
super("美国情报局");
Containerc=getContentPane();
mEnter=newJTextField();
mEnter.setEnabled(false);
mEnter.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
//向客户端发送数据
try{
Strings=event.getActionCommand();
mOutput.writeObject(s);
mOutput.flush();
mbDisplayAppend("服务器端:
"+s);
mEnter.setText("");//清除输入区域的原有内容
}catch(Exceptione){
e.printStackTrace();
}
}
});
(写不完时,可另加附页。
)
实
验
原
理
(
操
作
步
骤
)
c.add(mEnter,BorderLayout.NORTH);
mDisplay=newJTextArea();
c.add(newJScrollPane(mDisplay),BorderLayout.CENTER);
}
protectedvoidmbDisplayAppend(Strings){
mDisplay.append(s+"\n");
mDisplay.setCaretPosition(mDisplay.getText().length());
mEnter.requestFocusInWindow();//转移输入焦点到输入区域
}
publicbooleanmbIsEndSession(Stringm){
if(m.equalsIgnoreCase("q"))
return(true);
if(m.equalsIgnoreCase("quit"))
return(true);
if(m.equalsIgnoreCase("exit"))
return(true);
if(m.equalsIgnoreCase("end"))
return(true);
if(m.equalsIgnoreCase("结束"))
return(true);
return(false);
}
publicvoidmbRun(){
try{
ServerSocketserver=newServerSocket(5001);
Stringm;//来自客户端的消息
while(true){
mClientNumber++;
mbDisplayAppend("等待连接["+mClientNumber+"]");
Sockets=server.accept();
mbDisplayAppend("接收到客户端连接["+mClientNumber+"]");
mOutput=newObjectOutputStream(s.getOutputStream());
mInput=newObjectInputStream(s.getInputStream());
mOutput.writeObject("连接成功");
mOutput.flush();
mEnter.setEnabled(true);
//若没有退出命令则接字符串;
do{
//客户端发来的信息字符串形式
m=(String)mInput.readObject();
mbDisplayAppend("服务器端:
"+m);
}while(!
mbIsEndSession(m));//do-while循环结束
mOutput.writeObject("q");//通知客户端退出程序
mOutput.flush();
mEnter.setEnabled(false);
mOutput.close();
mInput.close();
s.close();
mbDisplayAppend("连接["+mClientNumber+"]结束");
}
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
Serverapp=newServer();
//配置
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(350,150);
app.setVisible(true);
app.mbRun();
}
}
客户端:
packagecs;
importjava.awt.BorderLayout;
importjava.awt.Container;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.io.ObjectInputStream;
importjava.io.ObjectOutputStream;
import.Socket;
importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
importjavax.swing.JTextField;
publicclassClientextendsJFrame{
//客户端部分
privateObjectInputStreammInput;
privateObjectOutputStreammOutput;
privateJTextFieldmEnter;
privateJTextAreamDisplay;
publicClient(){
super("中共党中央");
Containerc=getContentPane();
mEnter=newJTextField();
mEnter.setEnabled(false);
mEnter.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEventevent){
//向服务端发送数据
try{
Strings=event.getActionCommand();
mOutput.writeObject(s);
mOutput.flush();
mbDisplayAppend("客户端:
"+s);
mEnter.setText("");//清除输入区域的原有内容
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
});
c.add(mEnter,BorderLayout.NORTH);
mDisplay=newJTextArea();
c.add(newJScrollPane(mDisplay),BorderLayout.CENTER);
}
protectedvoidmbDisplayAppend(Strings){
mDisplay.append(s+"\n");
mDisplay.setCaretPosition(mDisplay.getText().length());
mEnter.requestFocusInWindow();//将转移焦点到输入区域
}
publicbooleanmbIsEndSession(Stringm){
if(m.equalsIgnoreCase("q"))
return(true);
if(m.equalsIgnoreCase("quit"))
return(true);
if(m.equalsIgnoreCase("exit"))
return(true);
if(m.equalsIgnoreCase("end"))
return(true);
if(m.equalsIgnoreCase("结束"))
return(true);
return(false);
}
publicvoidmbRun(Stringhost,intport){
try{
mbDisplayAppend("尝试连接");
Sockets=newSocket(host,port);
Stringm;//来自服务器端的消息
mOutput=newObjectOutputStream(s.getOutputStream());
mInput=newObjectInputStream(s.getInputStream());
mEnter.setEnabled(true);
do{
m=(String)mInput.readObject();
mbDisplayAppend("服务器端:
"+m);
}while(!
mbIsEndSession(m));
mOutput.writeObject("q");
mOutput.flush();
mOutput.close();
mInput.close();
s.close();
System.exit(0);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
Clientapp=newClient();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(350,150);
app.setVisible(true);
if(args.length==0)
app.mbRun("localhost",5001);
else
app.mbRun(args[0],5001);
}
}
实
验
结
果
分
析
及
心
得
体
会
通过简单的服务器端和客户端的实验程序,切身体会到了两端的通信过程。
掌握了C/S模式下通信的基本原理。
成
绩
评
定
教师签名:
年月日
实验名称
实验二:
多线程的网络通信编程
实
验
目
的
及
要
求
实验目的:
学习并实践使用多线程库Pthread进一步优化网络通信的编程模式。
实验要求:
使用多线程,能够让多个客户端与服务器进行连接,使得建立连接的两个socket在一个单独的线程上对话。
实
验
原
理
(
操
作
步
骤
)
服务端线程:
package多多;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
import.Socket;
publicclassServerthreadextendsThread{
//和本进程相关的socket
Socketsocket=null;
publicServerthread(Socketsocket){
this.socket=socket;
}
//线程执行的操作,响应客户端的请求
publicvoidrun(){
InputStreamis=null;
InputStreamReaderisr=null;
BufferedReaderbr=null;
OutputStreamos=null;
PrintWriterpw=null;
try{
//读取
//连接建立后,通过输入流来读取客户端发送的请求信息
is=socket.getInputStream();
isr=newInputStreamReader(is);
br=newBufferedReader(isr);
Stringinfo=null;
while((info=br.readLine())!
=null)
System.out.println("客户端:
"+info);
socket.shutdownInput();
//写入
(写不完时,可另加附页。
)
实
验
原
理
(
操
作
步
骤
)
os=socket.getOutputStream();
pw=newPrintWriter(os);
Stringstr="我是服务器端艳艳";
//Scannerreader=newScanner("System.in");
//Stringstr=reader.nextLine();
//System.out.println("请输出发送给客户端的消息:
");
pw.write(str);
pw.flush();
socket.shutdownOutput();
}catch(IOExceptione){
e.printStackTrace();
}finally{
//关闭资源
try{
if(is!
=null)
is.close();
if(isr!
=null)
isr.close();
if(br!
=null)
br.close();
if(os!
=null)
os.close();
if(pw!
=null)
pw.close();
}catch(Exceptione){
//TODO:
handleexception
e.printStackTrace();
}
}
}
}
TCP服务端:
package多多;
importjava.io.IOException;
import.ServerSocket;
import.Socket;
publicclassTcpserver{
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketserverSocket=newServerSocket(8888);
Socketsocket=null;
intcount=0;
System.out.print("...服务器端已开启服务...\n");
//循环监听等待客户端的连接
while(true){
socket=serverSocket.accept();
ServerthreadserverThread=newServerthread(socket);
//启动线程
serverThread.start();
count++;
System.out.println("客户端的数量:
"+count);
}
//serverSocket.close();//不可达
}
}
TCP客户端:
package多多;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
import.Socket;
import.UnknownHostException;
importjava.util.Scanner;
publicclassTcpclient{
//@SuppressWarnings("resource")
publicstaticvoidmain(String[]args)throwsUnknownHostException,IOException{
Socketsocket=newSocket("127.0.0.1",8888);
System.out.println("*客户端已就绪*");
//写入
OutputStreamos=socket.getOutputStream();
PrintWriterpw=newPrintWriter(os);
Stringstr="我是客户端科比-布莱恩特";
//Scannerreader=newScanner("System.in");
//Stringstr=reader.nextLine();
//System.out.println("请输出发送给服务器端的消息:
");
pw.write(str);
pw.flush();
socket.shutdownOutput();
//读取
InputStreamis=socket.getInputStream();
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
Stringinfo=null;
while((info=br.readLine())!
=null)
System.out.println("服务器端说:
"+info);
socket.shutdownInput();
//关闭资源
is.close();
isr.close();
br.close();
os.close();
pw.close();
socket.close();
}
}
实
验
结
果
分
析
及
心
得
体
会
当server每接收到一个client连接请求时,都把处理流程放到一个独立的线程里去运行,然后等待下一个client连接请求时,这样就不会阻塞server端接收请求了。
每个独立运行的程序在使用完socket对象之后要将其关闭。
成
绩
评
定
教师签名:
年月日
实验名称
实验三:
网络爬虫的应用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网路 编程 实验 报告