黑马程序员—网络编程
来源:互联网 发布:代理淘宝开店 编辑:程序博客网 时间:2024/05/14 17:20
于服务器。连接一旦建立以后,就客户端和服务器端就可以进行数据传递了,而且两者的身份是等价的。在一些程序中,程序既有客户端功能也有服务器端功能,最常见的软件就是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
一.区别
二者都是有用的和常用的, 如果纯粹从概念上区分二者就比较费解了, 我们直接从功能上进行区分,简单明了:
这两种传输协议也就是合于适配不同的业务和不同的硬件终端。
在使用中,类似于图像、声音等对可靠性要求没有那么高的业务可以用 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 协议。
总结一、udp1、将数据源和目的地封装到数据包中,不需要建立连接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.105Socket
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,既可以定义输出流也可以创建输入流,具体情况根据需要构建;比如:我们需要客户端给服务器端发送数据,服务器端再给客户端反馈数据;那么就要在客户端和服务器端分别多加一个输入流和输出流!否则,发不出去,收不到!
- 黑马程序员— 网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员 — 网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- 黑马程序员—网络编程
- Q: android R.java资源文件不自动生成
- Java读书笔记02 基础知识
- Light oj 1038 Race to 1 Again(概率dp)
- 半边数据结构
- AVL树的简单写法
- 黑马程序员—网络编程
- c++中的虚函数
- ORA-01918: 用户 'SCOTT' 不存在 解决方法
- 5
- c++_extern "C"
- linux下JDK6的安装
- Linux用户及权限基础
- 两个SVN仓库的同步----svnsync
- python 同时载入多个数据文件