计算机网络上机三

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

沈阳工程学院
学生实验报告
(课程名称:计算机网络原理)
实验题目:传输层协议的简单应用
班级网络本121 学号2012418129
姓名王翃
地点F606 指导教师费雅洁、杨盛、宋敏实验日期: 2014 年5月16日
一、实验目的
掌握套接字编程方法。

二、实验环境
Java环境
三、实验内容与要求
任务1:编写程序实现但客户聊天室。

步骤1.阅读下面的关于TCP编程的Java知识
TCP通信使用Scoket套接字实现。

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

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

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

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

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

例如:
try{
ServerSocket ss=new ServerSocket(1880);
//监听端口号为1880的端口,ss为服务器端套接字的对象
}catch(IOException e)
{//在此编写脚本处理输入输出异常
}
⑵创建客户端套接字
客户端端套接字是Socket类的实例对象,用于实现客户端程序。

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

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

try{
Socket mysocket=new Socket("http://192.168.0.78",1880);
//建立于IP地址为192.168.0.78,端口号为1880的服务器的连接
}catch(IOException e)
{//在此编写脚本处理输入输出异常
}
当客户端套接字连接建立后,一条服务器与客户端的通信线路就建立起来了。

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

例如,上面创建的服务器端套接字ss接受客户端请求,代码如下:
try{
mysocket =ss.accept();//ss为上面创建的服务器套接字对象,accept()接收
}catch(IOException e)
{//在此编写脚本处理输入输出异常
}
⑷客户端发送和接收服务器
Socket类提供了getInputStream ()方法和getOutStream()方法来接收和发送数据。

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

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

步骤2:配置Java程序运行环境变量
在桌面“我的电脑”图标上单击右键,选择“属性”菜单,将出现系统特性设置窗口,如图1所示。

图1 系统特性设置窗口
在“高级”选项卡中单击“环境变量”按钮。

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

图2 “环境变量”设置窗口
在“系统变量”列表框中选择“Path”,然后单击“编辑”按钮,在出现的“编辑系统变量”对话框中,在“变量值”栏的命令最前面添加“C:\Program Files\Java\jdk1.6.0_18\bin;”命令,如图3所示。

图3 “编辑系统变量”Path对话框
用同样方法设置环境变量“classpath”,其值为“.; C:\Program Files\Java\jdk1.6.0_18\jre\lib\rt.jar;”命令,由于一般系统安装时没有classpath这个环境变量,所以要新建该环境变量,如图4所示。

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

图5 MS-DOS中javac命令执行结果
测试自己的实验环境,如果输出结果不正确,则配置Java环境变量,且将配置过程写入实验报告。

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

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

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

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

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

客户端
import java.io.*;
import .*;
public class WLB12129{ //学生类(客户端)
public static void main(String args[]) {
try{
Socket socket=new Socket("192.168.66.79",4700);
//向本机的4700端口发出客户请求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader 对象
String readline;
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输入流
socket.close(); //关闭Socket
}catch(Exception e) {
System.out.println("Error"+e); //出错,则打印出错信息}
}
}
服务器端
import java.io.*;
import .*;
public class WLB12118{ //服务器端
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//创建一个ServerSocket在端口4700监听客户请求}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出错,打印出错信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客户请求,有客户
//请求到来则产生一个Socket对象,并继续执行
}catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader 对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader sin=new BufferedReader(new InputStreamReader(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(); //关闭Socket
server.close(); //关闭ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
}
}
运行结果如下:
服务器端
客户端
任务2:扩展任务,修改程序实现多客户聊天室
提示:使用Java语言多线程技术。

参考资料:(鉴于有的学生没有学过Java编程,所以老师给出例子代码,供学生参考)
例1:一个简单的聊天室
import java.io.*;
import .*;
public class WLB12129{ //学生类(客户端)
public static void main(String args[]) {
try{
Socket socket=new Socket("192.168.66.79",4700);
//向本机的4700端口发出客户请求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader 对象
String readline;
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输入流
socket.close(); //关闭Socket
}catch(Exception e) {
System.out.println("Error"+e); //出错,则打印出错信息
}
}
}
服务器端
import java.io.*;
import .*;
public class WLB12118{ //服务器端
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//创建一个ServerSocket在端口4700监听客户请求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出错,打印出错信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客户请求,有客户
//请求到来则产生一个Socket对象,并继续执行
}catch(Exception e) {
System.out.println("Error."+e);
//出错,打印出错信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader 对象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader sin=new BufferedReader(new InputStreamReader(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(); //关闭Socket
server.close(); //关闭ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出错,打印出错信息
}
}
}
运行结果如下:
服务器端
客户端
例2:多客户聊天室。

客户端端程序:
import .*;
import java.io.*;
public class Student1 {
public static void main(String[] args)throws Exception {
Socket server=new Socket("localhost",4700);
//向本机的4700端口发出客户请求
BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter out=new PrintWriter(server.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//由系统标准输入设备构造BufferedReader对象
while(true) {
String str=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 .*;
import java.io.*;
public class Teacher extends Thread{ //多线程
private Socket socket ;
public Teacher(Socket socket) {
this.socket = socket;
}
public void run() { //线程主体
try {
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket对象得到输入流,并构造相应的BufferedReader对象
PrintWriter out=new PrintWriter(socket.getOutputStream());
//由Socket对象得到输出流,并构造PrintWriter对象
while(true) {
String str=in.readLine();
System.out.println("学生说:"+str);
//在标准输出上打印从客户端读入的字符串
out.println("学生: "+str);
//向客户端输出该字符串
out.flush();
//刷新输出流,使Client马上收到该字符串
if(str.equals("bye"))
break;
}
}
catch(IOException e) {
System.out.println(e.getMessage());
//出错,打印出错信息
}
}
public static void main(String[] args) throws IOException{
ServerSocket server=new ServerSocket(4700);
//创建一个ServerSocket在端口4700监听客户请求
while(true) {
Socket s=server.accept();
//使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行
new Teacher(s).start();
}
}
}
运行结果:
服务器端
客户端
四、实验过程及结果分析
在Internet上,各主机间通过TCP/IP协议发送和接收数据包,各个数据包根据其目的主机的ip地址来进行互联网络中的路由选择,将数据包顺利传送到目的主机。

但是大多数操作系统都支持多程序(进程)同时运行,那么目的主机应该把接收到的数据包传送给哪一个进程,于是,端口机制便由此被引入进来。

五、成绩评定
优良中及格不及格出勤
内容
格式
创新
效果
总评
指导教师:
年月日。

相关文档
最新文档