实验05 TCP Socket.docx

上传人:b****5 文档编号:3726333 上传时间:2022-11-24 格式:DOCX 页数:32 大小:170.03KB
下载 相关 举报
实验05 TCP Socket.docx_第1页
第1页 / 共32页
实验05 TCP Socket.docx_第2页
第2页 / 共32页
实验05 TCP Socket.docx_第3页
第3页 / 共32页
实验05 TCP Socket.docx_第4页
第4页 / 共32页
实验05 TCP Socket.docx_第5页
第5页 / 共32页
点击查看更多>>
下载资源
资源描述

实验05 TCP Socket.docx

《实验05 TCP Socket.docx》由会员分享,可在线阅读,更多相关《实验05 TCP Socket.docx(32页珍藏版)》请在冰豆网上搜索。

实验05 TCP Socket.docx

实验05TCPSocket

一.本实验目的及要求:

1.掌握TCP/IP体系结构中端口、套接字、TCP协议概念。

理解什么是SAP、端口的范围划分、套接字的组成等概念,掌握TCP传输模式和netstat命令的用途;

2.掌握TCPSOCKET的ServerSocket和Socket;学习为TCP服务的Socket和ServerSocket类的使用,掌握TCP连接的方法,服务器接收客户端连接请求的方法,创建输入/输出流的方法,传输数据的方法,以及关闭流和套接字,注意可能会出现的异常操作;

3.理解进程和线程的概念,掌握TCPSOCKET技术中多线程技术,理解JAVA中的动态数组的内容。

4.实验报告内容应包括,本实验的第三、四、五部分的答案,以及第六部分的程序后要求。

二、基础知识

1.TCP协议

TCP是一种面向连接的、可靠的、基于字节流的运输层(Transportlayer)通信协议。

在简化的计算机网络OSI模型中,它完成第四层传输层所指定的功能,UDP是同一层内另一个重要的传输协议。

TCP所提供服务的主要特点:

面向连接的传输;端到端的通信;高可靠性,确保传输数据的正确性,不出现丢失或乱序;全双工方式传输;采用字节流方式,即以字节为单位传输字节序列;紧急数据传送功能

TCP支持的服务:

文件传送FileTransfer;远程登录Remotelogin;计算机邮件Mail;网络文件系统(NFS);远程打印(Remoteprinting);远程执行(Remoteexecution);名字服务器(Nameservers);终端服务器(Terminalservers)。

2.端口

TCP/IP协议中提出了端口(port)的概念,用于标识网络主机上通信的软件进程。

端口实际上是一个抽象的软件结构(包括一些数据结构和I/O缓冲区)。

应用程序(即进程)通过系统调用与某端口建立关联(binding)后,传输层传给该端口的数据都被相应的应用进程所接收。

端口又是在网络体系结构中应用进程访问传输服务的入口点SAP(ServiceAccessPoint服务访问点)。

在TCP/IP体系中,用于存储端口号长度为16bit,取值范围0~65535,它用于存储本地软件进程,所以仅具有本地意义。

通常,端口分为:

熟知端口,取值范围0~1023,为常用应用进程指定的固定值;一般端口,取值范围1024~49151,供一般程序使用;动态端口:

49152~65535供某些默认服务使用,如表1所示。

表1常用进程和熟知端口

echo

7

验证2台计算机连接有效性

daytime

13

服务器当前时间文本描述

ftp

20/21

21用于命令,20用户数据

telnet

23

远程登录

smtp

25

邮件发送

whois

43

网络管理的目录服务

dns

53

域名解析

tftp

69

小文件传输

finger

79

主机用户信息

http

80

HTTP

pop3

110

邮局协议

nntp

119

网络新闻传输协议,发布Usenet新闻

snmp

161

网络管理协议

rip

520

路由协议

3.套接字

套接字Socket原意是“插座”,简单的说就是参与通信两方的一种约定,用套接字中的相关函数来完成通信过程。

为了区分不同应用程序进程间的网络通信和连接,主要使用3个参数:

通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号,通过将这3个参数结合起来,与一个Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

通常的表示方式为:

SOCKET=(传输协议,IP,Port)。

4.Netstat

NetStat是DOS命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息.Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。

可以通过执行Netstat/help获得该应用程序选项的相关帮助。

在Java语言中,实现TCP套接字中有两个基础类,分别为:

●Socket类:

建立一个客户端标识

●ServerSocket类:

建立一个服务器端标识

5.ServerSocket

该类实现服务器socket,一个服务器socket等待网络上的连接请求。

通常操作都是基于这个请求,并且会返回一个结果给请求连接者,其类描述如图2所示。

图2ServerSocket类描述

ServerSocket构造方法有:

ServerSocket()创建一个空的服务端socket;

ServerSocket(int port)在指定端口创建一个服务端socket,;

ServerSocket(int port,int backlog)在指定端口创建一个服务端socket和日志;

ServerSocket(int port,int backlog,InetAddress bindAddr)

 在指定端口和地址上创建一个服务端socket和日志。

6.Socket

该类实现一个客户端socket,这个socket表示在通信的两台设备之间的端点,其类描述如图3所示。

图3Socket类描述

Socket构造方法有:

Socket()创建一个空的客户端socket;

Socket(InetAddress address,int port)

创建一个连接指定远程地址和端口的客户端socket;

Socket(InetAddress address,int port,InetAddress localAddr,int localPort)

在本地指定地址和端口,创建一个连接指定远程地址和端口的客户端socket;

Socket(String host,int port)

创建一个连接指定主机名称和端口的客户端socket;

Socket(String host,int port,InetAddress localAddr,int localPort)

在本地指定地址和端口,创建一个连接指定远程主机名称和端口的客户端socket。

基本工作原理,如图4所示。

1.启动服务器端ServerSocket,监听指定端口;

2.启动客户端Socket,连接服务器端Socket;

3.服务器端Accept确认连接,建立通信通道;

4.建立输入和输出流,进行通信;

5.通信完毕,关闭Socket连接。

7.多线程(Thread)

每个正在系统上运行的程序都是一个进程。

每个进程包含一到多个线程。

进程也可能是整个程序或者是部分程序的动态执行。

线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。

也可以把它理解为代码运行的上下文。

所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。

Java里面有2个方法实现多线程,不论哪种方法都需要覆盖publicvoidrun()方法

  1继承Thread类,比如

  classMyThreadextendsThread{

  publicvoidrun(){

  //这里写上线程的内容

  }

  publicstaticvoidmain(String[]args){

  //使用这个方法启动一个线程

  newMyThread().start();

  }

  }

  2实现Runnable接口

  classMyThreadimplementsRunnable{

  publicvoidrun(){

  //这里写上线程的内容

  }

  publicstaticvoidmain(String[]args){

  //使用这个方法启动一个线程

  newThread(newMyThread()).start();

  }

  }

  一般鼓励使用第二种方法,因为Java里面只允许单一继承,但允许实现多个接口。

第二个方法更加灵活。

三.类及方法:

1.ServerSocket

常用方法

 Socket

accept()接受客户端的连接请求;

 void

bind(SocketAddress endpoint)绑定到指定的地址和端口;

 void

close()关闭该ServerSocket;

 InetAddress

getInetAddress()获得该ServerSocket的本地地址;

 int

getLocalPort()获得本地监听端口;

 int

getReceiveBufferSize()获得接收缓存尺寸;

 int

getSoTimeout()获得数据包超时时间;

 boolean

isClosed()判断ServerSocket是否关闭;

 void

setReceiveBufferSize(int size)设置接收缓存尺寸;

 void

setSoTimeout(int timeout)以毫秒设置数据包超时时间;

 String

toString()将地址和端口作为字符串返回。

2.Socket

常用方法

 void

bind(SocketAddress bindpoint)绑定socket在本地;

 void

close()关闭该socket;

 void

connect(SocketAddress endpoint)连接该socket到服务器上;

 void

connect(SocketAddress endpoint,int timeout)连接该socket到服务器并设置超时时间;

 InetAddress

getInetAddress()获得该socket连接的地址;

 InputStream

getInputStream()获得该socket的输入流;

 InetAddress

getLocalAddress()获得该socket的本地地址;

 int

getLocalPort()获得该socket的本地端口;

 OutputStream

getOutputStream()获得该socket的输出流;

 int

getPort()获得该socket的远端端口;

 int

getReceiveBufferSize()获得该Socket的接收缓存容量;

 int

getSendBufferSize()获得该Socket的发送缓存容量;

 int

getSoTimeout()获得超时时间;

 boolean

isClosed()判断该socket是否关闭;

 boolean

isConnected()判断该socket是否连接;

 void

setKeepAlive(boolean on)设置该socket的连接状态;

 void

setReceiveBufferSize(int size)设置接收缓存容量;

 void

setSendBufferSize(int size)设置发送缓存容量;

 void

setSoTimeout(int timeout)设置毫秒级的超时时间;

 String

toString()将该socket转换为字符串输出。

三、基础概念填空

1.TCP是(一种面向连接的、可靠的、基于字节流的运输层(Transportlayer)通信协议),UDP是(TCP/IP参考模型中传输层的无连接协议,提供面向事务的、简单的、不可靠数据传送服务)。

2.端口是(网络体系结构中应用层与传输层之间的通信协议接口),由(16)bit构成,表示范围(0~65535),其代表了(存储本地软件)进程,且只具备本地意义。

3.套接字是(参与通信两方的一种约定,用套接字中的相关函数来完成通信过程),其三个构成部分是(通信的目的IP地址)、(使用的传输层协议(TCP或UDP))和(使用的端口号)。

4.NetStat是(DOS命令,是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息),要查看有效连接信息使用的参数是(-a),要查看所有的连接信息使用的参数是(-n)。

当发现连接的状态是Listening表示(某端口是个开放的TCP端口,正处于监听状态,等待远程用户的连接),Established表示(表示已建立通信连接,两台机器正在交换数据)。

5.在JAVA中TCP的套接字类是(Socket)和(ServerSocket)。

ServerSocket类的accept的作用是(实现与客户端的连接,完成TCP连接的三次握手),Socket类获得输入流的方法是(InputStreamgetInputStream()),获得输出流的方法是(OutputStreamgetOutputStream()).

4、程序填空

1.客户端连接服务器端

importjava.io.*//引用输入与输出类库

import.*//引用网络类库

publicclassexp_5_1{

publicstaticvoidmain(String[]args){

StringhostName="";

intport=80;

Socketcs=null;

try{

cs=newSocket(hostName,port);

System.out.println("连接"+hostName+"的端口"+port+"成功");

System.out.println("对方主机"+cs.getInetAddress()+":

对方端口"+cs.getPort());

System.out.println("本地主机"+cs.getLocalAddress()+":

本地端口"+cs.getLocalPort());

Cs.close();

}catch(Exceptione){

System.err.println("无法连接指定服务");

}

}

}

2.客户端连接服务器端,并获得输入与输出流

importjava.io.*;

import.*;

publicclassexp_5_3{

publicstaticvoidmain(Stringargs[])throwsIOException{

Socketcs=null;

DataOutputStreamos=null;

DataInputStreamis=null;

try{//建立socket连接

cs=newSocket("localhost",8000);//发出连接请求

is=newDataInputStream(cs.getInputstream());

os=newDataOutputStream(cs.getOutputstream());

}catch(UnknownHostExceptione){

System.err.println("不可识别的主机");

System.exit(0);

}catch(IOExceptione){

System.err.println("无法链接到服务器的8000端口");

System.exit(0);

}

DataInputStreamstdIn=newDataInputStream(System.in);

System.out.print("请输入你的用户名:

");

Stringusername=stdIn.readLine();

StringfromServer,fromUser;

while((fromServer=is.readUTF())!

=null){

System.out.println("Server:

"+fromServer);

if(fromServer.equals("bye"))break;

System.out.print("Client:

");

fromUser=stdIn.readLine();

os.writeUTF(username+"#"+fromUser);

Os.flush();

}

os.close();

is.close();

stdIn.close();

cs.close();

}

}

3.服务器端程序

importjava.io.*;

import.*;

publicclassexp_5_4{//TCP通信,作为服务器

publicstaticvoidmain(String[]args)throwsIOException{

ServerSocketss=null;

try{

ss=newServerSocket(8000);

System.out.println("服务器开始监听8000端口的连接请求");

}catch(IOExceptione){

System.err.println("8000端口不能使用");

System.exit

(1);

}

Socketcs=null;

try{

cs=ss.accept();

}catch(IOExceptione){

System.err.println("接受客户机端连接失败");

System.exit

(1);

}

DataOutputStreamos=newDataOutputStream(cs.getOutputStream());

DataInputStreamis=newDataInputStream(cs.getInputStream());

StringinputStr,outputStr;

//输出操作

os.writeUTF("WelcometoMyChatServer");

os.flush();//立即将数据从输出缓存提交给网络发送

DataInputStreamstdIn=newDataInputStream(System.in);//获得键盘输入流

//输入操作

while((inputStr=is.readUTF())!

=null){//接受网络数据

System.out.println("Customer:

"+inputStr);

System.out.print("Server:

");

outputStr=stdIn.readLine();//接受键盘输入

Os.writeUTF(outputStr);//向网络发送数据

os.flush();

if(outputStr.equals("bye"))break;

}

os.close();//流关闭

is.close();

cs.close();//套接字关闭

ss.close();

}

}

五、实验内容

1.在Windows下使用netstat命令,查看本地计算机开放端口。

获得/help,分别测试-s-e–r-a–n及其组合。

2.对指定IP范围内主机上指定PORT范围进行连接测试。

import.*;(2分)

importjava.io.*;

classmyJava{

publicstaticvoidmain(String[]args){

Stringhost="222.24.16.";(2分)

Stringhost_ip=null;

Socketcs=null;

for(inti=1;i<17;i++){(2分)

host_ip=host+i;

for(intj=0;j<65536;j++){

try{

cs=newSocket(host_ip,j);(2分)

System.out.println(host_ip+":

"+j);

}catch(Exceptione){(2分)

System.err.println();

}

}

}

}

}

报告内容:

运行结果,获得探测范围中对主机开放端口数进行统计,并得到所消耗的总时间。

利用RandomAccessFile将探测结果保存在文件中(IP地址和开放的端口号)

2.简单的单线程,一问一答式通信的TCPServer和TCPClient,注意在编译源代码时有个提示“某API已经过时”,找到该API类或者方法。

在运行程序时,注意通信双方是否随时输入,如果不能,考虑可能是什么原因造成的。

//服务器端

importjava.io.*;

import.*;

publicclassSimpleServer{

//位置一

publicstaticvoidmain(String[]args){

//TCP通信,作为服务器

ServerSocketserverSocket=null;//位置二

//首先建立服务器

try{//端口号唯一标是本进程

//位置三

serverSocket=newServerSocket(10);//修改10为本地TCP已被占用的端口,或超过0-65535的端口,观察结果

System.out.println("ServerisListeningonPort10Now");

}catch(IOExceptione){

System.err.println("Can'tlistenonport10");

System.exit

(1);

}

//接受客户端连接

SocketclientSocket=null;

try{

clientSocket=serverSocket.accept();//connect

}catch(IOExceptione){

System.err.println("Acceptfailed");

System.exit

(1);

}

try{

PrintStreamout=newPrintStream(

newBufferedOutputStream(clientSocket.getOutputStream(),1024)

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

当前位置:首页 > 幼儿教育 > 少儿英语

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

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