网路编程实验报告Word格式文档下载.docx
《网路编程实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《网路编程实验报告Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
理
(
操
作
步
骤
)
基于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);
quit"
exit"
end"
结束"
return(false);
publicvoidmbRun(){
try{
ServerSocketserver=newServerSocket(5001);
Stringm;
//来自客户端的消息
while(true){
mClientNumber++;
mbDisplayAppend("
等待连接["
+mClientNumber+"
]"
Sockets=server.accept();
接收到客户端连接["
mOutput=newObjectOutputStream(s.getOutputStream());
mInput=newObjectInputStream(s.getInputStream());
mOutput.writeObject("
连接成功"
mOutput.flush();
mEnter.setEnabled(true);
//若没有退出命令则接字符串;
do{
//客户端发来的信息字符串形式
m=(String)mInput.readObject();
"
+m);
}while(!
mbIsEndSession(m));
//do-while循环结束
mOutput.writeObject("
//通知客户端退出程序
mEnter.setEnabled(false);
mOutput.close();
mInput.close();
s.close();
连接["
]结束"
}catch(Exceptione){
e.printStackTrace();
}
publicstaticvoidmain(String[]args){
Serverapp=newServer();
//配置
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(350,150);
app.setVisible(true);
app.mbRun();
}
客户端:
publicclassClientextendsJFrame{
//客户端部分
publicClient(){
中共党中央"
//向服务端发送数据
try{
客户端:
//TODOAuto-generatedcatchblock
//将转移焦点到输入区域
publicvoidmbRun(Stringhost,intport){
mbDisplayAppend("
尝试连接"
Sockets=newSocket(host,port);
//来自服务器端的消息
mOutput=newObjectOutputStream(s.getOutputStream());
mInput=newObjectInputStream(s.getInputStream());
mEnter.setEnabled(true);
do{
m=(String)mInput.readObject();
}while(!
mOutput.writeObject("
mOutput.flush();
mOutput.close();
mInput.close();
s.close();
System.exit(0);
}catch(Exceptione){
//TODOAuto-generatedcatchblock
Clientapp=newClient();
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;
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){
}finally{
//关闭资源
try{
if(is!
=null)
is.close();
if(isr!
isr.close();
if(br!
br.close();
if(os!
os.close();
if(pw!
pw.close();
}catch(Exceptione){
//TODO:
handleexception
e.printStackTrace();
TCP服务端:
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++;
客户端的数量:
+count);
//serverSocket.close();
//不可达
TCP客户端:
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);
我是客户端科比-布莱恩特"
请输出发送给服务器端的消息:
InputStreamis=socket.getInputStream();
InputStreamReaderisr=newInputStreamReader(is);
BufferedReaderbr=newBufferedReader(isr);
服务器端说:
//关闭资源
is.close();
isr.close();
br.close();
os.close();
pw.close();
socket.close();
当server每接收到一个client连接请求时,都把处理流程放到一个独立的线程里去运行,然后等待下一个client连接请求时,这样就不会阻塞server端接收请求了。
每个独立运行的程序在使用完socket对象之后要将其关闭。
实验三:
网络爬虫的应用