黑马程序员_java 网络编程

  网络编程同样是java中非常重要的一门技术 ,所谓网络编程就是两个或多个设备之间的数据交换,其实更具体的说,网络编程就是两个或多个程序之间的数据交换,和普通的单机程序相比,网络程序最大的不同就是需要交换数据的程序运行在不同的计算机上,这样就造成了数据交换的复杂。如果需要进行网络编程,则还需要了解网络通讯的过程。网络通讯基于“请求-响应”模型,所谓“请求-响应”模型可以理解为一问一答模式。
  在网络通讯中,想要进行数据传输就要先找到对方的IP(ip地址的每个段取值为0-255)地址,然后项数据发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,叫做端口(逻辑端口)。在这里的端口并不是计算机外面的硬件接口,而是应用程序与外界交流的出入口,它是一种抽象的软件结构。同时在数据传输是,计算机之间相互定义了通讯规则,这个通讯规则称之为协议,国际组织定义了通用的通讯规则TCP/IP。

  在网络编程中存在两种网络模型,分别为:OSI参考模型和TCP/IP参考模型。OSI参考模型:国际标准化组织ISO于l978年提出“开放系统互连参考模型”,该模型把计算机网络分成物理层、数据链路层、网络层、传输层、会话层、表示层、应用层等七层。TCP/IP参考模型:后期出现的更简单的模型,它是OSI的简化版,它将OSI参考模型中的应用层表示层和会话层封装为应用层,将数据链路层与物理层封装为主机至网络层。两种参考模型关系如下:




  其中的常见的传输协议有两种:UDP和TCP
  
  UDP:1.将数据及源和目的封装成数据包中,不需要建立连接。
2.每个数据报包的大小在限制在64k内。
3.因无连接,是不可靠的协议。
4.不需要建立连接,速度快。
应用:传输视频,桌面共享,聊天 等 追求速度 的情况下用 UDP。
  TCP:1.建立连接,形成传输数据的通道。
2.在连接中进行大数据传输。
3.通过三次握手完成连接,是可靠协议。
4.因为必须建立连接,所以效率会稍低。
主要用于数据下载,文件传输,可靠性要求高的应用

在网络编程中有一个十分重要的概念:Socket。所谓的网络编程其实指的就是Socket编程。Socket就是为网络服务提供的一种机制,通信的两端都有Socket时,网络通信就是Socket间的通信,数据在两个Socket之间通过IO传输。Socket可以使用UDP和TCP这两种协议建立端口。Socket网络变成主要是编写服务端和客户端,其基本步骤如下:

服务端编写步骤:
    1. 利用ServerSocket建立对服务端某个端口的监听;

       如: ServerSocket serverSocket = new ServerSocket(8000);

    2. 利用accept方法创建服务端Socket;

       如: Socket socket = serverSocket.accept();

    3. 利用建立的Socket创建输入输出流;

       如: BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));

           PrintStream ps = new PrintStream(socket.getOutputStream(), true);

    4. 关闭输出流、关闭Socket、关闭ServerSocket;
       如: br.close();

           ps.close();

           socket.close();

           serverSocket.close();

客户端编写步骤:

    1. 创建客户端Socket向服务端发起的连接请求;

       如: Socket socket = new Socket("127.0.0.1", 8000);

    2. 利用已建立的Socket创建输出流;

       如: BufferedReader br = new BufferedReader( new InputSreamReader(socket.getInputStream()));

           PrintWriter pw = new PrintWriter(socket.getOutputStream(), true);

    3. 关闭输出流、关闭socket;

       如: br.close();

           pw.close();

           socket.close();

示例:客户端通过键盘录入用户名,服务端对这个用户名进行校检。如果该用户存在,在服务端显示xxx,已登录。并在客户端显示xxx,欢迎光临。如果该用户名不存在,在服务端显示xxx,尝试登陆。并在客户端显示xxx,该用户名不存在。最多登陆三次


import java.io.*;
import java.net.*;


class LoqinClient                   
{
  public static void main (string[] args)      thros Exception          //客户端
  {
    Sock s = new Socket("192.168.1.254",10008);

    BufferedReader bufr =

           new BufferedReader(new InputStreamReader(System.in));

    PrintWriter out = new PrintWriter(s.getoutputStream(),true);

    BufferedReader bufIn =
            new BufferedReader(new InputStreamReader(s.getStream());

      for(int x=0;x<3;x++)

      {
          String line = bufr.readerLine();

        if(line==ull)

              break;

          out.printlin(line);

        String info =bufIn.readerLine();

          System.out.print("info:"+info);

          if(info.contains("欢迎"))

                break;
      }
       bufr.close();

       s.close();

  }
}
 
class UserThread      implement Runable                                          //每个客户端线程代码 
{
  private  Socket s;

  UserThread(Socket s)

  {
    this s = s;
  }

  public viod run()

  { 
    String ip = s.getInetAddress().getHostAddress();

    System.out.println(ip+"....connected");

    try        
    {
      for(int x=0;x<3;x++)                                                        //只校验三次
      {
         BufferedReader  bufIn = 
             new BufferedReader(new InputStreamReader(s.getInputStream()));

         BufferedReader bufr =new  BufferedReader(new(FileReader("xxx.txt")))     //读取已注册的用户名

          PrintWriter out = new PrintWriter(s.getOutputStream(),true);

          String line = null;

          boolean flag = false;

         while((line=bufr.readLine())!=null)
          {
             if(line.equals(name))
              {
                  flag = true;
                  break;
              }
             else
             {
               System.out.println(name+",尝试登陆");

               out.println(name+“,用户名不存在”);

             }
          }
             if(flag)
              {
                 System.out.println(name+",已登录");

                 out.println(name+",欢迎光临");

              }
      }
       s.close();
    }
     catch(Exception e)
     {
         throw  RuntimeException(ip+"校验失败");     
     }
  }
  
}

class LoqinServer                                                    //服务端
{
  public static void main (string[] args)     throws   Exception
   {
        ServerSocket ss = new  ServerSocket (10008);

        while(true)

        {
              Socket s = ss.accept();
          
              new Thread(new UserThread(s).start())                   //服务端只有一个 客户端有多个因此使用多线程技术
        }
   }

}

    通过上述示例可以充分理解服务端和客户端的编写过程,在面试过程中还会配合java的GUI(图形化界面)一起考核,如制作一个客户端的登陆页面与之一起作为一道面试题,因此在实际应用时知识总是能够相互联系的,我们应重视每一部分,不能出现“重点”知识,应该把知识都学会学好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值