黑马程序员————JAVA之网络编程

来源:互联网 发布:便宜好用剃须刀知乎 编辑:程序博客网 时间:2024/05/19 05:34
------- http://www.itheima.com" target="blank">android培训http://www.itheima.com"target="blank">java培训、期待与您交流!
 
一、概述
1. 网络编程三要素:IP:计算机在互联网上的唯一的地址;端口;协议:
2. IP概念:
   所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
    按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,就是4个字节。
    例如一个采用二进制形式的IP地址是"11000000101010000000000101100100",这么长的地址,人们处理起来也太费劲了。
    为了方便人们的使用,IP地址经常被写成十进制的形式,中间使用符号"."分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。IP地址的这种表示法叫做"点分十进制表示法",这显然比1和0容易记忆得多。
    最小IP:00000000.00000000.00000000.00000000:十进制:0.0.0.0
    最大IP:11111111.11111111.11111111.11111111:十进制:255.255.255.255
3. IP地址的组成
    P地址 = 网络号码+主机地址
    A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码
    B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码
    C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码
4. 局域网内的电脑在什么情况下可以互相访问:在同一网段;
   怎么来区分同一网段:
   "子网掩码":
   例如:有如下IP:
1).192.168.1.10
        2).192.168.1.20
3).192.168.2.30
1.子网掩码:为:255.255.255.0(二进制:11111111.11111111.11111111.00000000)
注意:子网掩码中全部表示为1的作为"网络号码")
1和2可以互访;
2.子网掩码:255.255.0.0(二进制:11111111.11111111.00000000.00000000)
1和2和3都可以互访;
特殊地址:
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1   
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.0 网络地址
xxx.xxx.xxx.255 广播地址
A类1.0.0.1---127.255.255.254
    (1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址
    (2)127.X.X.X是保留地址,用做循环测试用的。
B类128.0.0.1---191.255.255.254172.16.0.0---172.31.255.255是私有地址。 169.254.X.X是保留地址。
C类192.0.0.1---223.255.255.254192.168.X.X是私有地址
D类224.0.0.1---239.255.255.254 
E类240.0.0.1---247.255.255.254
5. 端口:
1).物理端口:网卡口;
2).逻辑端口:由操作系统管理的,在一个"物理端口"的情况下,为了能同时运行多个"网络应用程序",这时操作系统提供了"逻辑端口";
A.我们讲的"端口"就是"逻辑端口";
B.逻辑端口的范围:0--65535;
C.一个应用程序可以同时占用多个端口;
D.一个端口,在某一时刻,只能由一个应用程序占用;
    E.0--1024:是由操作系统使用的,我们最好不要用;
6. 协议:
1).TCP,UDP,FTP,HTTP.......
2).UDP协议:
   1.面向无连接:类似于"广播","有线电视"
   2.数据需要打包发送;
   3.数据大小有限制:64K以内;
   4.因为无连接,所以属于不可靠的协议,但速度快;
3).TCP协议:
1.面向连接:类似于"打电话"
2.可以进行大量数据的传输;
3.由于需要连接,建立连接就要双方确认,所有速度慢;
二、通过代码演示讲解部分功能:
 
 1.InetAddress类的部分获取功能:
   
package com.isdf;import java.net.InetAddress;import java.net.UnknownHostException;/* * java.net.InetAddress(类):此类表示互联网协议(IP)地址。 * 获取任意主机:getByName(静态方法) * 机名:getHostName * 主机IP地址:getHostAddress */public class Demo_获取计算机IP {public static void main(String[] args) {InetAddress address;try {address = InetAddress.getByName("WIN-DEFRH7SB8J9");String hostName = address.getHostName();String ip = address.getHostAddress();System.out.println("计算机名"+hostName+"IP"+ip);} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

 2.关于网络发送信息与接收信息的小案例
  
 
 
  
package com.idj_TCPz;import java.io.IOException;import java.io.OutputStream;import java.net.Socket;public class Send {public static void main(String[] args) throws IOException {// 实例化一个Socket对象Socket sc = new Socket("192.168.30.156", 8888);// 通过Socket接收一个输出流OutputStream out = sc.getOutputStream();// 发送数据out.write("你好,呵呵".getBytes());// 释放资源out.close();sc.close();}}
 
 
 
 
package com.idj_TCPz;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class Receve {public static void main(String[] args) throws IOException {// 实例化一个ServerSocketServerSocket sever = new ServerSocket(8888);// 等待连接System.out.println("等待接收数据");Socket socket = sever.accept();// 获取输入流InputStream in = socket.getInputStream();// 读取信息byte[] byteArray = new byte[1024];int len = in.read(byteArray);String s = new String(byteArray, 0, len);System.out.println("接收到信息:" + s);// 释放资源in.close();sever.close();socket.close();}}
 
3.UDP协议发送数据:
  
package com.idj_UDP发送数据;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/* * UDP协议发送数据: *  * 1.实例化一个:DatagramSocket对象; * 2.准备数据: * 1).目标机器的IP:InetAddress对象; * 2).目标机器的端口号; * 3).信息内容:byte[]数组 * 3.准备数据包:DatagramPacket对象;需要封装:IP、端口、信息内容; * 4.发送数据:DatagramSocket对象的send(DatagramPacket p)方法, */public class Send {public static void main(String[] args) throws IOException {//实例化一个:DatagramSocket对象;DatagramSocket socket = new DatagramSocket();//准备数据InetAddress add = InetAddress.getByName("");int port = 255;byte[] byteArray = "哈哈,小逗比,在睡觉吗?".getBytes();//准备数据包DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length,add,port);//发送数据socket.send(pck);//释放资源socket.close();System.out.println("信息已发出!");}}
  
package com.idj_UDP发送数据;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;/* * UDP的接收端: * 1.构造一个DatagramSocket(端口号) * 2.准备一个空的byte[]数组,准备接收数据; * 3.准备一个空的数据包,DatagramPacket,用来接收数据; * 4.等待数据的到来,DatagramPacket的receive(DatagramPacket) *  如果数据到达,那么receive()方法将返回,并将数据封装到数据包对象中; * 5.从数据包中读取数据 */public class Receive {public static void main(String[] args) throws IOException {//构造一个DatagramSocket(端口号)DatagramSocket socket = new DatagramSocket(255);//准备一个空的byte[]数组,准备接收数据;byte[] byteArray = new byte[1024];//准备一个空的数据包,DatagramPacket,用来接收数据;DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length);//等待数据到达System.out.println("正在等待信息到达。。。");socket.receive(pck);//程序在此会阻塞System.out.println("有信息到达");//获取数据byte[] byteInfo = pck.getData();String str = new String(byteInfo,0,pck.getLength());String ip = pck.getAddress().getHostAddress();System.out.println("接收到信息:IP:"+ip+"内容"+str);socket.close();}}
 
 4.服务器端收发数据案例:
 
  
package com.idj_服务器端收发数据;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;public class Client {public static void main(String[] args) throws IOException{//实例化一个SocketSocket socket = new Socket("192.168.30.145",9900);//通过Socket获取一个输出流OutputStream out = socket.getOutputStream();//发送数据out.write("呵呵,来喽!加油!".getBytes());//等待反馈--获取一个输入流InputStream in = socket.getInputStream();//接收数据byte[] byteArray = new byte[1024];int len = in.read(byteArray);String str = new String(byteArray,0,len);System.out.println("发送端接收到反馈:"+str);//释放资源in.close();out.close();socket.close();System.out.println("客户端结束!");}}
 
  <pre class="java" name="code">package com.idj_服务器端收发数据;import java.io.IOException;import java.io.InputStream;import java.net.ServerSocket;import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//实例化一个ServerSocketServerSocket sever = new ServerSocket(9900);//等待连接Socket socket = sever.accept();//获取输入流InputStream in = socket.getInputStream();//定义一个字节数组byte[] byteArray = new byte[1024];int len = in.read(byteArray);}}


package com.idj_UDP发送数据;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;/* * UDP的接收端: * 1.构造一个DatagramSocket(端口号) * 2.准备一个空的byte[]数组,准备接收数据; * 3.准备一个空的数据包,DatagramPacket,用来接收数据; * 4.等待数据的到来,DatagramPacket的receive(DatagramPacket) *  如果数据到达,那么receive()方法将返回,并将数据封装到数据包对象中; * 5.从数据包中读取数据 */public class Receive {public static void main(String[] args) throws IOException {//构造一个DatagramSocket(端口号)DatagramSocket socket = new DatagramSocket(255);//准备一个空的byte[]数组,准备接收数据;byte[] byteArray = new byte[1024];//准备一个空的数据包,DatagramPacket,用来接收数据;DatagramPacket pck = new DatagramPacket(byteArray,byteArray.length);//等待数据到达System.out.println("正在等待信息到达。。。");socket.receive(pck);//程序在此会阻塞System.out.println("有信息到达");//获取数据byte[] byteInfo = pck.getData();String str = new String(byteInfo,0,pck.getLength());String ip = pck.getAddress().getHostAddress();System.out.println("接收到信息:IP:"+ip+"内容"+str);socket.close();}}


 

 

 


 
0 0
原创粉丝点击