网络实验第四组实验报告.docx
- 文档编号:11011668
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:24
- 大小:650.23KB
网络实验第四组实验报告.docx
《网络实验第四组实验报告.docx》由会员分享,可在线阅读,更多相关《网络实验第四组实验报告.docx(24页珍藏版)》请在冰点文库上搜索。
网络实验第四组实验报告
云南大学数学与统计学实验教学中心实验报告
课程名称:
计算机网络实验
学期:
2012-2013学年第一学期
成绩:
指导教师:
陆正福
学生姓名:
卢富毓
学生学号:
20101910072
实验名称:
Socket网络编程
实验要求:
必做
实验学时:
4学时
实验编号:
四
实验日期:
2012/9/15
完成日期:
2012/10/24
学院:
数学与统计学院
专业:
信息与计算科学
年级:
2010级
一、实验目的:
掌握Socket编程的要义,以及理解WEB。
二、实验内容:
1.JavaTCPSocket编程
简单的TCPSocket程序设计
上述简单程序的“信息处理”环节的增强性改造(加入数值、非数值计算)
服务器程序的“多线程”改造
2.JavaUDPSocket编程
简单的UDPSocket程序设计
上述简单程序的“信息处理”环节的增强性改造(加入数值、非数值计算)
服务器程序的“多线程”改造
3.建立简单Web服务器
三、实验环境
WindowsXP、win7jvm
四、实验过程(请学生认真填写):
1、实验预备知识
java面向对象的思想的了解。
Socket编程思想的理解(TCP、UDP),什么是port?
他怎么用?
分清TCP、UDP的端口。
Java中多线程的理解以及运用。
真确理解线程与进程的区别。
线程是怎样执行的。
Html语言的初步了解以及HTML的请求响应格式是怎样的。
理解好上面几步这个实验也就能轻松搞定了(当然上面的理解需要一定的时间)
2、实验过程
A、JavaTCPSocket编程
概要:
这个实验主要从增强信息处理和一个简陋的聊天程序来进行
步骤一:
TCP的编程当然是从最简单的客户端能与服务器连接为最简单的版本1.0开始。
在1.0连接好以后,看是给这个简单的C/S加入输入、输出功能,能做简单的信息处理(例如转换大小写等),此为2.0版本。
(这不是本题的重点,所以学生就简单的写了)
代码如下:
//TCPServer.java
importjava.io.*;
import.*;
/**
*TCPSocket编程之Server服务器
*@author卢富毓(fly)
*
*/
publicclassTCPServer{
publicstaticvoidmain(String[]args){
try{
ServerSocketss=newServerSocket(6789);
while(true){
Sockets=ss.accept();
System.out.println("ok");
BufferedReaderinfromclient=newBufferedReader(newInputStreamReader(s.getInputStream()));
DataOutputStreamouttoclient=newDataOutputStream(s.getOutputStream());
Stringstr=infromclient.readLine();
outtoclient.writeBytes(str.toUpperCase()+'\n');
}
}catch(IOExceptione){
e.printStackTrace();
}
}
}
//TCPClient.java
importjava.io.*;
import.*;
/**
*TCPSocket编程之Client客户端
*@author卢富毓(fly)
*
*/
publicclassTCPClient{
publicstaticvoidmain(String[]args){
try{
Sockets=newSocket("localhost",6789);
BufferedReaderinfromuser=newBufferedReader(newInputStreamReader(System.in));
DataOutputStreamouttoserver=newDataOutputStream(s.getOutputStream());
BufferedReaderinfromserver=newBufferedReader(newInputStreamReader(s.getInputStream()));
Stringstr=infromuser.readLine();
outtoserver.writeBytes(str+'\n');
str=infromserver.readLine();
System.out.println("fromserver:
"+str);
s.close();
}catch(UnknownHostExceptione){
e.printStackTrace();
}catch(IOExceptione){
}
}
}
eclipse运行结果如下:
//需要注意的是,先启动Server端在启用Client端。
步骤二:
已经实现了C/S的交互,但是还有缺点——只能一个客户端连上去,于是自然而然想到了多线程技术的运用。
可以实现多个客户端与一个服务器相连接。
多个客户端(不同hosts上)与服务器连接。
在多个连接的同时,又会想到,各线程之间是否能通信呢?
于是TCPSocket编程简单的C/S聊天程序就诞生.版本3.0。
代码如下:
//ThreadTCPServer
importjava.io.*;
import.*;
importjava.util.*;
/**
*多线程服务器,实现多个客户端的连接
*
*@author卢富毓(fly)
*/
publicclassThreadTCPServer{
ServerSocketss=null;
Sockets=null;
intnum=0;
List
publicstaticvoidmain(String[]args){
try{
newThreadTCPServer().start();
}catch(Exceptione){
System.out.println("error!
");
}
}
/**
*start方法是用来启动套接字的以及线程的执行
*/
publicvoidstart(){
try{
ss=newServerSocket(8999);
}catch(IOExceptione){
e.printStackTrace();
}
try{
while(true){
s=ss.accept();
num++;
Clientc=newClient(s,num);
newThread(c).start();//启动线程
Clients.add(c);
}
}catch(IOExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*内部类Client来实现。
线程的执行部分对接收到的来自Client端的消息的处理
*
*/
classClientimplementsRunnable{
Sockets=null;
intnum=0;
PrintWriterouttoClient=null;
BufferedReaderinfromClient=null;
booleanbConected=false;
Client(Sockets,intnum)throwsException{
this.s=s;
this.num=num;
outtoClient=newPrintWriter(s.getOutputStream());//向服务器写入
infromClient=newBufferedReader(newInputStreamReader(
s.getInputStream()));//从服务器得到信息
bConected=true;
}
/**
*send方法是用来专门进行消息的发送的
*
*@paramstr
*/
publicvoidsend(Stringstr,intnum){
outtoClient.println(num+":
"+str);
outtoClient.flush();
}
/**
*run方法的重写。
*/
publicvoidrun(){
System.out.println("Cleintconnected!
");
try{
while(bConected){
Stringstr=infromClient.readLine();
if(str.equals("exit")){
bConected=false;
}else{
for(inti=0;i Clientc=Clients.get(i); c.send(str,this.num); } } } }catch(IOExceptione){ e.printStackTrace(); }finally{ try{ s.close(); ss.close(); }catch(IOExceptione){ e.printStackTrace(); } } } } } //ThreadTCPClient importjava.io.*; import.*; /** *多线程的客服端的实现 * *@author卢富毓(fly) * */ publicclassThreadTCPClient{ Sockets=null; BufferedReaderinfromUser=null; PrintWriterouttoServer=null; BufferedReaderinfromServer=null; booleanb=true; ThreadRec=newThread(newReciver());//创建Rec线程。 实现接收来自客户端的消息 publicstaticvoidmain(String[]args)throwsException{ newThreadTCPClient().connect();//启动客户端与服务器的连接 } /** *connect()方法用来具体实现C/S的连接以及对消息的发送 * *@throwsIOException *@throwsException */ publicvoidconnect()throwsIOException,Exception{ s=newSocket("127.0.0.1",8999);//建立与服务器的连接 infromUser=newBufferedReader(newInputStreamReader(System.in)); //从键盘读入字符串 outtoServer=newPrintWriter(s.getOutputStream()); //向服务器写入 infromServer=newBufferedReader(newInputStreamReader( s.getInputStream())); //从服务器得到信息 Rec.start();//启动线程 Stringstr="hello"; while(b){ outtoServer.println(str); outtoServer.flush(); str=infromUser.readLine(); if(str.equals("exit")){ b=false; } } s.close(); } /** *内部类Reciver实现线程控制。 并负责消息的接收 * */ classReciverimplementsRunnable{ publicvoidrun(){ try{ while(b){ Stringstr=infromServer.readLine(); System.out.println("Client"+str); } }catch(SocketExceptione){ System.out.println("退出了,bye! "); }catch(IOExceptione){ e.printStackTrace(); } } } } 命令提示符运行简单聊天程序,结果如下: 客户端一 客户端二: 服务器: (两个客户端连接成功) //用到了多线程技术通过服务器来实现信息的转发(个人觉得服务器在理就是一个中介。 ) B、JavaUDPSocket编程 概要: 本实验,会通过增强信息处理和多线程来进行的,在信息处理中用到了正则表达式的内容 步骤: 本程序是增强信息与多线程合在一起处理的,所以只写了一个C/S程序 代码如下: //ThreadUDPServer importjava.io.*; import.*; /** *UDPSocket之Server端 *@author卢富毓 * */ publicclassThreadUDPServer{ /** *通过线程来控制多个UDPClient端的连接 */ DatagramSocketserversocket=null; publicstaticvoidmain(String[]args)throwsException{ newThreadUDPServer().start(); } publicvoidstart(){ //start来进行多个客户端的创建 try{ //新建一个线程 clientc=newclient(); //线程中的start方法开始线程的执行 newThread(c).start(); }catch(SocketExceptione){ e.printStackTrace(); } } classclientimplementsRunnable{ client()throwsSocketException{ //构造方法实现接口的创建 serversocket=newDatagramSocket(6789); } @Override publicvoidrun(){ try{ while(true){ byte[]senddata=newbyte[1024]; byte[]recvdata=newbyte[1024]; DatagramPacketrecvpacket=newDatagramPacket(recvdata, recvdata.length); serversocket.receive(recvpacket); Stringstr=newString(recvpacket.getData()); //连个正则表达式来进行信息的处理 if(str.matches("[abc].*")){ senddata="thisStringbegainwithaorborc".getBytes(); }elseif(str.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}.*")){ senddata=("thisisaIPAddress: "+str).getBytes(); }else{ senddata=str.toUpperCase().getBytes(); } //数据打包,进行发送。 DatagramPacketsendpacket=newDatagramPacket(senddata, senddata.length,recvpacket.getAddress(), recvpacket.getPort()); serversocket.send(sendpacket); senddata=null; recvdata=null; } }catch(IOExceptione){ e.printStackTrace(); }finally{ serversocket.close(); } } } } //ThreadUDPClient importjava.io.*; import.*; /** *UDPSocket之Client端 *@author卢富毓 * */ publicclassThreadUDPClient{ /** *@paramargs *@throwsIOException */ publicstaticvoidmain(String[]args)throwsIOException{ //创建一个client端的接口 DatagramSocketclientsocket=newDatagramSocket(); //用一个缓冲区来暂放用户输入的字符集 BufferedReaderinfromuser=newBufferedReader(newInputStreamReader( System.in)); Stringstr=infromuser.readLine(); while(! str.equals("bye")){ byte[]senddata=newbyte[1024]; byte[]recvdata=newbyte[1024]; senddata=str.getBytes(); //对数据进行打包,在这个数据包中放入Address等相应信息 DatagramPacketsendpacket=newDatagramPacket(senddata, senddata.length,newInetSocketAddress("127.0.01",6789)); clientsocket.send(sendpacket); //创建接受数据的packet DatagramPacketrecvpacket=newDatagramPacket(recvdata, recvdata.length); clientsocket.receive(recvpacket); str=newString(recvpacket.getData()); //接受数据进行打印 System.out.println("FromUDPServer: "+str); //又读入一行 str=infromuser.readLine(); senddata=null; recvdata=null; } infromuser.close(); clientsocket.close(); } } Eclipse运行结果如下: //三个客户端和一个服务器端 //客户端1是通过正则表达式来检测一串数字是不是IP地址 //客户端2是通过正则表达式来检测一字符串是不是以abc之一开头的 //客户端3是用来进行不满足上两个情形的时候,就像字符串转换为大写 C、建立简单Web服务器 概要: 本实验,会通过增强信息处理和多线程来进行的,在信息处理中用到了正则表达式的内容 步骤: 通过建立一个简单的WEB服务器来对http传送消息格式的理解。 实验内容很简单,关键是理解http协议消息请求与响应。 尤其是对html响应消息的理解对于本程序来说是重中之重。 因为,Client端由浏览器代替,所以不需要对消息请求的头格式了解多深。 代码如下: importjava.io.*; import.*; /** *一个非常简单的WebServer服务器。 *@author卢富毓(fly) * */ publicclassWe
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络 实验 第四 报告