刘意-java基础视频(API-网络编程)笔记

计算机网络:把具有独立功能的多台计算机连接起来,实现资源共享和信息传递
网络编程:实现网络互连的不同计算机上运行的程序间可以进行数据交换

网络模型:
     OSI参考模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层(比特)
     TCP/IP参考模型:应用层、传输层、网络层、主机至网络层

网络应用程序:网络编程,IO流,多线程组成 ,另外集合比他们更重要    

网络编程三要素:
        A:IP地址
        B:端口
        C:协议
IP地址:
         网络中计算机唯一的标识。

        计算机只能识别二进制的数据,所以我们的IP地址应该是一个二进制的数据。
        IP:192.168.1.100
        换算:11000000  10101000  00000001 01100100
        为了方便表示IP地址,我们就把IP地址得每一个字节上的数据换算成十进制,然后用“.”分开来表示:
             “ 点分十进制”
        
 IP地址的组成:网络号段+主机号段
            A类:第一号段为网络号段+后三段的主机号段
                     一个网络号:256*256*256 = 16777216
            B类:第二号段为网络号段+后二段的主机号段
                     一个网络号:256*256 = 65536
            C类:前三号段为网络号段+后一段的主机号段
                     一个网络号:256

 IP地址的分类:
               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
                  
         特殊地址:
               127.0.0.1 回环地址(回环地址),可用于测试本机的网络是否有问题。ping 127.0.0.1
          
          DOS命令  ipconfig:查看本机IP地址
      
           xxx.xxx.xxx.0 网络地址
           xxx.xxx.xxx.255 广播地址

           两个DOS命令:
                 ipconfig 查看本机ip地址
                 ping 后面跟ip地址。测试本机与指定的ip地址间的通信是否有问题

如果一个类没有构造方法:
             A:成员全部是静态的(Math,Arrays,Collections)
             B:单例设计模式(Runntime)
             C:类中有静态方法返回该类的对象(InetAddress)

class Demo{
                private Demo(){}
                    
            public static Demo getXxx(){
                      return new Demo();
                }           
           }

getByName 在给定主机名的情况下确定主机的ip地址 ,主机名可以是机器名,也可以是其IP地址的文本表示形式
看InetAddress的成员:public static InetAddress getAddress getByName(String host);根据主机名或者IP地址得字符串表示得到IP地址对象
 public String getHostName()        获取此IP地址得主机名
 public String getHostAddress()    返回IP地址字符串(以文本表现形式)

端口号:
            正在运行的程序的标识。
            有效端口:0~65535,其中0~1024系统使用或者保留端口(不建议使用)。

协议:
       通信的规则
        UDP:(不可靠协议)
               把数据打包
               数据有限制(限制64k)
               不建立连接
               速度快
               不可靠
        TCP:
                建立连接通道
                数据无限制
                速度慢
                可靠             
        举例:
             UDP:发短信
             TCP: 打电话 

              

Socket:网络套接字,此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点
Socket编程,网络编程:套接字编程

DatagramSocket此类表示用来发送和接收数据报包的套接字

Socket包含了:IP地址+端口

Socket原理机制:
              通信的两端都有Socket。
              网络通信其实就是Socket间的通信。
              数据在两个Socket间通过IO传输。

UDP协议发送数据:
             A:创建放送端Socket对象
             B:创建数据,并把数据打包
             A:调用Socket对象的发送方法放送数据包
             B:释放资源

DatagramPacket  此类套接字发送数据报包,包含的信息指示:将要发送的数据、其长度、远程主机的IP地址和远程主机的端口号

UDP协议接收数据
         A:创建接收端Socket对象
         B:创建一个数据包(接收容器)
         C:调用Socket对象的接收方法接收数据包
         D:解析数据,并显示在控制台
         E:释放资源


多次启动接收端:
        java.net.BindException: Address already in use: Cannot bind
       端口被占用或者第一次就被占用了,那是因为电脑上的软件占用了这个端口

创建接收端Socket对象

DatagramSocket(int port);

创建一个数据包(接收容器)

DatagramPacket(byte[] buf, int length)

调用Socket对象的接收方法接收数据

public void recevice(DatagramPacket p)

解析数据包,并显示在控制台,获取对方的ip

public  InetAddress getAddress()

获取数据缓冲区

public byte[] getData()

获取数据的实际长度

public int getLength()

数据来自于键盘录入
键盘录入数据要自己控制录入结束。

通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了

我们的网络程序其本质是由多线程、IO流加网络编程组成

TCP协议发送数据
      A:创建发送端的Socket对象
               这一步如果成功,就说明连接已经建立成功了
      B:获取输出流,写数据
      C:释放资源
      
创建发送端的Socket对象

Socket s = new Socket();

获取输出流,写数据

OutputStream os =s.getOutputStream();
os.write("".getBytes());

释放资源

s.close();

连接被拒绝。TCP协议一定要先开服务器
java.net.ConnectException: Connection refused: connect

TCP协议发送数据
      A:创建接收端的Socket对象
      B:监听客户端连接。返回一个对应的Socket对象
      C:获取输入流,读取数据显示在控制台
      D:释放资源

public class ServerSocket  此类实现服务器套接字。服务器套接字等待请求通过网络传入
                    它基于该请求执行某些操作,然后可能向请求者返回结果
public Socket accept()  侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞
getInetAddress()   返回套接字连接的地址

创建收端的Socket对象

ServerSocket ss = new ServerSocket();

监听客户端连接。返回一个对应的Socket对象

Socket s= ss.accept();

获取输入流,读取数据显示在控制台,显示IP

InputStream is= s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys,0,len);
String ip = s.getInetAddress().getHostAddress();
System.out.println(ip+":"str);

释放资源

s.close();

服务器和客户端相比,服务器先存在

1、创建服务器Socket对象

ServerSocket ss = new ServerSocket();

监听客户端的连接

Socket s= ss.accept();  // 阻塞

获取输入流

InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);   // 阻塞
String server = new String(bys, 0, len);
System.out.println("server:"+server);

获取输出流

OuptputStream os = s.getOutputStream();
os.write("".getBytes());

释放资源

s.close();

2、创建客户端Socket对象

ClientSocket ss = new ClientSocket();

监听客户端的连接

Socket s= ss.accept();  

获取输出流

OutputStream os = s.getOuptStream();
os.write("".getBytes());

获取输入流

InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);   // 阻塞
String client = new String(bys, 0, len);
System.out.println("client:"+client);

释放资源

s.close();

参考网站:
https://www.bilibili.com/video/av37614313?p=728

发布了32 篇原创文章 · 获赞 11 · 访问量 6180

猜你喜欢

转载自blog.csdn.net/Cai1010110/article/details/103925720