实验05 TCP Socket文档格式.docx

上传人:b****5 文档编号:16631135 上传时间: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

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,;

port,int 

backlog)在指定端口创建一个服务端socket和日志;

backlog,InetAddress 

bindAddr)

 

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

6.Socket

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

图3Socket类描述

Socket构造方法有:

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

Socket(InetAddress 

address,int 

port)

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

port,InetAddress 

localAddr,int 

localPort)

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

Socket(String 

host,int 

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

在本地指定地址和端口,创建一个连接指定远程主机名称和端口的客户端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{

  newThread(newMyThread()).start();

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

第二个方法更加灵活。

三.类及方法:

1.ServerSocket

常用方法

Socket

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

void

bind(SocketAddress 

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

close()关闭该ServerSocket;

InetAddress

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

int

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

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

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

boolean

isClosed()判断ServerSocket是否关闭;

setReceiveBufferSize(int 

size)设置接收缓存尺寸;

setSoTimeout(int 

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

String

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

2.Socket

bindpoint)绑定socket在本地;

close()关闭该socket;

connect(SocketAddress 

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

endpoint,int 

timeout)连接该socket到服务器并设置超时时间;

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

InputStream

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

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

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

OutputStream

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

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

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

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

getSoTimeout()获得超时时间;

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

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

setKeepAlive(boolean 

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

size)设置接收缓存容量;

setSendBufferSize(int 

size)设置发送缓存容量;

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

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+"

成功"

);

对方主机"

+cs.getInetAddress()+"

对方端口"

+cs.getPort());

本地主机"

+cs.getLocalAddress()+"

本地端口"

+cs.getLocalPort());

Cs.close();

}catch(Exceptione){

System.err.println("

无法连接指定服务"

}

}

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

importjava.io.*;

import.*;

publicclassexp_5_3{

publicstaticvoidmain(Stringargs[])throwsIOException{

DataOutputStreamos=null;

DataInputStreamis=null;

try{//建立socket连接

cs=newSocket("

localhost"

8000);

//发出连接请求

is=newDataInputStream(cs.getInputstream());

os=newDataOutputStream(cs.getOutputstream());

}catch(UnknownHostExceptione){

不可识别的主机"

System.exit(0);

}catch(IOExceptione){

无法链接到服务器的8000端口"

DataInputStreamstdIn=newDataInputStream(System.in);

System.out.print("

请输入你的用户名:

Stringusername=stdIn.readLine();

StringfromServer,fromUser;

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

=null){

Server:

+fromServer);

if(fromServer.equals("

bye"

))break;

Client:

fromUser=stdIn.readLine();

os.writeUTF(username+"

#"

+fromUser);

Os.flush();

os.close();

is.close();

stdIn.close();

cs.close();

3.服务器端程序

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

publicstaticvoidmain(String[]args)throwsIOException{

ServerSocketss=null;

ss=newServerSocket(8000);

服务器开始监听8000端口的连接请求"

8000端口不能使用"

System.exit

(1);

Socketcs=null;

cs=ss.accept();

接受客户机端连接失败"

DataOutputStreamos=newDataOutputStream(cs.getOutputStream());

DataInputStreamis=newDataInputStream(cs.getInputStream());

StringinputStr,outputStr;

//输出操作

os.writeUTF("

WelcometoMyChatServer"

os.flush();

//立即将数据从输出缓存提交给网络发送

DataInputStreamstdIn=newDataInputStream(System.in);

//获得键盘输入流

//输入操作

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

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

Customer:

+inputStr);

outputStr=stdIn.readLine();

//接受键盘输入

Os.writeUTF(outputStr);

//向网络发送数据

if(outputStr.equals("

//流关闭

//套接字关闭

ss.close();

五、实验内容

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

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

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

import.*;

(2分)

classmyJava{

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);

System.out.println(host_ip+"

:

"

+j);

}catch(Exceptione){(2分)

System.err.println();

}

}

}

报告内容:

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

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

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

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

//服务器端

publicclassSimpleServer{

//位置一

//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

Acceptfailed"

PrintStreamout=newPrintStream(

newBufferedOutputStream(clientSocket.getOutputStream(),1024)

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

当前位置:首页 > 经管营销 > 财务管理

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

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