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

------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 }
时间: 2024-12-19 07:52:57

java--网络编程--黑马程序员的相关文章

Java网络编程TCP程序,服务器和客户机交互流程以及基本操作步骤。

1.什么是网络编程 网络编程其实就是实现两个计算机的数据交换(交互). 可以通过直接或间接的通过网络协议与其他的计算机进行通讯.(HTTP协议,TCP/IP协议等) 2.Tcp网络编程的实现流程 主要分为服务器端(Server)和客户端(Client). 通过这个图我们其实就可以了解了实现服务器和客户机交互过程是怎么样的了. 实现这些原理最重要的是Socket类也叫做套接字.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 服务器端 1.首先创建ServerSocket对象并

Java网络编程基础【转】

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

【转】JAVA网络编程基础

转来自己学习用 转自http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电

java网络编程入门教程

网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编程是比较复杂的系统工程,需要了解很多和网络相关的基础知识,其实这些都不是很必需的.首先来问一个问题:你 会打手机吗?很多人可能说肯定会啊,不就是按按电话号码,拨打电话嘛,很简单的事情啊!其实初学者如果入门网络编程的话也可以做到这么简单! 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.

黑马程序员——网络编程篇

------- android培训.java培训.期待与您交流! ---------- 概述   1.网络模型        (1).OSI参考模型        (2).TCP/IP参考模型   2.网络通讯要素         (1).IP地址        (2).端口号         (3).传输协议    3.过程        1,找到对方IP. 2,数据要发送到对方指定的应用程序上.为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识. 为了方便称呼这个数据,叫做端口(逻

黑马程序员——Java网络编程之UDP传输

网络编程 网络模型 通讯要素:InetAddress(对象):ip地址,网络中设备的标识,不可记忆,可用主机名,本地回环地址:127.0.0.1主机名localhost 端口号 传输协议:UDP,将数据的源及目的封装成数据包中,不需要建立连接,每个数据包的大小限制在64K内,无连接,是不可靠协议,不需要建立连接,速度快.力求速度,不求数据的准确性.比如聊天软件,网络会议. TCP:建立连接,形成传输数据的通道,在连接中进行大数据量传输,通过三次握手完成连接,是可靠协议,必须建立连接效率稍低. S

黑马程序员__GUI_网络编程

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- GUI 1.事件处理就是处理用户的一个操作这个事件,在事件发生的时候程序应做出什么反应.当事件发生在哪个组件上, 哪个组件就可以说是事件源.给事件源添加一个监听器对象,监听器对象中包含若干事件处理方法.如果事件发生了, 事件处理方法就会自

黑马程序员_JAVA UDP网络编程学习笔记

一.UDP网络编程概述 采用TCP协议通信时,客户端的Socket必须先与服务器建立连接,连接建立成功后,服务器端也会持有客户端连接的Socket,客户端的Socket与服务器端的Socket是对应的,它们构成了两个端点之间的虚拟通信链路.与TCP通信不同,UDP是面向无连接的.不可靠的基于数据包的传输协议.即应用进程(或程序)在使用UDP协议之前,不必先建立连接.自然,发送数据结束时也没有连接需要释放.因此,减少了开销和发送数据之前的延时.UDP也采用端口来区分进程. 在java中,java.

黑马程序员 网络编程 UDP与TCP

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ----------------------/* 网络编程分为两种模式:TCP和UDP 连接互联网的计算机以亿计,为了唯一的标识出每台电脑,互联网就给每台电脑分配一个 唯一独立的ip地址,通过这个ip地址就可以进行计算机之间的数据交换 我们计算机交换的数据功能我们在java中把它封住成一个叫Socket的类, 简称套接字, 端口号:计算机数据的交换一般都是电脑上的程序来维护的,而电脑上又运