黑马程序员—网络编程

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

1.数据通信步骤:
(1).找到对象IP
(2).数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识。这些数字称作端口。
(3).定义通信规则。这个通讯规则称作协议。

2.通信三要素:
IP地址、端口号、传输协议

3.Socket
(1).就是为网络服务提供一种机制。
(2).通信的两端都有socket,网络通信其实就是Socket间的通信
(3).数据在两个Socket间通过IO传输

4.TCP和UDP协议
(1).TCP协议:
a.建立连接,形成传输数据的通道
b.在连接中进行大数据的传输
c.通过三次握手完成连接
d.必须建立连接,效率会稍低

(2).UDP协议:
a.将数据及源和目的封装成数据包中,不需要建立连接
b.每个数据包的大小限制在64k内
c.因无连接,是不可靠协议
d.不需要建立连接,速度快

5.UDP传输
(1).怎样通过UDP方式,将一段文字数据发送出去?
思路:
a.建立udpsocket服务
b.提供数据,并将数据封装到数据包中
c.通过socket服务的发送功能,将数据包发送出去
d.关闭资源
示例:
                    //创建UDP服务
           DatagramSocket dgs =  new  DatagramSocket();
             //确定数据,封装到数据包中
           String str =  "sdfswef" ;
            byte [] b = str.getBytes();
           DatagramPacket drp =  new  DatagramPacket(b, b.  length InetAddress. getLocalHost (), 4000);
            //发送数据包
           dgs.send(drp);
            //关闭服务
           dgs.close();

(2).定义一个udp服务,用于接收udp协议传输的数据并处理?
思路:
a.定义udpsocket服务。通常会监听一个端口,其实就是给这些接收网络应用程序定义数字标识。方便于明确哪些数据过来该应用程序可以处理。
b.定义一个数据包,因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
c.通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
d.通过数据包对象的特有功能,将这些不同的数据提取,并且打印。
f.关闭服务。
示例:
            //创建 udp服务,建立端点
           DatagramSocket ds =  new  DatagramSocket(10000);
             //定义数据包,用于存储数据
            byte [] b =  new  byte [1024];
           DatagramPacket dp =  new  DatagramPacket(b, b.  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();

6.TCP传输
(1).
a.tcp分客户端和服务端
b.客户端对应的对象是Socket,服务端对应的对象是ServerSocket

(2).客户端:
a.在Socket对象建立时,就可以去连接指定主机。因为tcp是面向连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功。形成通路后,在该通道进行数据的传输。
b.示例:
                  //创建客户端的socket服务,指定目的主机和端口
           Socket s =  new  Socket(InetAddress. getLocalHost(), 10001);
            //为了发送数据,应该获取socket流中的输出流
           OutputStream os = s.getOutputStream();
           String str =  "dsfsd" ;
           os.write(str.getBytes());
           s.close();

(3).服务端:
a.建立服务端的socket服务,ServerSocket()。并监听一个端口
b.获取连接过来的客户端对象。通过ServerSocket的accept()方法来获取。这个方式是阻塞式的。
c.客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流,来读取发过来的数据,并打印在控制台。
d.关闭服务端(可选)。
示例:
                    //创建服务端的socket服务,并且指定接收的端口号
           ServerSocket ss =  new  ServerSocket(10001);  
             //产生对应的客户端
           Socket s = ss.accept();
           String ip = s.getInetAddress().getHostAddress();
           System.  out .println(ip);
           InputStream is = s.getInputStream();
            int  c = 0;
            byte [] b =  new  byte [1024];
            while ((c=is.read(b)) != -1)
               System.  out .println(  new  String(b, 0, c));
           s.close();

(4).问题:客户端和服务端都在等待,程序执行失败。
因为客户端和服务端都有阻塞式方法。这些方法没有读到结束标记,那么就一直等着导致两端都在等待。

总结:
1.readLine()方法是阻塞式的方法,必须读到回车符的时候才会返回数据。如果用于循环的条件下,那么会一直在那里等待读取数据。如果是进行键盘录入的操作,并且用缓冲区来做的话,要在传输数据的那个类中调用newLine()方法。
2.利用缓冲区来读取数据时,一定要进行刷新动作,即调用flush()方法。
3.之所以结束客户端的时候,服务端也会结束。是因为在客户端调用close()方法的时候,在Socket流中加了-1结束标记,而服务端的readLine()方法由于底层调用的是read()方法,当read()结束的时候,readLine()也就结束了。
4.shutdownOutput():Socket类中的方法,用于结束套接字当中的输出流。shutdownInput()方法也是如此。

7.域名解析
(1).如果要将主机名翻译成IP地址,需要域名解析-DNS。
(2).浏览器访问网址流程:
     当输入主机名时,先在本地寻找映射关系,本地的映射关系文件在:C:\Windows\System32\drivers\etc(win7系统下)。当发现在本地上没有对应的映射时,就到公网的DNS服务器上去寻找映射文件。找到了对应的IP地址时,返回IP地址。然后浏览器再通过IP地址访问网站。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值