我的java学习日记(18)

1 篇文章 0 订阅

Java学习第十八节之网络编程

一、           网络基本概念

1、网络通信协议:即是一种通信规范

2、网络通信接口:包括硬件装置和软件设置,其中硬件设置是指实现结点之间的信息发送,软件设置是指规定双方进行通信的约定协议。

3、网络概述——OSI模型(Open SystemInterconnection,开放式系统互联)

注意:OSI的网络层(即常用的就是包括IP的层)同时支持面向连接和无连接的通信,但是传输层只支持面向连接的通信;TCP/IP五层模型即把上边的高三层统归为应用层,它的网络层只提供无连接服务,但是传输层上同时提供两种通信模式

4、IP地址,即是用来表示一台计算机的身份证,由网络地址(确定网络)和主机地址(网络中的主机)组成。

IP 地址的分为A类、B类、C类(常用)、D类和E类,也可分为IPV4IPV6,目前使用的是IPV4,即4位十进制数,32位二进制数。

 子网掩码是为了区分网络地址和主机地址

5、传输协议分为TCPUDP

TCP(TransmissionControl Protocol 传输控制协议),使用三次握手的方式,可确保数据传送的次序和传输的可靠性,先建立连接,再传输数据,最后释放连接。在IP报文的协议号是6

UDP(UserDatagram Protocol 用户数据报协议),是一个无连接协议,传输数据之前和终端不建立连接,是不可靠的协议。在IP报文的协议号是17

TCPUDP的区别

    TCP协议面向连接,UDP协议面向非连接

   TCP协议传输速度慢,UDP协议传输速度快

   TCP有丢包重传机制,UDP没有

   TCP协议保证数据正确性,UDP协议可能丢包

6TCP套接字Socket,Socket是用于机器之间的通信的类,还可IP地址和端口进行描述

 

二、Socket编程,即就是网络编程

1、类Socket的介绍

java中套接字Socket(通信接口)被抽象为类,我们只需要创建Socket对象就可以使用套接字。Socket可以看做两个程序进行通讯连接的一个端点,Socket类中有输入、输出对象,同时能实现服务器之间的数据传输

常用方法:

public InetAddressgetInetAddress();   //返回此套接字的地址

public InetAddressgetLocalAddress();   //获得套接字绑定的本地地址

public int port();   //获得此套接字连接到的远程端口

2、类ServerSocket的介绍

ServerSocket类:在客户端使用的是ServerSocket,只要是用于接收客户端传来的对象

常用构造函数:

ServerSocket();  //创建非绑定服务器套接字

ServerSocket(int port);  //创建绑定到特定端口的服务器的套接字

ServerSocket(int port,intbacklog); 

//利用指定的backlog创建服务器套接字,并将其绑定到指定的本地端口号

ServerSocket(int port,int backlog,InetAddress bindAddr);

   //使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器

 提供的主要方法:

public Socket accept();//侦听并接收到连接此套接字的连接,此方法在进行连接之前一直阻塞

public void bind(SocketAddress addr);

//返回此服务器套接字的地址,IP地址和端口号都被封装在addr

public void close();  //关闭服务器套接字

public InetAddress getInetAddress(); //返回此服务器套接字的本地地址

public int getLocalPort(); //返回套接字进行侦听的端口

public void setSoTimeout(int timeout); //启动带有指定超时值的SO_TIMEOUT,ms为单位

3、代码应用

部分代码解读:

Socket服务器:(注意多个客户端访问时要用多线程解决出现的问题)

    ServerSocket server=new ServerSocket(port);//创建一个端口

   Sockets=server.accept(); //只有当客户端请求并连接,函数才会返回

    BufferedReader br=newBufferedReader((new InputStream(s.getInputStream()));//接收数据

   PrintWriter pw=newPrintWriter(new OutputStreamWriter(s.getOutputStream()),true)//发送数据

注意:PrintWriter会自动缓冲,使用它的时候需要使用println()函数

  Socket客户端:

    Socket socket=new Socket(host,port); //打开一个套接字,发送请求

    BufferedReader br=newBufferedReader((new InputStream(s.getInputStream()));//接收数据

   PrintWriter pw=newPrintWriter(new OutputStreamWriter(s.getOutputStream()),true)//发送数据

注意:以上代码均属于C/S,需要同时维护客户端和服务器的代码

   B/S的浏览器和服务器只需要维护一方即可

代码出现问题一、在套接字中会发生阻塞的地方

A、实例化Socket对象的时候会阻塞

  解决方案:Socket socket=newSocket();  //创建无连接Socket对象

           socket.connect(new InetSocketAddress(host, port),timeout);  //设置超时

B、in.nextLine()类似操作时会阻塞

解决方案:设置socket.setSoTimeout(long);  //设置超时时间

代码出现问题二、

A.     当客户端想要关闭套接字的时候,但却不能确定服务器是否还在发送数据,但是只要一关闭就立刻断掉

 解决方案:socket.shutdownInput();   //关闭输入流

           Socket.shutdownOutput();  //关闭输出流

4DatagramPacket介绍

  作为接受方法中的参数,DatagramPacket的数组,一个空的数组用来存放、接收数据对象中的数组

  作为发送方法中的参数,DatagramPacket本身包含了目的端的IP和端口,以及存储例如要发送的内容的指定了长度的字节型数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值