黑马程序员____基础____网络编程

------- android培训java培训、期待与您交流! ----------

 一,网络编程(概述)。

     1,网络模型:

            OSI参考模型。

            TCP/IP参考模型。

     2,网络通讯要素:

           IP地址。

           端口号。

           传输协议。

     3

         31,先通过IP地址找到对方的IP

         32,数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。为了方便称呼这个数字,于是就把这些数字叫做     端口(这个叫做逻辑端口)。

         33,定义一个通信规则,这个通讯规则称为协议国际组织定义了通用协议:TCP/IP


二,网络编程(概述2)。

    1,测试网卡:在Dos 下:ping  127.0.0.1

    2—— 1024的端口一般被系统程序所使用。

    3,所以我们一般用:1025  ——  65535 


三,网络编程(网络模型)。

    1,先由上往下封包,然后到另一台主机再由下往上解包

    2TCP/IP参考模型应用层协议:比如,http:\\等。

                       传输层最常见的协议:TCP/IP    和 UDP

                       网际层最常见的协议:IP

                       主机至网络层:比如,网线,无线上网卡等。


四,网络编程(IP地址)。

    1IP地址:

         11,网络中设备的标识。

         12,不易记忆,可用主机名。

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

     2,端口号:

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

         22,有效端口:0 -----  65535 ,其中0 ----- 1024系统使用或保留端口。

     3,传输协议:

          31,通讯规则。

          32,常见协议:TCP/IP  ,  UDP

     4,类:InetAddress里方法(该类没有构造函数):

           41public String toString()将此 IP 地址转换为 String。返回的字符串具有以下形式:主机名/字面值 IP 地址。 如果主机名是未解析的,则不执行反向名称服务查找。主机名部分将由一个空字符串表示。 覆盖:类 Object 中的 toString返回:此 IP 地址的字符串表示形式。

          42public static InetAddress getLocalHost()   throws UnknownHostException返回本地主机。 如果有安全管理器,则使用本地主机名和 -1 作为参数来调用其 checkConnect 方法,以查看是否允许该操作。如果不允许该操作,则返回表示回送地址的 InetAddress。 返回:本地主机的 IP 地址。 抛出: UnknownHostException - 如果找不到 host 的任何 IP 地址。

          43public String getHostAddress()返回 IP 地址字符串(以文本表现形式)。 返回:字符串格式的原始 IP 地址。

          44public String getHostName()获取此 IP 地址的主机名。 如果此 InetAddress 是用主机名创建的,则记忆并返回主机名;否则,将执行反向名称查找并基于系统配置的名称查找服务返回结果。如果需要查找名称服务,则调用 getCanonicalHostName。 如果有安全管理器,则首先使用主机名和 -1 作为参数来调用其 checkConnect 方法,以查看是否允许该操作。如果不允许该操作,则其返回 IP 地址的文本表示形式。 返回:此 IP 地址的主机名;如果安全检查不允许操作,则返回 IP 地址的文本表示形式。

         45public static InetAddress getByName(String host)  throws UnknownHostException在给定主机名的情况下确定主机的 IP 地址。 主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。 对于以字面值 IPv6 地址指定的 host,在 RFC 2732 中定义的形式或在 RFC 2373 中定义的字面值 IPv6 地址格式都可以接受。IPv6 范围地址也受支持。有关 IPv6 范围地址的描述,请参见这里。 如果主机为 null,则返回表示回送接口地址的 InetAddress。请参阅 RFC 3330 的第 节和 RFC 2373 的第 2.5.3 节。 

         46public static InetAddress[] getAllByName(String host)  throws UnknownHostException在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。 主机名可以是机器名(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式。如果提供字面值 IP 地址,则仅检查地址格式的有效性。 对于以字面值 IPv6 地址 指定的 host,在 RFC 2732 中定义的形式或在 RFC 2373 中定义的字面值 IPv6 地址格式都可以接受。字面值 IPv6 地址还可以通过追加范围时区标识符或 scope_id 来限定。scope_id 的语法和用法在这里描述。 如果主机为 null,则返回表示回送接口地址的 InetAddress。请参阅 RFC 3330 的第 节和 RFC 2373 的第 2.5.3 节。 如果有安全管理器,并且 host 非 nullhost.length() 不等于零,则使用主机名和 -1 作为参数调用安全管理器的 checkConnect 方法,来查看是否允许该操作。 参数:host - 主机名,或 null。 返回:给定主机名的所有 IP 地址所组成的数组。 抛出: UnknownHostException - 如果找不到 host 的 IP 地址,或者 scope_id 是为全局 IPv6 地址指定的。 SecurityException - 如果安全管理器存在并且其 checkConnect 方法不允许进行该操作。参数:host - 指定的主机,或 null。 返回:给定主机名的 IP 地址。 抛出: UnknownHostException - 如果找不到 host 的 IP 地址,或者 scope_id 是为全局 IPv6 地址指定的。 SecurityException - 如果安全管理器存在并且其 checkConnect 方法不允许进行该操作。


五,网络编程(TCPUDP)。

    1UDP  

         11,将数据及源和目的封装在数据包中,不需要建立连接。

         12,每个数据包的大小限制在64K内。

         13,因无连接,是不可靠协议。

         14,不需要建立连接,速度快。

    2TCP

         21,建立连接,形成传输数据通道。

         22,在连接中进行大数据量传输。

         23,通过三次握手完成连接,是可靠协议。

                 比如:第一次,你在吗?

                       第二次,我在。

                       第三次,好,我知道你在了。

                   就是确定双方以及双方都确定。但是每次传输都要建立连接比较消耗资源,这也就是保证数据的安全性,以及完整性所付出的代价。

         24,必须建立连接,效率会稍低。

    3,比如:聊天就是UDP形式的,网络视频会议,桌面共享等。因为数据并不重要。UDP相当于对讲机,比如,我在这里讲话,对方关着,我能讲,但对方收不到,于是我所讲话的数据就丢了。

       比如:下载就是用TCP形式,因为要保存数据,所以数据很重要。TCP相当于打电话。


六,网络编程(Socket)。通俗的说:就是两个同类型的应用程序的端口互联(最终还有低层比如网线来传输)。 

    1Socket就是为网络服务提供的一种机制。

    2,通信的两端都有Socket

    3,网络通信其实就是Socket间的通信。

    4,数据在两个Socket间通过io传输。

七,网络编程(UDP发送端)。

    1DatagramSocketDatagramPacket

    2,建立发送端,接收端。

    3,建立数据包。

    4,调用Socket的发送接收方法。

    5,关闭Socket

    6,发送端与接收端是两个独立的运行程序。

    7,主要是流程。

 需求:通过UDP传输方式,将一段文字数据发送出去。

         1,建立UDPSocket服务。

         2,提供数据,并将数据封装到数据包中。

         3,通过Socket服务的发送功能,将数据包发送出去。

         4,关闭资源。

         5DatagramSocket类里的方法:public void send(DatagramPacket p)   throws IOException从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、远程主机的 IP 地址和远程主机的端口号。 如果存在安全管理器,且套接字当前没有连接到远程地址,则此方法首先执行某些安全性检查。首先,如果 p.getAddress().isMulticastAddress() 为 true,则此方法以 p.getAddress() 作为参数调用安全管理器的 checkMulticast 方法。如果该表达式的值为 false,此方法改为调用安全管理器的以 p.getAddress().getHostAddress() 和 p.getPort() 为参数的 checkConnect 方法。如果不允许该操作,则每次调用安全管理器方法都会导致 SecurityException。 参数:p - 将要发送的 DatagramPacket


八,网络编程(TCP传输)。

    1SocketServerSocket

    2,建立客户端和服务器端。

    3,建立连接后,通过 Socket中的io流进行数据的传输。

    4,关闭socket

    5,同样,客户端与服务器端是两个独立的应用程序。

    6TCP的传输: 

       6,1,TCP分客户端和服务端。

       62,客户端对应的对象是Socket,服务端对应的对象是ServerSocket

    7,客户端:通过查阅Socket对象,发现在该对象建立时,就可以去连接指定的主机。因为TCP是面向连接的,所以在建立 Socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输。

    需求:给服务端发送一个文本数据。

    8,步骤:

          81public OutputStream getOutputStream()   throws IOException返回此套接字的输出流。 如果此套接字具有关联的通道,则得到的输出流会将其所有操作委托给通道。如果通道为非阻塞模式,则输出流的 write 操作将抛出 IllegalBlockingModeException。 关闭返回的 OutputStream 将关闭关联套接字。 返回:将字节写入此套接字的输出流。

          82public InputStream getInputStream()   throws IOException返回此套接字的输入流。 如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。如果通道为非阻塞模式,则输入流的 read 操作将抛出 IllegalBlockingModeException。 在非正常条件下,底层连接可能被远程主机或网络软件中断(例如,TCP 连接情况下的连接重置)。当网络软件检测到中断的连接时,将对返回的输入流应用以下操作: 网络软件可能丢弃经过套接字缓冲的字节。网络软件没有丢弃的字节可以使用 read 读取。 如果没有任何字节在套接字上缓冲,或者 read 已经消耗了所有缓冲的字节,则对 read 的所有后续调用都将抛出 IOException。 如果没有任何字节在套接字上缓冲,并且没有使用 close 关闭套接字,则 available 将返回 0。 关闭返回的 InputStream 将关闭关联套接字。返回:从此套接字读取字节的输入流。

     

需求:定义端点接收数据并打印在控制台上。

  9,步骤:

    91,建立服务端的Socket服务。ServerSocket。并监听一个端口。

    92,获取连接过来的客户端对象。通过ServerSocketaccept方法完成。没有连接就会等,这个方法是阻塞式的。public Socket accept() throws IOException侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。 创建新套接字 s,如果存在安全管理器,则使用 s.getInetAddress().getHostAddress() 和 s.getPort() 作为参数调用安全管理器的 checkAccept 方法,以确保允许该操作。这可能会导致 SecurityException 异常。 返回:新套接字 。

    93,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据,并打印在控制台。

    94public InetAddress getInetAddress()返回套接字连接的地址。 返回:此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null

    95,关闭服务端。(可选操作)。

 10,示例代码:

import java.net.*;
import java.io.*;
class TCPClient{//这个是客户端。
	public static void main(String args[])throws Exception{//91277655f215479
    		//1,创建客户端的Socket服务。指定目的主机和端口。
    		Socket s=new Socket("91277655f215479",10003);
    		//2,为了发送数据,应该获取Socket服务中的输出流。
    		OutputStream out=s.getOutputStream();
    		out.write("TCP come here.".getBytes());
    		s.close();//out不用关,因为s没了,out也就没有了。
	}
}
class TCPServer{
	public static void main(String args[])throws Exception{//这个是服务端,得先启动服务端。如果没启动服务端,则客户端是发不了数据的。
    		//1,建立一个服务端的Socket服务,并监听一个端口。
    		ServerSocket ss=new ServerSocket(10003);
                                 //2,通过ServerSocket的方法accept获取连接过来的客户端对象。下面开始监听10003端口。
    		Socket s=ss.accept();//服务端是没有流对象的。此方法是一个阻塞式方法。
    		String ip=s.getInetAddress().getHostAddress();//获取客户端的IP。
    		System.out.println(ip+"...connected.");
    		//3,获取客户端发送过来的数据,通过本服务端的客户端对象的读取流来读取数据。
    		InputStream in=s.getInputStream();//这个源是网络流。
    		byte buf[]=new byte[1024];
    		int len=in.read(buf);
    		System.out.println(new String(buf,0,len));
    		s.close();//关闭特定的客户端。
    		ss.close();//关闭服务端是可选操作。
	}
}

   11,示例代码2:

import java.net.*;
import java.io.*;

class TCPClient1 {// 建立客户端。
	public static void main(String args[]) throws Exception {// 91277655f215479是我自己的主机名。
		Socket s = new Socket("91277655f215479", 10008);
		OutputStream out = s.getOutputStream();
		out.write("服务端,你好!".getBytes());
		InputStream in = s.getInputStream();
		byte buf[] = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf, 0, len));
		s.close();// 关闭客户端资源。
	}
}

class TCPServer1 {// 建立服务端。注意,要先开服务端,否则会发生:ConnectException异常。
	public static void main(String args[]) throws Exception {
		ServerSocket ss = new ServerSocket(10008);// 监听10008端口。
		Socket s = ss.accept();
		String ip = s.getInetAddress().getHostAddress();// 获取客户端的IP地址。
		System.out.println(ip + "...connected.");
		InputStream in = s.getInputStream();
		byte buf[] = new byte[1024];
		int len = in.read(buf);
		System.out.println(new String(buf, 0, len));
		OutputStream out = s.getOutputStream();
		Thread.sleep(10000);// 停10秒。
		out.write("客户端,你好!".getBytes());
		s.close();
		ss.close();// 这个是可选操作,一般不要关闭。
	}
}

------- android培训java培训、期待与您交流! ----------

详情请查看:http://edu.csdn.net/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值