码迷,mamicode.com
首页 > 编程语言 > 详细

Java - 网络

时间:2017-11-19 18:50:25      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:详解   返回值   主机   内存区域   tin   java.net   hostname   不能   注意   

要事为先,你如果想要在这个行业发展下去的话,实际上三角形的三个点在支撑着你发展,一个是技术、一个是管理(不是说管理别人,是管理你自己的时间,管理你自己的精力)、还有一个就是沟通,注重这三点均衡的发展。

 

 

技术分享图片

技术分享图片

技术分享图片

技术分享图片

技术分享图片

分层有巨大的好处,它能帮我们屏蔽掉一些底层的东西,统一对外接口。

分层思想比喻:就好比你去邮局寄信,你把信给邮局就OK了,至于邮局是如何寄到目的地的,是汽车还是飞机还是火车,你不用去管。

 

 

技术分享图片

技术分享图片

暂时只要记住一点就可:IP协议给我们做的最大的一个贡献就是它能保证给我们提供独一无二的IP地址,目前知道这点就行了,想要更透彻的了解网络底层,推荐一本书《TCP/IP详解》

 

 

 

技术分享图片

 

 

 

 

 

 

技术分享图片

端口号(两个字节,65536个端口)用来区分计算机上运行的不同的应用程序,某端口一旦被该程序占用,将不能被被其他程序使用,1024以下的是系统使用的端口号,普通应用程序最好不要占,因为系统可能会随时征用。

80:HTML默认端口

21:FTP默认端口

25:SMTP默认端口

110:POP3默认端口

端口号又分为两种:一种是TCP的端口,一种是UDP的端口,都是65536个端口,而且各自是各自的,TCP的8888端口与UDP的8888端口,它们两个不是一回事

 

 

 

 

 

 

 

 

网络应用程序在启动的时候应该是先启Server再启Client。

Server端是阻塞式的运行,它在等Client端连进来,所以一般是不会挂的,运行时绑定在一个端口上监听。

Client连入Server的端口号由系统随便找一个,没必要绑定在一个端口上。

 

 

技术分享图片

技术分享图片

 

连接:TestServer.java/TestClient.java:

技术分享图片

java.net.Socket.getInetAddress():此方法获得Client端的IP。

java.net.Socket.getPort():此方法获得Client端的端口。

技术分享图片

 

 

通话:TestSockServer.java/TestSockClient.java

技术分享图片

技术分享图片

Server端先读再写的,Client端就要先写再读。

 

 

学生作品:talkserver.java/talkclient.java

技术分享图片

技术分享图片

技术分享图片

 

 

 

 

技术分享图片

补充说明:

1、 UDP从严格意义上来讲,没有Server和Client这种概念,因为它不区分Server的Socket或Client的Socket,对于UDP来说,它的Socket也是一个插座,但是这个插座是无线连接,不是说先得连上一根线,咱们俩之间有通道了我才能发数据。

2、 既然你要接收一个对方发过来的包裹,你总得有地方接收,那么这个地方你必须先分配好,用一个小包包接收对方发过来的一个小包包数据,因为对方发过来的是一堆数据包,你接收在什么地方?你总得撑一个包裹开来,把一个包裹撑开来接收对方的这些数据包;那么Java代码中经常这样实现这个接收的包裹:byte buf[] = new byte[ 1024 ];,代表在内存中分配1024个字节,用来接收对方发过来的数据,但是你不能直接操作这个buf数组来接收,一般的写法是这样:DatagramPacket dp = new DatagramPacket( buf, buf.lenth );,dp才是包裹,用它来接收对方发过来的东西,但实际上是接收过来的数据存在哪呢?存在了这个buf数组里边儿,具体我占这个buf可以占多少呢,buf.length就是表示我把整个buf我全占了

 

例:TestUDPServer.java/TestUDPClient.java

技术分享图片

java.net.DatagramSocket.receive( java.net.DatagramPacket dp )表示我这个socket和只要接收到数据,我就给它扔包裹(dp)里

java.net.DatagramPacket.getLength()表示我这个包裹里实际上收了多少个数据,buf.lenth只是我这个包裹总共可以收多少个数据,但实际上我有可能只收了2个。

技术分享图片

java.net.DatagramPacket( byte[] buf, int length, java.net.SocketAddress address )表示根据指定的数据存放位置、数据长度、Socket地址来构造一个包裹,用来装准备发送出去的数据小包。

java.net.InetSocketAddress( String hostname, int port )这是一个实现了java.net.SocketAddress接口的网络Socket类,表示根据指定的主机名(也就是IP地址)、端口,构造一个网络Socket。

补充说明:有人就问了,咱们原来用TCP发数据,通过管道直接就发过去了,根本不要写地址,你这个UDP为什么还要写这个地址呢?因为TCP发数据是建立在互相已连接的基础上(可靠),所以直接能找到目标地址,而UDP本身没有连接,这外包裹你扔出去就扔出去了,那么包裹在网络上传输的过程中由路由器接收它,你路由器总得知道这个包裹它下一步要跳到哪儿去对不对啊,它才好给你选择这个路径,所以每一包UDP的数据你必须得告诉它到底要把这东西发到哪里去

对于服务端来说,TCPjava.net.ServerSocket.accept(),表示接受、承认,此服务端的ServerSocket会在它所在的端口上等待客户端的Socket连入,此方法会有一个客户端socket的返回值,一旦接受到一个客户端Socket就与之建立通信管道(也就是指的输入/输出流),便可以互相发送数据,而UDPjava.net.DatagramSocket.receive( java.net.DatagramPacket dp ),表示接收、收到,此服务端的DatagramSocket会在它所在的端口上接收客户端发送给它的数据包,此方法无返回值,一旦接收到一个客户端的数据包(DatagramPacket),就将其放入先前指定的内存区域,并给予处理

对于客户端来说,TCP是只要连接上服务端,并与之建立通信管道后,便可以发送数据,而UDP是不需要连接上服务端便可以发送数据,是无连接发送(注意:它发送的是一个数据包(DatagramPacket),也就说扔出去就OK,至于服务器是否接收,它不管)

 

 

 

 

技术分享图片

Java - 网络

标签:详解   返回值   主机   内存区域   tin   java.net   hostname   不能   注意   

原文地址:http://www.cnblogs.com/jzsz/p/7860548.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!