黑马程序员—网络编程

来源:互联网 发布:代理淘宝开店 编辑:程序博客网 时间:2024/05/14 17:20
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
黑马程序员—网络编程

1、什么是网络编程

网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。在网络编程中,发起连接程序,也就是发送第一次请求的程序,被称作客户端(Client),等待其他程序连接的程序被称作服务器(Server)。客户端程序可以在需要的时候启动,而服务器为了能够时刻应连接,则需要一直启动。例如以打电话为例, 首先拨号的人类似于客户端, 接听电话的人必须保持电话畅通类似
于服务器。连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是BT、emule 这类软件了。

网络模型
OSI 参考模型
TCP/IP 参考模型

java 中ip对象:InetAddress.

import java.net.*;

class  IPDemo{

      public static voidmain(String[] args) throws UnknownHostException{

            //通过名称(ip字符串or主机名)来获取一个ip对象。

            InetAddress ip =InetAddress.getByName("www.baidu.com");//java.net.UnknownHostException

            System.out.println("addr:"+ip.getHostAddress());

            System.out.println("name:"+ip.getHostName());

      }

}

2、网络通讯要素


IP 地址

端口号

传输协议

IP 地址:InetAddress

网络中设备的标识

不易记忆,可用主机名

本地回环地址:127.0.0.1 主机名:localhost

端口号

用于标识进程的逻辑地址,不同进程的标识

有效端口:0~65535,其中 0~1024 系统使用或保留端口。
备注:不是所谓的物理端口!
传输协议
通讯的规则
常见协议:TCP,UDP

3、TCP和UDP的联系和用途

一.区别
二者都是有用的和常用的, 如果纯粹从概念上区分二者就比较费解了, 我们直接从功能上进行区分,简单明了:
这两种传输协议也就是合于适配不同的业务和不同的硬件终端。
在使用中,类似于图像、声音等对可靠性要求没有那么高的业务可以用 UDP,他们不需要准确存储对准确性无要求但要求速度快。类似于文本、程序、文件等要求可靠的数据最好就用 TCP,但会牺牲一些速度。
对系统资源的要求:CP 较多,UDP 少。
程序结构:UDP 程序结构较简单,TCP 复杂。
流模式与数据报模式:TCP 保证数据正确性,UDP 可能丢包; TCP 保证数据顺序,UDP不保证

二.用途
TCP 是面向连接的,有比较高的可靠性,一些要求比较高的服务一般使用这个协议,如 FTP、Telnet、SMTP、HTTP、POP3 等,而 UDP 是面向无连接的,使用这个协议的常见服务有 DNS、SNMP、QQ 等。对于 QQ 必须另外说明一下,QQ2003 以前是只使用 UDP 协议的,其服务器 使用 8000 端口,侦听是否有信息传来,客户端使用 4000 端口,向外发送信息 (这也就不难理解在一般的显IP的QQ版本中显示好友的IP地址信息中端口 常为4000或其后续端口的原因了) ,即 QQ 程序既接受服务又提供服务,在以后的 QQ 版本中也支持使用 TCP 协议了。
Udp 是一种面向无连接的通信协议,该协议使得数据传输的速度得到大幅度的提高。视频聊天语音聊天基本都是用 UPD 协议。

总结
、udp
1、将数据源和目的地封装到数据包中,不需要建立连接
2、每个数据包的大小限制在 64k 以内
3、因无连接,是不可靠协议
4、不需要建立连接,速度快
例子:聊天、对讲机就是 UDP 的,面向无连接(不管在不在,知不知道,只管发送,求速度) ,丢数据也不管。速度快。数据被分成包
二、TCP:
1、建立连接,形成传输数据的通道
2、在连接中进行大量数据的传输
3、通过三次握手完成连接、是可靠协议
4、必须建立连接,效率会稍低
例子:电话通话,必须连接,对方同意才可以发送数据(不然就等待) ,不能丢失数据。

4、InetAddress与Socket


InetAddress:构造方法私有,不能直接创建对象。

InetAddress getByName(String host):在给定主机名的情况下确定主机的 ip 地址。

InetAddress getLocalHost():返回本地主机。

InetAddress[] getAllByName(String host)

ip.getHostAddress(),

ip.getHostName()

Eg:package july76net;import java.net.InetAddress;public class Demo1 {public static void main(String[] args) throws Exception {InetAddress i = InetAddress.getLocalHost();System.out.println(i);i = InetAddress.getByName("www.baidu.com");System.out.println(i);System.out.println(i.getHostAddress());System.out.println(i.getHostName());}}输出:XP-201304252326/10.6.147.2www.baidu.com/61.135.169.10561.135.169.105
Socket
Socket 就是为网络服务提供的一种机制。
通信的两端都有 Socket。
网络通信其实就是 Socket 间的通信。
数据在两个 Socket 间通过 IO 传输


5、UDP传输


①:只要是网络传输,必须有 socket 。
②:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。直接操作 udp 不可能,对于 java 语言应该将 udp 封装成对象,易于我们的使用,这个对象就是 DatagramSocket. 封装了 udp 传输协议的 socket 对象。
因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。
DatagramSocket 具备发送和接受功能,在进行 udp 传输时,需要明确一个是发送端,一个是接收端。
udp 的发送端:
①:建立 udp 的 socket 服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。
②:明确要发送的具体数据。
③:将数据封装成了数据包。
④:用 socket 服务的 send 方法将数据包发送出去。

⑤:关闭资源。


udp 的接收端:


①:创建 udp 的 socket 服务,必须要明确一个端口,作用在于,只有发送到这个端口
的数据才是这个接收端可以处理的数据。
②:定义数据包,用于存储接收到数据。
③:通过 socket 服务的接收方法将收到的数据存储到数据包中。
④:通过数据包的方法获取数据包中的具体数据内容,比如 ip、端口、数据等等。

⑤:关闭资源。

//Eg://发送端(客户端)import java.net.*;class UdpSend{public static void main(String[] args)throws Exception {// 1,建立 udp 的 socket 服务。DatagramSocket ds = new DatagramSocket(8888);//指定发送端口, 这个可以不指定,系统会随机分配。// 2,明确要发送的具体数据。String text = "udp 传输演示 哥们来了";byte[] buf = text.getBytes();// 3,将数据封装成了数据包。DatagramPacket dp = newDatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000);// 4,用 socket 服务的 send 方法将数据包发送出去。ds.send(dp);// 5,关闭资源。ds.close();}}//接收端(服务器端)import java.net.*;class UdpRece {public static void main(String[] args) throws Exception{// 1,创建 udp 的 socket 服务。DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样!// 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);// 3,通过 socket 服务的接收方法将收到的数据存储到数据包中。ds.receive(dp);//该方法是阻塞式方法。// 4,通过数据包的方法获取数据包中的具体数据内容,比如 ip,端口,数据等等。String ip = dp.getAddress().getHostAddress();int port = dp.getPort();String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。System.out.println(ip+":"+port+"--"+text);// 5,关闭资源。ds.close();}}


6、TCP传输


两个端点的建立连接后会有一个传输数据的通道, 这通道称为流, 而且是建立在网络基础上的流,称之为 socket 流。该流中既有读取,也有写入。

tcp 的两个端点:一个是客户端,一个是服务端。

客户端:对应的对象,Socket

服务端:对应的对象,ServerSocket

TCP 客户端:
①:建立 tcp 的 socket 服务,最好明确具体的地址和端口。这个对象在创建时,就已
经可以对指定 ip 和端口进行连接(三次握手)。
②:如果连接成功,就意味着通道建立了,socket 流就已经产生了。只要获取到 socket
流中的读取流和写入流即可,只要通过 getInputStream 和 getOutputStream 就可以获取两
个流对象。
③:关闭资源。

import java.net.*;import java.io.*;//需求:客户端给服务器端发送一个数据。class TcpClient{public static void main(String[] args) throws Exception{Socket s = new Socket("10.1.31.69",10002);OutputStream out = s.getOutputStream();//获取了socket流中的输出流对象。out.write("tcp 演示,哥们又来了!".getBytes());s.close();}}
TCP 服务端:
①:创建服务端 socket 服务,并监听一个端口。
②:服务端为了给客户端提供服务,获取客户端的内容,可以通过 accept 方法获取连接过来的客户端对象。
③:可以通过获取到的 socket 对象中的 socket 流和具体的客户端进行通讯。
④:如果通讯结束,关闭资源。注意:要先关客户端,再关服务端。

我的总结:

对于 UDP 和 TCP,既可以定义输出流也可以创建输入流,具体情况根据需要构建;比如:我们需要客户端给服务器端发送数据,服务器端再给客户端反馈数据;那么就要在客户端和服务器端分别多加一个输入流和输出流!否则,发不出去,收不到!

0 0
原创粉丝点击