网络实验第四组实验报告.docx

上传人:b****2 文档编号:24561674 上传时间:2023-05-28 格式:DOCX 页数:24 大小:650.23KB
下载 相关 举报
网络实验第四组实验报告.docx_第1页
第1页 / 共24页
网络实验第四组实验报告.docx_第2页
第2页 / 共24页
网络实验第四组实验报告.docx_第3页
第3页 / 共24页
网络实验第四组实验报告.docx_第4页
第4页 / 共24页
网络实验第四组实验报告.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

网络实验第四组实验报告.docx

《网络实验第四组实验报告.docx》由会员分享,可在线阅读,更多相关《网络实验第四组实验报告.docx(24页珍藏版)》请在冰豆网上搜索。

网络实验第四组实验报告.docx

网络实验第四组实验报告

云南大学数学与统计学实验教学中心实验报告

课程名称:

计算机网络实验

学期:

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;

ListClients=newArrayList();//建立一个pool,用来存放连接的Client

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1