java网络编程基础
来源:互联网 发布:nba新浪数据 编辑:程序博客网 时间:2024/05/18 03:31
网络传输协议
InetAddress类
Socket类理解:
Socket常用方法
基于TCP的socket编程
基于UDP的socket编程
URL编程
总结
java网络编程
java天生就是支持网络的一种语言。java提供的网络类库,可以很容易的实现网络连接,而联网的底层细节被隐藏在java的本地安装系统里面,由JVM进行控制,java实现了跨平台的网络库,因此程序员面对的是一个统一的网络编程环境。
网络编程的两个问题:
1 如何准确的定位网络上一台或多台主机
2 如何可靠而且高效的进行数据传输。
IP地址和端口号
IP地址:唯一的标识Internet上的计算机
IP的两种表示方式:hostAddress 主机地址(俗称IP)
hostName 主机名(俗称域名)域名需要DNS域名服务器进行解析成IP地址,进行范围。
注 本地的回环地址:127.0.0.1 本地主机名:localhost
【了解】当浏览器发出域名的请求后,首先查找本地hosts,目录如下C:\Windows\System32\drivers\etc\hosts,查看是否有输入的域名地址,没有的话,再通过DNS服务器,解析域名,访问主机。
端口号:标识正在计算机上运行的程序。
1,不同的程序有不同的端口号;
2,端口号被规定为一个十六位的整数,0~65535。其中0~1023【Well-Known-Ports】被预先定义的服务通信占用(Mysql 占用3306,http占用80等)除非我们需要访问这些特定的服务,否则,我们就应该使用1024~65535【Dynamic Ports】这些端口中的某一个端口进行通信,以免发生端口冲突。
端口号和IP地址的组合得出一个网络套接字。
mysql:3306 tomcat:8080; ftp:21
http:80 oral:1521; telnet:23 ssh:22
java中的InetAddress类
InetAddress:位于java.net包下
1.InetAddress类用来代表IP地址。一个InetAdress的对象就代表着一个具体的IP地址
2.如何创建InetAddress的对象:InetAddress类的静态方法,
getByName(String host)
- 3.getHostName(): 获取IP地址对应的域名
getHostAddress():获取IP地址
InetAddress类没有提供对外的构造器,通常是通过如下的两个方法获取InetAddress类的实例。
getByName(String host) 在给定主机名的情况下确定IP地址,并返回InetAddress类的实例。参数可以是域名或者IP的字符串形式。
getByAddress(byte[] address) 在给定IP地址的情况下返回InetAddress类的实例。
getLocalHost()返回本地主机的InetAddress类的一个实例。
getHostAddress() 返回主机 IP地址的字符串形式。
getHostName() 返回主机 域名的字符串形式
isReachable(int timeout)在 timeout(毫秒)时间内,该主机是否可以访问。
getCanonicalHostName() 返回该主机的完全限定名 字符串形式。
数据传输封装模型:
网络传输通信协议
网络通信协议是一种标准,用来规范对传输速率,传输代码,代码结构,传输控制步骤,出错控制等。
通信协议的分层思想:
节点之间的联系很复杂,在制定协议的时候,把复杂的成分分解成若干个简单的成分,然后再将其复合起来。而最常用的复合方式是
层次方式,即同层之间可以通信,上一层可以调用下一层,而与再下一层不发生关系,各层之间互不影响,利于系统的开发和拓展。
基于对以上通信协议的认识,在传输层协议中两个最常用的协议:
1传输控制协议TCP(Transmission Control Protocol)
2用户数据包协议 UDP(User Datagram Protocol)
TCP协议:
使用TCP协议前,必须先建立TCP连接,形成传输数据通道
传输前,采用“三次握手”的方式,可靠性高
TCP协议进行通信的两个应用进程 客户端 & 服务器端
在连接中可以进行大数据量的传输
传输完毕,需要释放已经建立的链接,效率低
UDP协议:
将数据,源,目的封装成数据包,不需要建立连接
每个数据包的大小限制在64k内
因为无需连接,故而不可靠
发送数据包结束时,无需释放资源,速度快。
Socket 理解:
Socket是一组端口号与IP地址的组合。
利用Socket开发网络应用程序已被广泛采用,故而成为一种标准。
通信的两端都要有Socket。
网络通信其实就是Socket之间的通信。
Socket允许程序把网络连接当成一个流,数据在两个Socket之间通过IO传输。
一般主动发起通信的应用程序属于客户端Client,等待通信请求的一端数据服务器端Server。
基于Socket的TCP编程流程:
Socket类的常用方法
InetAddress getLocalAddress() 返回本地Socket中的InetAddress 对象。InetAddress getInetAddress() 返回对方Socket 中的InetAddress 对象。int getLocalPort() 返回本地Socket 中的端口int getPort() 返回对方Socket 中的端口void close() throws IOException 关闭Socket,不可在以后的网络链接中使用,除非创建新的SocketInputStream getInputStream() throws IOException 获取与Socket相关联的字节输入流,用于从Socket中读数据。OutputStream getOutputStream() throws IOException 获取与Socket相关的字节输出流,用于从Socket中写入数据。
基于Socket的TCP编程
1创建Socket:根据指定服务器的ip和端口构造Socket类对象。若服务器端响应,则建立客户端到服务器的通信线路,若连接失败,则出现异常。
2 打开连接到Socket的输入/输出流:使用 Socket对象的
getInputStream()方法获得输入流,使用getOutputStream()方法获得输出流。
3,按照一定的协议对Socket进行读写操作:通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线路。
4,关闭Socket,断开客户端到服务端的连接,释放线路。
具体实现的部分代码:
客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。
Socket的构造方法是:Socket(String host,int port)throws UnknownHostException,IOException
向服务器(域名是host。端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。
Socket(InetAddress address,int port)throws IOException:根据InetAddress对象所表示的IP地址以及端口号port发起连接。 客户端建立Socket对象的过程就是向服务器发出套接字连接请求
Socket s = new Socket(“192.168.40.165”,9999);
OutputStream out = s.getOutputStream(); out.write(“hello”.getBytes());
s.close();
服务器端四个基本的步骤:
1,调用 ServerSocket(int port) :创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。此时如下代码可能发生IOException异常。ServerSocket ss = new ServerSocket(9999);2,调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。接受客户的套接字也容易发生IOException异常。注意accept()方法返回一个Socket对象,但是这个方法不会立刻返回,该方法会阻塞服务器端当前线程的执行,直到客户端请求建立 套接字连接 。Socket s = ss.accept (); 注:ServerSocket 对象可以调用setSoTimeout(int timeout)方法设置超时值(单位毫秒),当ServerSocket对象调用accept()方法阻塞的时间一旦超过 timeout 就会出发 SocketTimeOutException3,调用Socket类对象的getOutputStream() 和 getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len;while((len = in.read(buf)) != -1){String str = new String(buf,0,len);System.out.print(str)}4,关闭ServerSocket和Socket对象:客户端访问结束,关闭通信套接字。in.close();s.close(); ss.close();
备注:
ServerSocket 对象负责等待客户端请求建立套接字连接,也就是说,服务器必须事先建立一个等待客户请求,才建立套接字连接的ServerSocket对象。 所谓“接收”客户的套接字请求,就是accept()方法会返回一个 Socket 对象注意:
需要注意的是,从套接字连接中读取数据与从文件中读取数据有着很大的不同,尽管二者都是输入流,从文件中读取数据时,所有的数据都已经存在文件中,而使用套接字连接时,可能存在另一端的数据发送过来之前,就已经开始试着读取了,这就会堵塞本线程,直到该读取方法成功读取到信息,本线程才继续执行后续的操作。
建立连接之后,服务器端 套接字对象 可以调用getInetAddress()方法获取一个包含客户端IP的InetAddress对象。同样客户端也可以调用getInetAddress()方法返回一个包含服务器端IP的InetAddress对象。
套接字对象调用close()方法可以关闭双方的套接字连接对象的时候,只要一方关闭连接,就会导致对方发生IOException异常。
UDP网络通信
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。 UDP数据报通过 数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。 DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。 UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接
UDP传输流程: 1,创建DatagramPacket对象,DatagramPacket类将数据打包,创建的DatagramPacket对象称为数据报,其构造器如下:
DatagramPacket(byte[] data,int len,InetAddress add, int port)
DatagramPacket(byte[],int offset,int length,InetAddress add,int port)
数据包对象包含以下特征:1,含有data数组指定的数据2,该数据包将发送到目标地址是add,目标端口号是port的主机上,其中第二个构造器创建的数据包对象含有数据data从offset开始指定长度的数据。
备注:DatagramPacket对象调用
public int getPort()方法获取数据报的目标端口号,
public InetAddress getAddres()方法获取目标地址
public byte[] getData()方法获取数据报中的数据。
2创建DatagramSocket对象,该对象负责发送数据报。
调用DatagramSocket类的无参构造器,如下
DatagramSocket mailOut = new DatagramSocket();
mailOut.send(package); 3创建DatagramSocket对象,负责接收数据报报DatagramSocket mailIn = new DatagramSocket(int port);
其中参数必须与待接收的数据报的端口号相同。
4创建待接收的数据报DatagramPacket对象,
调用其如下构造器建立数据包:DatagramPacket (byte[] data,int length);数据报将接受长度是length的数据放入byte数组data中。
byte[] data = new data[1024];
int length = 90;
DatagramPacket inpacket = new DatagramPacket(data,length);
5,调用DatagramSocket对象的receive(DatagramPacket inpacket)方法。
mailIn.receive(inpacket);注:receive()方法可能会阻塞线程,直到收到数据报datagrampacket。数据报对象可以调用getPort()方法获取所接收的数据报从远程主机的哪个端口发出,即数据包的始发端口号,同理,调用getInetAddress()方法可以获取数据包的始发地址。数据包长度不要超过8192KB。
处理接收的数据:
String str = new String(inPacket.getData(),0,inPacket.getLength());
System.out.println(str);
6关闭Socket对象
注意:发送端与接收端是两个独立的运行程序,线程独立。
URL编程
URL的基本构成:
<传输协议>://<主机名>:<端口号>/<文件名>例如: http://192.168.1.100:8080/helloworld/index.jsp
为了表示URL,java.net 中实现了类 URL。我们可以通过下面的构造器来初始化一个 URL 对象: public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。
例如:URL url = new URL ("http://www. atguigu.com/"); public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。例如:URL downloadUrl = new URL(url, “download.html")public URL(String protocol, String host, String file);例如:new URL("http", "www.atguigu.com", “download. html");public URL(String protocol, String host, int port, String file);例如: URL gamelan = new URL("http", "www.atguigu.com", 80, “download.html");
类URL的构造方法都声明抛出非运行时异常,必须要对这一异常进行处理,通常是用 try-catch 语句进行捕获。 一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:
public String getProtocol() 获取该URL的协议名public String getHost() 获取该URL的主机名public String getPort() 获取该URL的端口号public String getPath() 获取该URL的文件路径public String getFile() 获取该URL的文件名public String getQuery() 获取该URL的查询名InputStream openStream():①打开到此URl的连接,返回从该连接读入的InputStream。URLConnection openConnection() :返回与URL的连接对象
若希望输出数据,例如向服务器端的 CGI (公共网关接口Common Gateway Interface 的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。
URLConnection:表示到URL所引用的远程对象的连接。
与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。
如果连接过程失败,将产生IOException
URL netchinaren = new URL (“http://www.atguigu.com/index.shtml“); URLConnectonn con = netchinaren.openConnection( );
通过URLConnection对象获取的输入流和输出流,即可以与现有的CGI程序进行交互。
public Object getContent( ) throws IOExceptionpublic int getContentLength( )public String getContentType( )public long getDate( )public long getLastModified( )public InputStream getInputStream( )throws IOExceptionpublic OutputSteram getOutputStream( )throws IOException
总结
位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。 客户端-服务器是一种最常见的网络应用程序模型。
服务器是一个为其客户端提供某种特定服务的硬件或软件。客户机是一个用户应用程序,用于访问某台服务器提供的服务。
端口号是对一个服务的访问场所,它用于区分同一物理计算机上的多个服务。
套接字用于连接客户端和服务器,客户端和服务器之间的每个通信会话使用一个不同的套接字。
TCP协议用于实现面向连接的会话。Java 中有关网络方面的功能都定义在 java.net 程序包中。
Java 用 InetAddress 对象表示 IP 地址,该对象里有两个字段:主机名(String) 和 IP 地址(int)。
类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。
Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。这个连接提供了一个安全的数据传输通道,这是因为 TCP 协议可以解决数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,它保证数据可靠的传送。
类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示 Internet 上各种网络资源。通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。
- JAVA网络编程基础
- Java网络编程基础
- java网络编程基础
- Java网络编程基础
- Java基础网络编程
- Java网络编程基础
- java基础<网络编程>
- java网络编程基础
- Java网络编程基础
- java基础:网络编程
- Java基础:网络编程
- 【java】网络编程基础
- java网络编程基础
- java网络编程基础
- Java基础--网络编程
- Java 网络编程基础
- Java基础:网络编程
- java基础--网络编程
- RecyclerView实现条目Item拖拽排序与滑动删除
- 【DM】设计模式再回顾---策略模式
- 读写Porperties文件
- 斐波那契数
- workerman和swoole的区别
- java网络编程基础
- 我决定好好开始写博客了
- hdu 1176
- JavaScript的onunload()方法在关闭页面时不执行
- window python 操作mysql、redis
- 阿里云服务器centos6.5安装java运行环境
- Leetcode解题笔记(Linked List)
- 韩星点兵
- 史上最全IO集合框架九(数据流:数据字节流)