网络编程基础、网络通讯三要素、TCP通讯、Socket类

网络编程基础

软件架构:
  • C/S架构: 即Client/Server(客户端/服务器端)架构,QQ、迅雷。java

  • B/S架构: 即Browser/Server(浏览器端/服务器端)架构,简化了系统的开发,维护和使用。谷歌、火狐。数据库

B/S架构与C/S架构的区别:编程

  • C/S架构基于局域网的,而B/S架构基于广域网的基础上。浏览器

  • 硬件环境不一样,C/S创建在专用网络上,小范围的网络,能够专门的服务器提供数据链接和数据交换安全

  • C/S通常面向的固定用户群体,对信息的安全控制较高较高一点。服务器

  • 对程序架构不一样网络

  • 用户接口不一样:C/S架构大多创建在Windows平台上,B/S创建在浏览器上,不只能够应用在Windows平台上,也能够应用在Unix/Linux等平台上。多线程

两种架构各有优劣,可是不管使用哪一种架构,都离不开网络的支持。网络编程,就是在必定的协议下,实现两台计算机通讯的程序。架构

网络通讯协议

  • 网络通讯协议:通讯协议是计算机通讯必须听从的一种规则,协议中对数据的传输格式、传输的速率、传输的步骤等都作了统一的规定,通讯双方必须同时遵照,最终实现数据的正常传输和交换。dom

  • TCP/IP:传输控制协议(TCP)/因特网互联协议(IP),他们俩定义了计算机如何联网、数据如何交换和传输的标准。它的内部包含了一系列用于处理数据通讯的协议,并采用了4层的分层模型,每一层都呼叫下一层所提供的协议来完成本身的请求。

协议分类

  • TCP协议:传输控制协议,该协议是面向链接的通讯协议,即数据传输前,在发送端和接收端先创建逻辑链接,而后再传输数据,它提供了两台计算机之间可靠的无差错的数据传输。

    • 三次握手:在数据发送的准备阶段,客户端和服务器之间经过三次交互,保证链接的可靠性。

      三次握手:

经过三次握手,创建链接后,客户端和服务器端就能够进行数据传输了。因为这种面相链接的特性,TCP协议可以数据传输的安全。因此应用挺普遍的,下载文件等。

  • ​ UDP:用户数据报协议(User DataProgram Protocal),他是一个面相无链接的协议。在进行数据传输时,不须要创建链接。无论对方在不在,直接将数据、数据源和目的地封装到数据包中,发送过去。每次发送的数据不能很大,限制在64K之内,数据有可能丢失,数据传输时不安全,速度快,QQ聊天

网络编程三要素【了解】

  • 协议:计算机通讯必须遵照的规则。

  • IP地址:互联网协议地址,俗称IP,IP地址用来给网络中的计算机编订一个惟一的编号。

  • 端口号:端口号就是惟一标识设备中的进程(应用程序)。IP地址是惟一标识网络中的设备。

  • IP地址:互联网协议地址(Internet Protocol Address) ,俗称IP,给网络中的计算机设备编订一个惟一的编号,比如人的身份证号。

    IP地址分类:

    • IPv4:是一个32位的二进制数,一般被分为4个字节,表示形式:a.b.c.d ,例如:192.168.53.245 ,其中a.b.c.d都是一个0~255之间的十进制的整数,那么最多可以表示42亿个。

    • IPv6:为了扩大地址空间,经过IPv6从新定义地址空间,采用128位地址长度,每16个字节分为一组,分红8组十六进制数 ,表示形式:ABCD:EF01:2345:6789:ABCD:EF01:2345:6789,号称互联网中的任何一粒沙子可以编写进去,解决了地址不够的问题。

  经过DOS命名查看本机的IP地址:ipconfig

  检查网络链接是否正常:ping ip地址

特殊的IP地址:

  本机的IP地址:127.0.0.1 localhost 经过hosts文件,能够自定义本身的域名

  • 端口号:如何区分在网络通讯中打开的这些进程(应用程序)?经过端口号能够准确的找到彼此。

  • 端口号:用两个字节表示的整数,它的取值范围是0~65535。 其中,0~1023之间的的端口号被一些知名的应用和网络服务占用了。普通的常规的应用程序只能使用从1024以上的端口号, 若是端口号被另一个服务或者应用程序占用了,会致使当前程序启动失败。

  经常使用的端口号:

   Tomcat应用服务器:8080

   HTTP服务器:80 www.baidu.com:80 80端口能够选择省略不写

   数据库服务器:MYSQL:3306 Oracle:1521

TCP通讯

目的:实现两台计算机之间的交互,通讯两端要严格区分客户端和服务器端口

两端通讯的步骤:

  1. 服务端须要启动,等待客户端连接

  2. 客户端须要主动地连接服务器端,连接成功才能通讯,服务器端口不能够主动连接客户端

在java中,提供两个类,实现TCP通讯:

  • 客户端:建立Socket对象,建立以后就至关于建立了客户端,向服务器端发送连接请求,服务器端回响一个请求表示已经接受,二者就创建了通讯

  • 服务器端:建立ServerSocket对象,建立以后就至关于,开启了一个服务,等待客户端连接

Socket类

Socket类,实现客户端套接字,套接字指的是两台设备之间通信的端点,

构造方法:

public Socket(String host,int port);--->建立套接字对象并链接到指定主机的指定端口号,若是指定了host是一个null,那么就至关于与指定地址为回送地址【127.x.x.x】,是本机的回送地址,主要用于网络软件测试使用,本机上进程间的通讯。就不会进行网络传输

成员方法:

  • public InputStream getInputStream();---->获取套接字的输入流

  • public OutputStream getOutputStream();--->获取套接字输出流

  • public void close();--->关闭套接字

  • public void shoutdownOutput();--->禁用套接字输出流

  • 任何先前写入的数据都将会被发送,最后终止输出流

ServerSocket类

ServerSocket类实现了服务器端套接字,该对象等待经过网络的请求

构造方法:

ServerSocket(int port);--->使用该构造方法子建立ServerSocket建立对象时,就能够将其绑定到一个指定的端口号上面,参数port就是端口号

成员方法:

public Socket accept();--->监听并接受链接,返回一个新的Socket对象,用于和用户端实现通讯。

文件上传案例:

步骤:

  1. 在客户端当中,经过输入流,从硬盘当中读取文件数据到内存

  2. 在客户端当中,经过输出流,写入文件数据到服务器端

  3. 在服务器端中,经过输入流,读取文件数据到服务器端中

  4. 在服务器端中,经过输出流,写入文件数据到服务器硬盘当中

文件上传图解:

文件上传优化

文件的名称须要优化

服务端,保存文件的名称若是名称固定,那么最终会致使服务器硬盘,只会保留一个文件,对上传的文件名称优化,

//文件名称定义规则:
"beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg";
服务器端接收文件的优化

服务器端,接收一个文件以后就关闭了,后面的其余客户端没法继续上传文件,使用循环进行改进,能够不断的接收不一样的客户端传输过来的文件。

// 使用循环
while(true) {
   Socket socket =  serverSocket.accept(); 
   ....
   ....       
}
服务器端接收客户端文件的效率的优化

服务器端,在接收文件的时候,加入某个客户端给你传输一个大文件,此时就不能再接收其余用户的文件,因此能够用多线程技术优化接收效率。

while(true) {
      Socket socket = serverSocket.accept();
      // 使用多线程技术,提升程序的效率
      // 有一个客户端上传文件,就开启一个线程,完成文件的上传
     new Thread(new Runnable() {
         // 重写run方法,设定线程的任务
         @Override
         public void run() {
             // 使用网络字节输入流对象
            InputStream is =  socket.getInputStream();
            // 指定一个目录
           File file =  new File("D:\\upload");
             if(!file.exits()) {
                 file.mkdirs();
             }
             // 防止同名的文件被覆盖
         String filename =  "beautiful" + System.currentTimeMillis() + new Random().nextInt(1000000) + ".jpg";  
           // 构建一个本地的文件字节输出流对象
             new FileOutputStream(file + "\\" + filename);
           // 一读一写完成文件的上传,最终把文件写入到服务器端的硬盘当中。  
          .....  
         }
     }).start();
}
// 服务端不关闭
// serverSocket.close();
相关文章
相关标签/搜索