0
点赞
收藏
分享

微信扫一扫

java学习笔记-网络编程


原文链接:https://blog.csdn.net/Laiguanfu/article/details/87162699

网络编程概述

一、网络协议

在现有的网络中,网络通讯的方式主要有两种:

  • TCP(传输控制协议)方式

  • UDP(用户数据报协议)方式

其概念及特点如下:

二、网络编程步骤

无论是哪种传输协议或传输方式,都是基于客户端以及服务端进行传输,具体步骤如下

java网络编程

java网络编程实现主要依赖于java.net包。该api中所包含的基础网络类有:

  • InetAddress类--------IP地址类,封装了对网络IP的操作
  • ServerSocket类------服务端监听socket类
  • Socket类---------------网络连接套接字,实现数据传输的主要操作类

一、InetAddress类

如上所属,InetAddress类封装了对网络IP的操作,我们可以通过该类获取对应的IP所携带的基本信息,其主要方法如下:

//通过域名获取IP对象
InetAddress host =  InetAddress.getByName(域名);

//获取本地IP对象
InetAddress host =InetAddress.getLocalHost();

//获取ip地址
host.getHostAddress();

//获取IP对应域名
host.getHostName();

二、套接字Socket

如下是socket的工作流程(对应上述网络编程步骤)

其中,ServerSocket的主要方法如下:

//服务端打开对用端口并获取监听对象
public ServerSocket(int port);

//监听并获取连接对象
public Socket accept()

//关闭服务端监听
public void close()

Socket主要方法:

//创建连接对象,连接服务器
public Socket(String host, int port);//host为服务器地址,port为服务器监听端口

//获取输出流对象(输出信息)
public OutputStream getOutputStream()

//获取输入流对象(接收信息)
public InputStream getInputStream()

//关闭socket
public synchronized void close()

简单Demo

创建服务端 Server.java

try {
       //服务端打开端口8888
       ServerSocket ss = new ServerSocket(8888);

      //在8888端口上监听,看是否有连接请求过来
      logger.info("监听在端口号:8888");
      Socket s = ss.accept();

      logger.info("有连接过来" + s);

      //打开输入流
      InputStream is = s.getInputStream();

      if (is != null) {
          logger.info("接收到信息:");
          //读取客户端发送的数据
          int msg = is.read();
          //打印出来
          logger.info(msg + "");
      }
      is.close();

      s.close();
      ss.close();
} catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
}

创建客户端并发送信息给服务端 Client.java

try {
        logger.info("发起连接。。。");
        //连接到本机的8888端口
        Socket s = new Socket("127.0.0.1", 8888);
        logger.info("连接成功");

        logger.info("发送细信息:110");
        // 打开输出流
        OutputStream os = s.getOutputStream();

        // 发送数字110到服务端
        os.write(110);

        logger.info("发送成功");
        os.close();
        s.close();
} catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

运行结果如下:

----Server.java

[main] INFO SocketConnect.Server - 监听在端口号:8888
[main] INFO SocketConnect.Server - 有连接过来Socket[addr=/127.0.0.1,port=5454,localport=8888]
[main] INFO SocketConnect.Server - 接收到信息:
[main] INFO SocketConnect.Server - 110

----Client.java

[main] INFO SocketConnect.Client - 发起连接。。。
[main] INFO SocketConnect.Client - 连接成功
[main] INFO SocketConnect.Client - 发送细信息:110
[main] INFO SocketConnect.Client - 发送成功

扩展Demo -使用DataStream进行数据传输,同时实现双向交流(单线程)

Server.java

try {
            ServerSocket ss = new ServerSocket(8888);
            logger.info("监听8888.。。。");

            Socket socket = ss.accept();

            logger.info("有连接过来" + socket);

            InputStream is = socket.getInputStream();

            OutputStream os = socket.getOutputStream();

            //把输入输出流封装在DataInputStream
            DataInputStream dis = new DataInputStream(is);

            DataOutputStream dos = new DataOutputStream(os);

            String message = "start";

            logger.info("交流开始。。。");
            while (!message.equals("end")) {
                System.out.print("接收到信息:");

                //使用readUTF读取字符串
                message = dis.readUTF();

                System.out.println(message);

                //使用Scanner读取控制台的输入,并发送到服务器
                System.out.print("发送信息:");
                Scanner sc = new Scanner(System.in);

                message = sc.next();

                dos.writeUTF(message);
            }

            logger.info("交流结束");

            dis.close();
            is.close();
            socket.close();
            ss.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

Client.java

try {
     Socket s = new Socket("127.0.0.1", 8888);

     OutputStream os = s.getOutputStream();

     //获取输出流并封装到DataOutputStream中
     DataOutputStream dos = new DataOutputStream(os);

     //获取输入流并封装到DataInputStream中
     InputStream is = s.getInputStream();
     DataInputStream dis = new DataInputStream(is);

     String message = "";

     while(true){
        //使用Scanner读取控制台的输入,并发送到服务器
        System.out.print("发送信息:");
        Scanner sc = new Scanner(System.in);
        message= sc.next();
        dos.writeUTF(message);

        //输入的时“end”字符串时,结束交流
        if(NetWorkConst.END.equals(message)){
            logger.info("交流结束");
            break;
        }

        message = dis.readUTF();
        logger.info("收到服务端信息:"+message);
        if(NetWorkConst.END.equals(message)){
            break;
        }
     }

     dos.close();
     s.close();
} catch (UnknownHostException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
} catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
}

运行结果:

-----Server.java

[main] INFO SocketConnect.Server - 监听8888.。。。
[main] INFO SocketConnect.Server - 有连接过来Socket[addr=/127.0.0.1,port=7260,localport=8888]
[main] INFO SocketConnect.Server - 交流开始。。。
接收到信息:123
发送信息:我是服务器端
接收到信息:我是客户端
发送信息:end
[main] INFO SocketConnect.Server - 交流结束

-----Client.java

发送信息:123
[main] INFO SocketConnect.Client - 收到服务端信息:我是服务器端
发送信息:我是客户端
[main] INFO SocketConnect.Client - 收到服务端信息:end

总结

1.网络传输方式主要有两种,TCP传输方式安全可靠,传输双方需要建立虚拟连接,存在连接时延。UDP方式通过各种渠道传输数据,是个不可靠传输协议,且无法判断数据到达的正确性和时间。所以一般使用TCP传输方式或者两者结合使用

2.java网络编程依赖于java.net包实现,其中的InetAddress封装了一些关于IP的操作方法

3.网络编程离不开客户端和服务端,java的C/S模式网络编程开发,使用套接字对象socket作为设备间的逻辑连接端点,实行传输。服务器端主要有以下步骤:创建服务器端口监听socket-获取连接socket-交换信息-结束交换,关闭socket及相关资源;客户端主要有以下步骤:创建对应地址端口的socket对象,请求连接-交换信息-结束交换,关闭socket及相关资源

参考文档:

【1】java开发手册

【2】https://blog.csdn.net/csdnliuxin123524/article/details/78144063

【3】https://blog.csdn.net/sihai12345/article/details/79334299

举报

相关推荐

0 条评论