实验三网络本协议编程实验指导书1.docx

上传人:b****5 文档编号:14492371 上传时间:2023-06-23 格式:DOCX 页数:16 大小:119.30KB
下载 相关 举报
实验三网络本协议编程实验指导书1.docx_第1页
第1页 / 共16页
实验三网络本协议编程实验指导书1.docx_第2页
第2页 / 共16页
实验三网络本协议编程实验指导书1.docx_第3页
第3页 / 共16页
实验三网络本协议编程实验指导书1.docx_第4页
第4页 / 共16页
实验三网络本协议编程实验指导书1.docx_第5页
第5页 / 共16页
实验三网络本协议编程实验指导书1.docx_第6页
第6页 / 共16页
实验三网络本协议编程实验指导书1.docx_第7页
第7页 / 共16页
实验三网络本协议编程实验指导书1.docx_第8页
第8页 / 共16页
实验三网络本协议编程实验指导书1.docx_第9页
第9页 / 共16页
实验三网络本协议编程实验指导书1.docx_第10页
第10页 / 共16页
实验三网络本协议编程实验指导书1.docx_第11页
第11页 / 共16页
实验三网络本协议编程实验指导书1.docx_第12页
第12页 / 共16页
实验三网络本协议编程实验指导书1.docx_第13页
第13页 / 共16页
实验三网络本协议编程实验指导书1.docx_第14页
第14页 / 共16页
实验三网络本协议编程实验指导书1.docx_第15页
第15页 / 共16页
实验三网络本协议编程实验指导书1.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验三网络本协议编程实验指导书1.docx

《实验三网络本协议编程实验指导书1.docx》由会员分享,可在线阅读,更多相关《实验三网络本协议编程实验指导书1.docx(16页珍藏版)》请在冰点文库上搜索。

实验三网络本协议编程实验指导书1.docx

实验三网络本协议编程实验指导书1

实验三、传输层协议的简单应用

学习目标:

掌握套接字编程方法。

任务1:

编写程序实现单客户聊天室

步骤1.阅读下面的关于TCP编程的Java知识

TCP通信使用Scoket套接字实现。

套接字代表计算机之间网络连接的对象,它提供了很多方法实现计算机之间的网络通信。

下面介绍使用Scoket套接字实现网络通信的步骤。

⑴创建服务器端套接字

服务器端套接字是ServerSocket类的实例对象,用于实现服务器程序,ServerSocket类监视指定的端口,并建立客户端到服务器端套接字的连接,也就是负责客户端的呼叫任务。

ServerSocket类有很多常用构造方法,下面只介绍一种。

注意,服务器端所有的构造方法均需要处理IOExceptipon异常。

例如:

try{

ServerSocketss=newServerSocket(1880);

//监听端口号为1880的端口,ss为服务器端套接字的对象

}catch(IOExceptione)

{//在此编写脚本处理输入输出异常

}

⑵创建客户端套接字

客户端端套接字是Socket类的实例对象,用于实现客户端程序。

Socket类常用构造方法很多,下面只介绍一种。

同样,客户端所有的构造方法均需要处理IOExceptipon异常。

try{

Socketmysocket=newSocket("http:

//192.168.0.78",1880);

//建立于IP地址为192.168.0.78,端口号为1880的服务器的连接

}catch(IOExceptione)

{//在此编写脚本处理输入输出异常

}

当客户端套接字连接建立后,一条服务器与客户端的通信线路就建立起来了。

⑶服务器端接受客户端请求

在服务器端利用其accept()方法接收客户端的套接字连接请求。

例如,上面创建的服务器端套接字ss接受客户端请求,代码如下:

try{

mysocket=ss.accept();//ss为上面创建的服务器套接字对象,accept()接收

}catch(IOExceptione)

{//在此编写脚本处理输入输出异常

}

⑷客户端发送和接收服务器

Socket类提供了getInputStream()方法和getOutStream()方法来接收和发送数据。

这两个方法分别返回InputStream和OutputSteam类对象。

为了便于读/写数据,可以在返回的输入/输出流对象上建立过滤流,如DataInputStream、DataOutputStream或PrintStream类对象,对于文本方式流对象,可以采用InputStreamReader和OutputStreamWriter、PrintWirter等处理。

步骤2:

配置Java程序运行环境变量

在桌面“我的电脑”图标上单击右键,选择“属性”菜单,将出现系统特性设置窗口,如图1所示。

图1系统特性设置窗口

在“高级”选项卡中单击“环境变量”按钮。

将出现“环境变量”设置窗口,如图2所示。

图2“环境变量”设置窗口

在“系统变量”列表框中选择“Path”,然后单击“编辑”按钮,在出现的“编辑系统变量”对话框中,在“变量值”栏的命令最前面添加“C:

\ProgramFiles\Java\jdk1.6.0_18\bin;”命令,如图3所示。

图3“编辑系统变量”Path对话框

用同样方法设置环境变量“classpath”,其值为“.;C:

\ProgramFiles\Java\jdk1.6.0_18\jre\lib\rt.jar;”命令,由于一般系统安装时没有classpath这个环境变量,所以要新建该环境变量,如图4所示。

图4“新建系统变量”Classpath对话框

设置完成后,单击“开始”/“所有程序”/“附件”/“命令提示符”打开DOS窗口,在命令提示符下输入“java”或“javac”,回车后,如果出现其用法参数提示信息,则表明安装配置成功,如图5所示。

图5MS-DOS中javac命令执行结果

测试自己的实验环境,如果输出结果不正确,则配置Java环境变量,且将配置过程写入实验报告。

步骤3.编写、编译和运行程序

将程序代码、编译和运行命令写入实验报告,且写出屏幕显示信息的执行过程。

步骤4.试着修改端口号。

试着修改程序中客户与服务器连接的端口号,重新编译和运行程序,观察程序运行结果,分析端口号的作用,写入实验报告。

步骤5.试着修改端口号。

两个同学一组,一个为服务端,一个为客户端,试着修改程序中客户与服务器的连接,重新编译和运行程序,观察程序运行结果,分析端口号的作用,写入实验报告。

客户:

importjava.io.*;

import.*;

publicclassXT2010414110{//客户类

publicstaticvoidmain(Stringargs[]){

try{

Socketzhaoguofang=newSocket("192.168.71.79",4700);

//向本机的4700端口发出客户请求

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));

//由系统标准输入设备构造BufferedReader对象

PrintWriteros=newPrintWriter(zhaoguofang.getOutputStream());

//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReaderis=newBufferedReader(newInputStreamReader(zhaoguofang.getInputStream()));

//由Socket对象得到输入流,并构造相应的BufferedReader对象

Stringreadline;

readline=sin.readLine();//从系统标准输入读入一字符串

while(!

readline.equals("bye")){

//若从标准输入读入的字符串为"bye"则停止循环

os.println(readline);

//将从系统标准输入读入的字符串输出到Server

os.flush();

//刷新输出流,使Server马上收到该字符串

System.out.println("赵国防:

"+readline);

//在系统标准输出上打印读入的字符串

System.out.println("闫浩:

"+is.readLine());

//从Server读入一字符串,并打印到标准输出上

readline=sin.readLine();//从系统标准输入读入一字符串

}//继续循环

os.close();//关闭Socket输出流

is.close();//关闭Socket输入流

zhaoguofang.close();//关闭Socket

}catch(Exceptione){

System.out.println("Error"+e);//出错,则打印出错信息

}

}

}

服务:

importjava.io.*;

import.*;

publicclassXT2010414113{//服务类

publicstaticvoidmain(Stringargs[]){

try{

ServerSocketserver=null;

try{

server=newServerSocket(4700);

//创建一个ServerSocket在端口4700监听客户请求

}catch(Exceptione){

System.out.println("cannotlistento:

"+e);

//出错,打印出错信息

}

Socketyanhao=null;

try{

yanhao=server.accept();

//使用accept()阻塞等待客户请求,有客户

//请求到来则产生一个Socket对象,并继续执行

}catch(Exceptione){

System.out.println("Error."+e);

//出错,打印出错信息

}

Stringline;

BufferedReaderis=newBufferedReader(newInputStreamReader(yanhao.getInputStream()));

//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriteros=newPrintWriter(yanhao.getOutputStream());

//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));

//由系统标准输入设备构造BufferedReader对象

System.out.println("赵国防:

"+is.readLine());

//在标准输出上打印从客户端读入的字符串

line=sin.readLine();

//从标准输入读入一字符串

while(!

line.equals("bye")){

//如果该字符串为"bye",则停止循环

os.println(line);

//向客户端输出该字符串

os.flush();

//刷新输出流,使Client马上收到该字符串

System.out.println("闫浩:

"+line);

//在系统标准输出上打印读入的字符串

System.out.println("赵国防:

"+is.readLine());

//从Client读入一字符串,并打印到标准输出上

line=sin.readLine();

//从系统标准输入读入一字符串

}//继续循环

os.close();//关闭Socket输出流

is.close();//关闭Socket输入流

yanhao.close();//关闭Socket

server.close();//关闭ServerSocket

}catch(Exceptione){

System.out.println("Error:

"+e);

//出错,打印出错信息

}

}

}

任务2:

扩展任务,修改程序实现多客户聊天室

提示:

使用Java语言多线程技术。

参考资料:

(鉴于有的学生没有学过Java编程,所以老师给出例子代码,供学生参考)

例1:

一个简单的聊天室

客户端程序:

importjava.io.*;

import.*;

publicclassXT2010414110{//学生类

publicstaticvoidmain(Stringargs[]){

try{

Socketzhaoguofang=newSocket("192.168.71.79",4700);

//向本机的4700端口发出客户请求

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));

//由系统标准输入设备构造BufferedReader对象

PrintWriteros=newPrintWriter(zhaoguofang.getOutputStream());

//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReaderis=newBufferedReader(newInputStreamReader(zhaoguofang.getInputStream()));

//由Socket对象得到输入流,并构造相应的BufferedReader对象

Stringreadline;

readline=sin.readLine();//从系统标准输入读入一字符串

while(!

readline.equals("bye")){

//若从标准输入读入的字符串为"bye"则停止循环

os.println(readline);

//将从系统标准输入读入的字符串输出到Server

os.flush();

//刷新输出流,使Server马上收到该字符串

System.out.println("赵国防:

"+readline);

//在系统标准输出上打印读入的字符串

System.out.println("闫浩:

"+is.readLine());

//从Server读入一字符串,并打印到标准输出上

readline=sin.readLine();//从系统标准输入读入一字符串

}//继续循环

os.close();//关闭Socket输出流

is.close();//关闭Socket输入流

zhaoguofang.close();//关闭Socket

}catch(Exceptione){

System.out.println("Error"+e);//出错,则打印出错信息

}

}

}

服务器端程序:

importjava.io.*;

import.*;

publicclass2010414113{//服务类

publicstaticvoidmain(Stringargs[]){

try{

ServerSocketserver=null;

try{

server=newServerSocket(4700);

//创建一个ServerSocket在端口4700监听客户请求

}catch(Exceptione){

System.out.println("cannotlistento:

"+e);

//出错,打印出错信息

}

Socketyanhao=null;

try{

yanhao=server.accept();

//使用accept()阻塞等待客户请求,有客户

//请求到来则产生一个Socket对象,并继续执行

}catch(Exceptione){

System.out.println("Error."+e);

//出错,打印出错信息

}

Stringline;

BufferedReaderis=newBufferedReader(newInputStreamReader(yanhao.getInputStream()));

//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriteros=newPrintWriter(yanhao.getOutputStream());

//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));

//由系统标准输入设备构造BufferedReader对象

System.out.println("赵国防:

"+is.readLine());

//在标准输出上打印从客户端读入的字符串

line=sin.readLine();

//从标准输入读入一字符串

while(!

line.equals("bye")){

//如果该字符串为"bye",则停止循环

os.println(line);

//向客户端输出该字符串

os.flush();

//刷新输出流,使Client马上收到该字符串

System.out.println("闫浩:

"+line);

//在系统标准输出上打印读入的字符串

System.out.println("赵国防:

"+is.readLine());

//从Client读入一字符串,并打印到标准输出上

line=sin.readLine();

//从系统标准输入读入一字符串

}//继续循环

os.close();//关闭Socket输出流

is.close();//关闭Socket输入流

yanhao.close();//关闭Socket

server.close();//关闭ServerSocket

}catch(Exceptione){

System.out.println("Error:

"+e);

//出错,打印出错信息

}

}

}

例2:

多客户聊天室。

客户端端程序:

import.*;

importjava.io.*;

publicclassStudent1{

publicstaticvoidmain(String[]args)throwsException{

Socketserver=newSocket("localhost",4700);

//向本机的4700端口发出客户请求

BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));

//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriterout=newPrintWriter(server.getOutputStream());

//由Socket对象得到输出流,并构造PrintWriter对象

BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));

//由系统标准输入设备构造BufferedReader对象

while(true){

Stringstr=br.readLine();

//从系统标准输入读入一字符串

out.println(str);

//将从系统标准输入读入的字符串输出到Server

out.flush();

//刷新输出流,使Server马上收到该字符串

if(str.equals("bye")){

//若从标准输入读入的字符串为"bye"则停止循环

break;

}

System.out.println(in.readLine());

//从Server读入一字符串,并打印到标准输出上

}

server.close();

//关闭Socket

}

}

服务器端程序:

import.*;

importjava.io.*;

publicclassTeacherextendsThread{//多线程

privateSocketsocket;

publicTeacher(Socketsocket){

this.socket=socket;

}

publicvoidrun(){//线程主体

try{

BufferedReaderin=newBufferedReader(newInputStreamReader(socket.getInputStream()));

//由Socket对象得到输入流,并构造相应的BufferedReader对象

PrintWriterout=newPrintWriter(socket.getOutputStream());

//由Socket对象得到输出流,并构造PrintWriter对象

while(true){

Stringstr=in.readLine();

System.out.println("学生说:

"+str);

//在标准输出上打印从客户端读入的字符串

out.println("学生:

"+str);

//向客户端输出该字符串

out.flush();

//刷新输出流,使Client马上收到该字符串

if(str.equals("bye"))

break;

}

}

catch(IOExceptione){

System.out.println(e.getMessage());

//出错,打印出错信息

}

}

publicstaticvoidmain(String[]args)throwsIOException{

ServerSocketserver=newServerSocket(4700);

//创建一个ServerSocket在端口4700监听客户请求

while(true){

Sockets=server.accept();

//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行

newTeacher(s).start();

}

}

}

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2