------- android培训、java培训、期待与您交流! ----------
一、网络编程概述
1、网络中用IP地址标识每一台主机,ip地址用点分十进制来表示,现在用的是4个字节来表示就是IPv4,每一个字节最大255,所以每一个字节不能超过255,ip地址还有6字节表示的IPv6。ip地址中有些是保留的例如以10开头的段以及以192开头的段,其中127.0.0.1表示回路地址也就是localhost,192.168.1.255就是广播地址,192.168.1.1表示的是
2、两台主机间通信时首先找到对方IP,再根据端口号找到通信的应用程序,这里的端口号指的是逻辑端口号,也就是网络应用程序的数字标识,比方说http服务就是80,1024以下的端口号主要是系统在使用。
3、两台主机通讯还需要定义通信协议,国际组织使用TCP/IP协议,局域网通信可以安装微软的IPX/SPX/NetBIOS协议。局域网CS两个机子都装IPX就可以通信。有些特有的组织有自己的协议。
二、网络模型
1、OSI参考模型,网络分层为七层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层,通信时将从上到下数据封包接着从下到上拆包。
2、TCP/IP参考模型,分为应用层、传输层、网际层、数据链路层、物理层,我们java中的网络编程在网际层和传输层,而javaweb开发在应用层,每个层都有自己的协议,传输层是TCP协议,网际层是IP协议,应用层有http、ftp等协议。
3、IP地址标识网络中的设备,不易记忆使用主机名,127.0.0.1默认是localhost,javaAPI中用java.net.InetAddress类来表示IP地址,InetAddress对象用来表示ip地址对象。
static InetAddressgetLocalHost();返回本地主机的ip地址的InetAddress对象,该方法会抛出java.net.UnkownHostException。
String getHostAddress();返回ip地址的String对象。
StringgetHostName();返回主机名的字符串。该方法在解析主机名时如果主机名不存在,或者无法解析返回该主机的ip地址字符串。
InetAddressgetByName(String name)用来返回name主机的ip地址的InetAddress对像。然后再使用StringgetHostAddress()返回IP地址的String对象,本人觉得这个方法的名字有点歧义。
InetAdress[] getAllByName(Stringname);返回主机名对应的所有ip地址的InetAddress对象,以一个数组的形式返回。
InetAddress getByAddress(byte[]addr);给定一个装有IP地址的字节数组,返回一个InetAddress对象。
使用的时候以IP地址为主,因为主机名还需要解析!
三、传输协议
1、UDP面向无连接,传输数据前不用建立连接,把数据封装成数据包,是不可靠协议,容易丢包,但速度快,发的包不能超过64KB,聊天用的就是UDP比方说飞秋、视频会议、桌面共享
2、TCP面向连接,经过3次握手建立连接,是可靠连接,在连接中传输大量数据,效率稍低,下载使用的是TCP
四、Socket
1、Socket就是为网络服务提供的一种的机制
2、通信的两端都有Socket
3、网络通信其实就是Socket通信
4、数据在两个Socket之间通过IO传输
五、UDP编程
1、DatagramSocket类,用来建立发送和接收的数据报包的套接字,既可发送也可接收。
voidreceive(DatagramPacket p) throwsIOException接收数据包到p中,此方法是一个阻塞式方法。
void send(DatagramPacket )throws IOException;发送p
2、DatagramPacket类,无连接包投递服务,根据包中的信息,从一台机器路由到其他机器,不同包投递时可有不同的路由以及按不同的顺序到达。既可用来代表接收的数据包也可表示发送的数据包。
DatagramPacket中带着地址的都是用来构造发送数据包的。
发送流程:1、建立udpsocket服务。
2、提供数据,并将数据封装到数据包中。
3、通过socket服务的发送功能,将数据包发送出去。
4、关闭资源。
DatagramPacket(byte[] buf ,int length, InetAddress address, intport);构造一个DatagramPacket对象,用来发送length长度的数据包到指定的address和port。
接收流程:1、定义udpSocket服务。
2、定义接收数据包,存储接收到的字节数据。
3、通过DatagramSocket的receive方法将数据存入已定义好的数据包。
4、使用DatagramPacket的方法将数据包中的信息取出
5、关闭资源
DatagramPacket(byte[] buf, intlength);构造一个DataPacket对象接收length大小的数据包。
InetAddressgetAddress();获取该数据包的IP地址的InetAddress对象。
byte[]getData();返回数据缓冲区。
int getPort();返回端口号
3、实现聊天程序可以使用多线程技术
六、TCP编程
1、UDP中是发送端和接收端而TCP中是客户端Socket和服务端ServerSocket。Socket中既有输入流也有输出流。
2、Socket的构造函数
Socket();创建未连接的套接字。之后可以通过connect(InetAddress addr);进行连接。
3、Socket的方法
OutputStream getOutputStream();返回该socket的输出流对象
InputStream getInputStream();返回该socket的输入流对象
Socket(InetAddress addr, int port);创建一个流套接字并将其连接到指定IP的指定端口。
4、ServerSocket构造函数
ServerSocket();创建非绑定服务器套接字。
ServerSocket(int port);创建绑定到特定端口的服务器套接字
5、ServerSocket方法
Socket accept();侦听并接受到此套接字的连接,返回连接的套接字对象,该方法会阻塞。
InputStreamgetInputStream();返回此套接字的输入流
OutputStream getOutputStream();返回此套接子的输出流