黑马程序员_网络编程

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


1、 网络编程的三要素:IP地址:InetAddress、端口号、传输协议
        要实现网络通讯:
        1. 找到对方 IP
        2. 数据要发送到对方指定的应用程序上。为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,叫做端口。指的是逻辑端口
        3. 定义通讯规则,这个规则称为协议。

        国际组织了通用协议TCP/IP。

2、 IP地址:InetAddress
        四段组成,每一段都是一个字节,一个字节取值范围0~255
        新段地址IP/V6,6段组成
        本地回环地址:127.0.0.1  主机名:localhost

3、 端口号
        用于标识进程的逻辑地址,不同进程的标识
        有效端口:0~65535,其中0~1024系统使用或保留端口
        常见端口:Web服务:80、 Tomcat:8080、 mySQL:3306


4、 网络模型两种:
        1. OSI OpenSystem Interconnection 开放系统互联参考模型
        2. TCP/IP参考模型
        3、 常见协议:UDP、TCP

        a. UDP特点:面向无连接
            将数据及源和目的封装成数据包中,不需要建立连接
            每个数据报的大小在限制在64k内
            因无连接,是不可靠协议
            不需要建立连接,速度快
        b. TCP特点:面向谅解可靠的,建立连接传输大量数据
            建立连接,形成传输数据的通道。
            在连接中进行大数据量传输
            通过三次握手完成连接,是可靠协议
            必须建立连接,效率会稍低

5、 InetAddress:表示互联网协议的IP地址

	//演示获取IP实例
	public class IPDemo {
		public static void main(String[] args) throws IOException {
			//获取本机地址
			InetAddress ip=InetAddress.getLocalHost();
			//打印地址
			System.out.println(ip);//ThinkPad/169.254.124.183
			//获取地址
			System.out.println("address:"+ip.getHostAddress());//address:169.254.124.183
			//获取主机名
			System.out.println("name:"+ip.getHostName());//name:ThinkPad
			
			//获取任意一台主机地址
			InetAddress ia=InetAddress.getByName("169.254.124.183");
			
			System.out.println("ia:"+ia.getHostAddress());//ia:169.254.124.183
			System.out.println("ia:"+ia.getHostName());//ia:ThinkPad
		}
	}
6、 Socket:网络编程指的就是Socket编程
        Socket就是为网络服务提供的一种机制。
        通信的两端都有Socket。
        网络通信其实就是Socket间的通信。
        
数据在两个Socket间通过IO传输。

7、 UDP传输
        DatagramSocket与DatagramPacket
        建立发送端,接收端。
        建立数据包。
        调用Socket的发送接收方法。
        关闭Socket。

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

        a. 在发送端,要在数据包对象中明确目的地IP及端口。

        DatagramSocket ds = new DatagramSocket();
        byte[] by = “hello,udp”.getBytes();
        DatagramPacket dp = new DatagramPacket(by,0,by.length,
                    InetAddress.getByName(“127.0.0.1”),10000);
        ds.send(dp);
        ds.close();
	演示实例:
	public class UDPDemo {

		public static void main(String[] args) throws IOException {

			// 创建udp服务,通过DatagramSocket()对象。
			DatagramSocket ds = new DatagramSocket();

			// 确定数据,并封装成数据包。
			byte[] buf = "udp ge men lai le !".getBytes();
			DatagramPacket dp = new DatagramPacket(buf, buf.length,
					InetAddress.getByName("127.0.0.1"), 10000);
			// 通过socket服务,将已有的数据包发送出去,通过send方法。
			ds.send(dp);

			// 关闭资源
			ds.close();
		}
	}
        b. 在接收端,要指定监听的端口。

        DatagramSocket ds = new DatagramSocket(10000);
        byte[] by = new byte[1024];
        DatagramPacket dp = new DatagramPacket(by,by.length);
        ds.receive(dp);
        String str = new String(dp.getData(),0,dp.getLength());
        System.out.println(str+"--"+dp.getAddress());
        ds.close();
	演示实例:
	public class UDPServerDemo {

		public static void main(String[] args) throws IOException {
			// 创建udp Socket,建立连接
			DatagramSocket ds = new DatagramSocket(10000);

			// 定义数据包,用于存储数据
			byte[] buf = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf, buf.length);

			// 通过服务的receive方法将接收到的数据存入到数据包中
			ds.receive(dp);

			// 通过数据包的方法获取其中的数据
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(), 0, dp.getLength());
			int port = dp.getPort();

			System.out.println(ip + "::" + data + "::" + port);
			
			//关闭资源
			ds.close();
		}
	}
8、 TCP传输:
        Socket和ServerSocket
        建立客户端和服务器端
        建立连接后,通过Socket中的IO流进行数据的传输
        关闭socket
        同样,客户端与服务器端是两个独立的应用程序。

        客户端基本思路:
        a. 客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
        b. 连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(),getOutputStream()获取即可。
        c. 与服务端通讯结束后,关闭Socket。

        通过Socket建立对象并指定要连接的服务端主机以及端口。
        Socket s = new Socket(“192.168.1.1”,9999);
        OutputStream out = s.getOutputStream();
        out.write(“hello”.getBytes());
        s.close();
	客户端演示:
	public class ClientDemo {

		public static void main(String[] args) throws IOException, IOException {
			
			//创建客户端的Socket服务,指定目的的主机和端口
			Socket s=new Socket("127.0.0.1",100001);
			
			//为了发送数据,应该获取socket流中的输出流
			OutputStream out =s.getOutputStream();
			out.write("TCP哥们来了".getBytes());
			
			//关闭资源
			s.close();
		}
	}
        服务端基本思路:
        a. 服务端需要明确它要处理的数据是从哪个端口进入的。
        b. 当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
        c. 当该客户端访问结束,关闭该客户端。

        建立服务端需要监听一个端口
        ServerSocket ss = new ServerSocket(9999);
        Socket s = ss.accept ();
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int num = in.read(buf);
        String str = new String(buf,0,num);
        System.out.println(s.getInetAddress().toString()+”:”+str);
        s.close();
        ss.close();
        服务端演示:

        Tcp传输最容易出现的问题:
        客户端连接上服务端,两端都在等待,没有任何数据传输。
        通过例程分析:
            因为read方法或者readLine方法是阻塞式。
        解决办法:
            自定义结束标记
            使用shutdownInput,shutdownOutput方法。

9、常见的客户端和服务端

        客户端:浏览器、QQ ...

        服务端:Tomcat ...

        http 超文本传输协议

10、URL对象,把地址封装成对象,便于对地址操作
        urlConnection  安卓开发方面用的比较多
	public class URLDemo {

		public static void main(String[] args) throws MalformedURLException {
			URL url = new URL(
					"http://127.0.0.1:8080/myweb/demo.html?name=li&age=23");
			
			System.out.println(url.getProtocol());// http
			System.out.println(url.getHost());// 127.0.0.1
			System.out.println(url.getPort());// 8080
			System.out.println(url.getPath());// /myweb/demo.html
			System.out.println(url.getFile());// /myweb/demo.html?name=li&age=23
			System.out.println(url.getQuery());// name=li&age=23

			URLConnection conn=url.openConnection();
			System.out.println(conn);//sun.net.www.protocol.http.HttpURLConnection:http://127.0.0.1:8080/myweb/demo.html?name=li&age=23
			
			InputStream in=conn.getInputStream();
			byte[]buf=new byte[1024];
			int len=in.read(buf);
			System.out.println(new String(buf,0,len));
		}
	}
11、 http://192.168.1.254:8080/myweb/demo.html
        www.baidu.com想要将主机名翻译成ip地址,需要域名解析。DNS
        域名解析服务器:里面记录的是主机名与ip地址的映射关系。

        http://127.0.0.1:8080
        http://localhost:8080
        其实127和localhost的映射关系就在本机上。
        C:\Windows\System32\drivers\etc\host

12、CS client server
        特点:
        1. 客户端和服务端都需要开发
        2. 后期维护较为麻烦
        3. 将服务端的部分运算转到了客户端。

13、BS Browser Server
        特点:
        1. 程序员只需要编写服务端
        2. 对客户端的维护很容易。客户端什么都不需要装,只需要有浏览器即可。
        3.所有的运算都在服务端,压力较大。


---------------------- android培训 、 java培训 、 期待与您交流! ----------------------
详细请查看:www.itheima.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值