码迷,mamicode.com
首页 > 编程语言 > 详细

java--网络编程--黑马程序员

时间:2015-08-06 23:50:26      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

网络编程

主要内容:《 三要素、InetAddress类、UDP的发送方、UDP的接收方、TCP的发送端、TCP的接收端、反馈案例、客户端键盘录入服务器控制台输出 》

1.网络编程三要素

网络编程三要素:

1.IP:寄信的"地址"
2.端口:相当于"收信人"。在计算机上,可以同时有多个程序接收网络数据,每个程序都会占用至少一个端口;
3.协议:双方要都能看得懂;


一.IP:IP地址是计算机在互联网上,唯一标示此计算机的地址;
  1.所谓IP地址就是给每个连接在Internet上的主机分配的一个32bit地址。
  按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,比特换算成字节,
  就是4个字节。例如一个采用二进制形式的IP地址是:
  "11000000101010000000000101100100",这么长的地址,
  人们处理起来也太费劲了。为了方便人们的使用,IP地址经常被写成十进制的形式,
  中间使用符号“.”分开不同的字节。于是,上面的IP地址可以表示为“10.0.0.1”。
  IP地址的这种表示法叫做"点分十进制表示法",这显然比1和0容易记忆得多。

  192.168.0.1:(十进制):四段,每段的范围:0--255
  11000000.10101000.00000000.00000001:(二进制)

  内部使用二进制存储:
  最小值:00000000.00000000.00000000.00000000:0.0.0.0
  最大值:11111111.11111111.11111111.11111111:255.255.255.255(256 * 256 * 256 * 256)
2.B:IP地址的组成
  IP地址 = 网络号码 + 主机地址

    A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码:192.0.0.1 -- 192.255.255.255(256 * 256 * 256)
    B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码:192.168.0.1 -- 192.168.255.255(256 * 256)
    C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码:192.168.0.1 -- 192.168.0.255(256)

    作用:
    例如以下三个IP:
      1.192.168.0.1
      2.192.168.0.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可以互访;
        3.特殊地址:
          127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
           ping:在"命令提示符"下,可以使用ping命令测试网络连接;
            格式:
             >ping 192.168.0.30(IP地址)
             >ping www.baidu.com(域名)
        4.DOS命令 ipconfig:查看本机IP地址
        5. xxx.xxx.xxx.0 网络地址
          xxx.xxx.xxx.255 广播地址
        6.
          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.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
          C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
          D类 224.0.0.1---239.255.255.254
          E类 240.0.0.1---247.255.255.254

二.端口:
  1.物理端口:网卡口;
  2.逻辑端口:由操作系统定义并维护。Windows下,逻辑端口的范围:0 -- 65535

    我们讲的端口就是"逻辑端口":

  3.每个网络应用程序都至少占用1个逻辑端口,也可以同时占用多个;
  4.每个端口,同一时刻,只能被一个应用占用。
  5.有效端口:0~65535,其中0~1024系统使用或保留端口。

三.协议:
  1.网络传输协议:UDP,TCP,HTTP,FTP......
我们涉及到的:UDP协议,TCP协议:
  2.UDP:
    1).先将数据打包;
    2).不需要连接;可以没有接收方,发送方直接发送即可;
    3).由于不需要建立连接,不安全的,速度快;
    4).发送的数据大小有限制:64K
      类似于:广播、电视

  3.TCP:
    1).面向连接的;必须要有接收方;
    2).安全,速度慢--连接时,需要双方发送握手信息;
      类似于:打电话;

2.InetAddress类

InetAddress 类:此类表示互联网协议 (IP) 地址。

 要掌握的功能
  获取任意主机:InetAddress static getByName(String hostName):

  主机名:getHostName():
  主机Ip地址:getHostAddress()

 1 public class Demo {
 2     public static void main(String[] args) throws Exception {
 3         InetAddress add = InetAddress.getByName("Lenovo-PC");
 4         
 5         //获取主机名
 6         String hostName = add.getHostName();
 7         String ip = add.getHostAddress();
 8         System.out.println("计算机名:" + hostName + " IP : " + ip);
 9         
10     }
11 }

3.UDP的发送方


1.实例化一个Socket:DatagramSocket
2.准备数据:
   1).目标IP;
  2).目标端口;
  3).信息内容;
 3.封装数据报:DatagramPacket
 4.调用DatagramSocket的send()方法,发送:数据报

 1 public class Demo {
 2     public static void main(String[] args) throws IOException {
 3         // 1.实例化一个Socket:DatagramSocket
 4         DatagramSocket sendSocket = new DatagramSocket();
 5         // 2.准备数据:
 6         InetAddress ip = InetAddress.getByName("Lenovo-PC");
 7         int port = 8888;
 8         byte[] byteArray = "你好,这里是通过UDP发送的数据,请接收.....".getBytes();
 9         // 3.封装数据报:DatagramPacket
10         DatagramPacket packet = new DatagramPacket(byteArray, 
11                                     byteArray.length,
12                                     ip, port);
13         //4.发送数据
14         sendSocket.send(packet);
15         
16         //5.释放资源
17         sendSocket.close();
18         System.out.println("信息已发送!");
19 
20     }
21 }

4.UDP的接收方


 1.建立Socket对象:DatagramSocket(监听端口)
 2.建立一个空的byte[]数组,准备接收数据;
 3.使用byte[]数组建立一个空的DatagramPacket对象,用于获取连接;
 4.调用DatagramSocket的receive()等待信息;
 5.一旦有信息火来,receive()将会返回,并且将信息填充到数据报对象中;
 6.通过数据报对象获取信息;

 1 public class Demo {
 2     public static void main(String[] args) throws IOException {
 3         //1.建立Socket对象:DatagramSocket(监听端口)
 4         DatagramSocket socket = new DatagramSocket(8888);
 5         //2.建立一个空的byte[]数组,准备接收数据;
 6         byte[] byteArray = new byte[1024];
 7         //3.使用byte[]数组建立一个空的DatagramPacket对象,用于获取连接;
 8         DatagramPacket packet = new DatagramPacket(byteArray,byteArray.length);
 9         //4.调用DatagramSocket的receive()等待信息;
10         System.out.println("等待信息.....");
11         socket.receive(packet);//程序将在这里阻塞,等待信息,如果有信息来,此方法将返回,并将数据填充到packet中
12         System.out.println("有信息到达!");
13         //6.通过数据报对象获取信息;
14         //IP地址:
15         String ip = packet.getAddress().getHostAddress();
16         //信息:
17         byte[] infoArray = packet.getData();//获取信息内容
18         String str = new String(infoArray,0,packet.getLength());
19         System.out.println("接收方接收到信息:IP:" + ip + " 内容:" + str);
20         
21         //释放资源
22         socket.close();
23     }
24 }

5.TCP的发送端


 面向连接的,一定要有接收方存在

 步骤:

 1.实例化一个Socket:java.net.Socket
 构造方法:Socket(String host, int port)
 2.因为要发送,通过Socket对象获取一个输出流:
 3.通过输出流输出信息;
 4.释放资源;

 1 public class Send {
 2     public static void main(String[] args) throws IOException{
 3         //1.实例化一个Socket:java.net.Socket
 4         Socket socket = new Socket("192.168.38.91",8888);
 5         //2.因为要发送,通过Socket对象获取一个输出流:
 6         OutputStream out = socket.getOutputStream();
 7         //3.一次输出一个字节数组
 8         out.write("你好,这里是通过TCP发送的数据,你能收到吗?".getBytes());
 9         //4.释放资源
10         out.close();
11         socket.close();
12     }
13 }

6.TCP的接收端


 1.实例化Socket : ServerSocket(监听的端口)
 2.调用ServerSocket的accept()方法等待客户端连接;
 3.一旦有客户端连接,accept()方法会返回一个Socket对象,
   此Socket对象跟发送端的Socket对象是对应的;
 4.由于要接收数据,从此Socket中获取一个输入流:
 5.读取数据;
 6.释放资源

 1 public class Demo {
 2     public static void main(String[] args) throws IOException{
 3         //1.实例化Socket : ServerSocket(监听的端口)
 4         ServerSocket server = new ServerSocket(8888);
 5         //2.调用ServerSocket的accept()方法等待客户端连接;
 6         System.out.println("等待客户端连接......");
 7         Socket socket = server.accept();
 8         System.out.println("有客户端连接!");
 9         //3.获取输入流。因为要读取数据
10         InputStream in = socket.getInputStream();
11         //4.一次读取一个字节数组
12         byte[] byteArray = new byte[1024];
13         int len = in.read(byteArray);
14         String s = new String(byteArray,0,len);
15         System.out.println("服务端接收到数据:" + s);
16         //5.释放资源
17         in.close();
18         server.close();
19     }
20 }

7.服务器给客户端一个反馈案例

 1 import java.io.IOException;
 2 import java.io.InputStream;
 3 import java.io.OutputStream;
 4 import java.net.ServerSocket;
 5 import java.net.Socket;
 6 
 7 /*
 8  * 接收方:
 9  * 
10  * 一次接收:InputStream
11  * 一次发送:OutputStream
12  */
13 public class Receive {
14     public static void main(String[] args) throws IOException {
15         ServerSocket server = new ServerSocket(8888);
16         //等待连接
17         Socket socket = server.accept();
18         //获取输入流
19         InputStream in = socket.getInputStream();
20         //一次读取一个字节数组
21         byte[] byteArray = new byte[1024];
22         int len = in.read(byteArray);
23         String s = new String(byteArray,0,len);
24         System.out.println("接收端:接收到信息:" + s);
25         
26         //发送反馈
27         //获取输出流
28         OutputStream out = socket.getOutputStream();
29         //一次输出一个字节数组
30         out.write("收到".getBytes());
31         
32         //释放资源
33         out.close();
34         in.close();
35         server.close();
36         
37         
38     }
39 }
40 
41 import java.io.IOException;
42 import java.io.InputStream;
43 import java.io.OutputStream;
44 import java.net.Socket;
45 
46 /*
47   服务器给客户端一个反馈案例
48 49   发送方:
50 51   先发送: OutputStream
52   后接收: InputStream
53  */
54 public class Send {
55     public static void main(String[] args) throws IOException {
56         //1.实例化一个Socket
57         Socket socket = new Socket("192.168.38.91",8888);
58         //2.获取输出流
59         OutputStream out = socket.getOutputStream();
60         //3.发送数据
61         out.write("你好,这里是TCP发送的数据,请接收......".getBytes());
62         //4.等待服务器端反馈
63         //获取输入流
64         InputStream in = socket.getInputStream();
65         //一次读取一个字节数组
66         byte[] byteArray = new byte[1024];
67         int len = in.read(byteArray);
68         String s = new String(byteArray,0,len);
69         System.out.println("客户端:接收到反馈:" + s);
70         
71         //释放资源
72         in.close();
73         out.close();
74         socket.close();
75         
76     }
77 }

8.客户端键盘录入服务器控制台输出

接收端:
 1.实例化ServerSocket
 2.获取输入流;
 3.循环接收数据,直到接收到886结束;
 4.释放资源

 

发送方:
 1.建立Socket;
 2.获取输出流;
 3.循环获取控制台数据,并发送;
 4.如果输入886,结束;
 5.释放资源

 1 public class Receive {
 2     public static void main(String[] args) throws IOException {
 3         ServerSocket server = new ServerSocket(8888);
 4         System.out.println("等待连接......");
 5         Socket socket = server.accept();
 6         System.out.println("有客户端连接!");
 7         InputStream in = socket.getInputStream();
 8         byte[] byteArray = new byte[1024];
 9         int len = 0;
10         while(true){
11             len = in.read(byteArray);
12             String s = new String(byteArray,0,len);
13             System.out.println("接收到:" + s);
14             //判断886
15             if(s.equals("886")){
16                 System.out.println("发送端下线了,我也下线,拜拜......");
17                 break;
18             }
19         }
20         //释放资源
21         in.close();
22         socket.close();
23         server.close();
24         
25         
26     }
27 }
28 
29 public class Send {
30     public static void main(String[] args)  throws IOException{
31         Socket socket = new Socket("192.168.38.91",8888);
32         Scanner sc = new Scanner(System.in);
33         OutputStream out = socket.getOutputStream();
34         
35         while(true){
36             System.out.print("请输入发送的信息:");
37             String info = sc.next();
38             out.write(info.getBytes());
39             
40             if(info.equals("886")){
41                 break;
42             }
43         }
44         //释放资源
45         out.close();
46         socket.close();
47         System.out.println("客户端结束!");
48         
49     }
50 }

 

java--网络编程--黑马程序员

标签:

原文地址:http://www.cnblogs.com/linmusen/p/4709288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!