Java网络编程,有助于解决实际问题,

原创 2004年02月05日 00:46:00
 Java开发网络软件非常方便和强大,Java的这种力量来源于他独有的一套强大的用于网络的 API,这些API是一系列的类和接口,均位于包java.netjavax.net中。在这篇文章中我们将介绍套接字(Socket)慨念,同时以实例说明如何使用Network API操纵套接字,在完成本文后,你就可以编写网络低端通讯软件。

  什么是套接字(Socket)

  Network API是典型的用于基于TCP/IP网络Java程序与其他程序通讯,Network API依靠Socket进行通讯。Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。如图1<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2004-2-41116030.gif


  我们来分析一下图1Host A上的程序A将一段信息写入Socket中,Socket的内容被Host A的网络管理软件访问,并将这段信息通过Host A的网络接口卡发送到Host BHost B的网络接口卡接收到这段信息后,传送给Host B的网络管理软件,网络管理软件将这段信息保存在Host BSocket中,然后程序B才能在Socket中阅读这段信息。

  假设在图1的网络中添加第三个主机Host C,那么Host A怎么知道信息被正确传送到Host B而不是被传送到Host C中了呢?基于TCP/IP网络中的每一个主机均被赋予了一个唯一的IP地址,IP地址是一个32位的无符号整数,由于没有转变成二进制,因此通常以小数点分隔,如:198.163.227.6,正如所见IP地址均由四个部分组成,每个部分的范围都是0-255,以表示8位地址。

  值得注意的是IP地址都是32位地址,这是IP协议版本4(简称Ipv4)规定的,目前由于IPv4地址已近耗尽,所以IPv6地址正逐渐代替Ipv4地址,Ipv6地址则是128位无符号整数。

  假设第二个程序被加入图1的网络的Host B中,那么由Host A传来的信息如何能被正确的传给程序B而不是传给新加入的程序呢?这是因为每一个基于TCP/IP网络通讯的程序都被赋予了唯一的端口和端口号,端口是一个信息缓冲区,用于保留Socket中的输入/输出信息,端口号是一个16位无符号整数,范围是0-65535,以区别主机上的每一个程序(端口号就像房屋中的房间号),低于256的短口号保留给标准应用程序,比如pop3的端口号就是110,每一个套接字都组合进了IP地址、端口、端口号,这样形成的整体就可以区别每一个套接字t,下面我们就来谈谈两种套接字:流套接字和自寻址数据套接字。

  流套接字(Stream Socket

  无论何时,在两个网络应用程序之间发送和接收信息时都需要建立一个可靠的连接,流套接字依靠TCP协议来保证信息正确到达目的地,实际上,IP包有可能在网络中丢失或者在传送过程中发生错误,任何一种情况发生,作为接受方的 TCP将联系发送方TCP重新发送这个IP包。这就是所谓的在两个流套接字之间建立可靠的连接。

  流套接字在C/S程序中扮演一个必需的角色,客户机程序(需要访问某些服务的网络应用程序)创建一个扮演服务器程序的主机的IP地址和服务器程序(为客户端应用程序提供服务的网络应用程序)的端口号的流套接字对象。

  客户端流套接字的初始化代码将IP地址和端口号传递给客户端主机的网络管理软件,管理软件将IP地址和端口号通过NIC传递给服务器端主机;服务器端主机读到经过NIC传递来的数据,然后查看服务器程序是否处于监听状态,这种监听依然是通过套接字和端口来进行的;如果服务器程序处于监听状态,那么服务器端网络管理软件就向客户机网络管理软件发出一个积极的响应信号,接收到响应信号后,客户端流套接字初始化代码就给客户程序建立一个端口号,并将这个端口号传递给服务器程序的套接字(服务器程序将使用这个端口号识别传来的信息是否是属于客户程序)同时完成流套接字的初始化。

  如果服务器程序没有处于监听状态,那么服务器端网络管理软件将给客户端传递一个消极信号,收到这个消极信号后,客户程序的流套接字初始化代码将抛出一个异常对象并且不建立通讯连接,也不创建流套接字对象。这种情形就像打电话一样,当有人的时候通讯建立,否则电话将被挂起。

  这部分的工作包括了相关联的三个类:InetAddress, Socket, ServerSocket InetAddress对象描绘了32位或128IP地址,Socket对象代表了客户程序流套接字,ServerSocket代表了服务程序流套接字,所有这三个类均位于包java.net

利用C语言解决实际问题

1. 5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果 A选手说:B第一,我第三。 B选手说:我第二,E第四。 C选手说:我第一,D第二。 D选手说:C最后,我第三。 E选手说:我...
  • iliuxi_
  • iliuxi_
  • 2017年04月16日 18:18
  • 507

数据结构 - 用递归算法解决实际问题

实验题目:编写一个程序exp5-2.cpp,求解背包问题:设有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的方案,使选中物品的总重量不超过指定的限制重量,但选中物品的总价值最大。源码:...
  • mayuko2012
  • mayuko2012
  • 2016年06月01日 18:09
  • 952

C语言解决实际问题_001

1.Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。输入包含一个整数n。输出一行,包含一个...
  • wang_huizhang
  • wang_huizhang
  • 2016年10月19日 13:11
  • 982

用matlab解决实际应用题

题目一题目二遇到的问题 The input character is not valid in MATLAB statements or expressions. 解决方法:文件名2_2.m不能以...
  • qq_27848507
  • qq_27848507
  • 2016年08月29日 21:21
  • 1643

算法学习笔记——利用栈解决实际问题- part 2

算法学习笔记: part1 : http://blog.csdn.net/minghe_uestc/article/details/10416809 全文下载地址见part 1 1     ...
  • wearenoth
  • wearenoth
  • 2013年08月27日 21:29
  • 4182

用python解决你的实际问题,忘记语言吧

我在思考一个问题。软件是为人服务的,而人的需求一直在变。什么东西能快速适应这种需求的变更。 本人从汇编玩到C,总觉得这些底层的东西吧~~强大是强大,但是用起来费劲,而且分散你的经历,不能把精力放在应用...
  • cpuwolf
  • cpuwolf
  • 2016年01月28日 13:40
  • 938

科技与生活 - 自然辩证法

再过100年,生活会变成什么样?《未来生活智能事物报告》勾勒出美好蓝图。包括空间科学家、未来建筑学家、城市设计专家在内的报告作者认为,未来的种种设计都源于人口增加、需要安置庞大人口这个出发点。用碳纳米...
  • oscar999
  • oscar999
  • 2016年07月22日 16:32
  • 876

局域网应用问题专题解答

1、问:我访问局域网中的计算机时,为什么常常被提示要输入用户名和密码? 答:这主要是为了安全方面的考虑。而且当你重新启动计算机时又要重新输入用户名和密码,这一点确实让人会觉得很麻烦。 你只要在需要进行...
  • cunzhangxp
  • cunzhangxp
  • 2006年04月03日 15:05
  • 2084

浅谈以数据结构的视角去解决算法问题的步骤

浅谈以数据结构的视角去解决算法问题的步骤 在程序设计中,很多复杂的算法设计问题,从数据结构的角度来看其实都可以按照这种思路来解决: 1.对于要处理的一组数据,根据实际需求整理出要处理的数据元素...
  • zolalad
  • zolalad
  • 2014年05月14日 14:49
  • 1550

创建红黑树解决实际问题

在查找中,虽然hash表查找非常迅速,但是随着数据的种类增多, hash表长会变得更长,且冲突也会越来越多,那么如何能实现无论在 多大数据量的情况下,查找依然是高性能的呢?    在1978...
  • rongaimeng
  • rongaimeng
  • 2014年10月23日 10:14
  • 2182
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java网络编程,有助于解决实际问题,
举报原因:
原因补充:

(最多只允许输入30个字)