沈阳工程学院学生实验报告课程名称:计算机网络实验题目:传输层协议的简单应用班级学号姓名地点指导教师实验日期:年月日1一、实验目的掌握套接字编程方法。二、实验环境F605机房CiscoPacketTracer软件。三、实验内容与要求任务1:编写程序实现单客户聊天室步骤1.阅读下面的关于TCP编程的Java知识TCP通信使用Scoket套接字实现。套接字代表计算机之间网络连接的对象,它提供了很多方法实现计算机之间的网络通信。下面介绍使用Scoket套接字实现网络通信的步骤。⑴创建服务器端套接字服务器端套接字是ServerSocket类的实例对象,用于实现服务器程序,ServerSocket类监视指定的端口,并建立客户端到服务器端套接字的连接,也就是负责客户端的呼叫任务。ServerSocket类有很多常用构造方法,下面只介绍一种。注意,服务器端所有的构造方法均需要处理IOExceptipon异常。例如:try{ServerSocketss=newServerSocket(1880);//监听端口号为1880的端口,ss为服务器端套接字的对象}catch(IOExceptione){//在此编写脚本处理输入输出异常2}⑵创建客户端套接字客户端端套接字是Socket类的实例对象,用于实现客户端程序。Socket类常用构造方法很多,下面只介绍一种。同样,客户端所有的构造方法均需要处理IOExceptipon异常。try{Socketmysocket=newSocket();//建立于IP地址为192.168.0.78,端口号为1880的服务器的连接}catch(IOExceptione){//在此编写脚本处理输入输出异常}当客户端套接字连接建立后,一条服务器与客户端的通信线路就建立起来了。⑶服务器端接受客户端请求在服务器端利用其accept()方法接收客户端的套接字连接请求。例如,上面创建的服务器端套接字ss接受客户端请求,代码如下:try{mysocket=ss.accept();//ss为上面创建的服务器套接字对象,accept()接收}catch(IOExceptione){//在此编写脚本处理输入输出异常3}⑷客户端发送和接收服务器Socket类提供了getInputStream()方法和getOutStream()方法来接收和发送数据。这两个方法分别返回InputStream和OutputSteam类对象。为了便于读/写数据,可以在返回的输入/输出流对象上建立过滤流,如DataInputStream、DataOutputStream或PrintStream类对象,对于文本方式流对象,可以采用InputStreamReader和OutputStreamWriter、PrintWirter等处理。步骤2:配置Java程序运行环境变量在桌面“我的电脑”图标上单击右键,选择“属性”菜单,将出现系统特性设置窗口,如图1所示。图1系统特性设置窗口在“高级”选项卡中单击“环境变量”按钮。将出现“环境变量”设置窗口,如图2所示。4图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所示。5图4“新建系统变量”Classpath对话框设置完成后,单击“开始”/“所有程序”/“附件”/“命令提示符”打开DOS窗口,在命令提示符下输入“java”或“javac”,回车后,如果出现其用法参数提示信息,则表明安装配置成功,如图5所示。图5MS-DOS中javac命令执行结果测试自己的实验环境,如果输出结果不正确,则配置Java环境变量,且将配置过程写入实验报告。步骤3.编写、编译和运行程序将程序代码、编译和运行命令写入实验报告,且写出屏幕显示信息的执行过程。步骤4.试着修改端口号。试着修改程序中客户与服务器连接的端口号,重新编译和运行6程序,观察程序运行结果,分析端口号的作用,写入实验报告。步骤5.试着修改端口号。两个同学一组,一个为服务端,一个为客户端,试着修改程序中客户与服务器的连接,重新编译和运行程序,观察程序运行结果,分析端口号的作用,写入实验报告。任务2:扩展任务,修改程序实现多客户聊天室提示:使用Java语言多线程技术。四、实验过程及结果分析1.编写程序实现单客户聊天室步骤1.阅读下面的关于TCP编程的Java知识步骤2:配置Java程序运行环境变量,按实验内容与要求的步骤完成。步骤3.编写、编译和运行程序(1)编写程序客户端程序:importjava.io.*;importjava.net.*;publicclassStudent{//学生类publicstaticvoidmain(Stringargs[]){try{Socketsocket=newSocket(172.2071.90,4700);//向本机的4700端口发出客户请求BufferedReadersin=newBufferedReader(newInputStreamReader(System.in));//由系统标准输入设备构造BufferedReader对象PrintWriteros=newPrintWriter(socket.getOutputStream());//由Socket对象得到输出流,并构造PrintWriter对象7BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象Stringreadline;readline=sin.readLine();//从系统标准输入读入一字符串while(!readline.equals(bye)){//若从标准输入读入的字符串为bye则停止循环os.println(readline);//将从系统标准输入读入的字符串输出到Serveros.flush();//刷新输出流,使Server马上收到该字符串System.out.println(学生:+readline);//在系统标准输出上打印读入的字符串System.out.println(老师:+is.readLine());//从Server读入一字符串,并打印到标准输出上readline=sin.readLine();//从系统标准输入读入一字符串}//继续循环os.close();//关闭Socket输出流is.close();//关闭Socket输入流socket.close();//关闭Socket}catch(Exceptione){System.out.println(Error+e);//出错,则打印出错信息}}}服务器端程序:importjava.io.*;importjava.net.*;publicclassTeacher{//老师类publicstaticvoidmain(Stringargs[]){try{ServerSocketserver=null;try{server=newServerSocket(4700);//创建一个ServerSocket在端口4700监听客户请求}catch(Exceptione){System.out.println(cannotlistento:+e);//出错,打印出错信息}Socketsocket=null;try{socket=server.accept();//使用accept()阻塞等待客户请求,有客户//请求到来则产生一个Socket对象,并继续执行}catch(Exceptione){8System.out.println(Error.+e);//出错,打印出错信息}Stringline;BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream()));//由Socket对象得到输入流,并构造相应的BufferedReader对象PrintWriteros=newPrintWriter(socket.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输入流socket.close();//关闭Socketserver.close();//关闭ServerSocket}catch(Exceptione){System.out.println(Error:+e);//出错,打印出错信息}}}(2)编译和运行程序9①编译运行Student程序结果如图6所示,图6程序Student.java编译运行②编译运行Teacher程序结果如图7所示,图7编译运行Teacher.java对话框步骤4.试着修改端口号10更改端口号为4701,运行如图8,图9所示图8学生聊天窗口图9教师聊天窗口步骤五:修改端口号。客户端ip为172.2071.90,端口号统一为4888,我方为服务器端,做客户端的同学学号为2012417104。两人一组实现对话测试后如图9所示。11图9编译运行Teacher.java对话框五、实验过程及结果分析在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择,将数据包顺利传送到目的主机。但是大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给哪一个进程,于是,端口机制便由此被引入进来。端口号的作用:具有网络功能的的应用软件的标志号,端口号是不固定的,是可以由用户手工分配。是由需要传送数据的双方规定好的,端口号统一,数据才会顺利的到达。IP和端口号就好比火车的车次和具体的座位,只告诉车次没有告诉座位就会产生混乱,加上具体的座位大家就会对号入座。也就是所需要传输的数据就会按照所约定的端口进行传输。12五、成绩评定优良中及格不及格出勤内容格式创新效果总评指导教师:年月日