赞
踩
网络编程主要是指让网络上的主机通过不同的进程,以编程的方式进行网络数据通信,这里只需要进程不同就行,不需要主机不同。
一、ip和端口
ip地址:是定位主机在网络上位置的网络地址,ip地址是一个32位的二进制数,一般采用点分十进制的方式来表示,即将32位地址平均分为四个段,每段的范围为0~255,如:255.255.255.255
端口号:用来定位主机进程的标识。网络编程进行通信的是两个进程,ip地址只表名了计算机在网络中的位置,而端口就定位了一台计算机上的进程。进程可以有多个端口号,但是一个端口号同时只能给一个进程。端口号的范围:0~65535
小于1024的端口需要管理员权限打开。骐达端口可以应用程序打开
二、socket套接字
socket套接字是操作体统提供的关于网络编程的api接口,在应用层可以直接调用这个接口来和传输层进行交互。
传输层有TCP和UDP两个比较常用的协议,由于协议不同,对套接字的使用也不同,Java中就有TCP和UDP两种风格的编写方式。
三、UDP协议的编码形式
(1)创建一个DatagramSocket对象,这个对象可以使用有参构造穿一个端口号,也可以使用无参构造,让系统给这个socket对象分配一个还没被使用的端口号。
- DatagramSocket socket=new DatagramSocket();
- //无参构造,系统自动分配一个未被使用的端口
- DatagramSocket socket1=new DategramSocket(4040);
- //有参构造,分配4040这个端口号
一个线程中可以有多个DatagramSocket对象,可以绑定多个端口。
(2)构建DatagramPacket对象。DatagramPacket对象维护的是一个byte数组,数据就是以这个数组的形式传递的,对象还有端口号,ip号byte数组内有多长是有效数据等。
数据报维护的ip地址和端口号是当这个数据被发送时,接收端的ip地址和端口
最基本的就是传入一个字节数组和这个数组的可用长度
- DatagramPacket packet=new DatagramPacket(new byte[4096],10);
- //创建了一个数据报对象,这个数据报维护了一个数组长度为4096的数组长度,但是packet可用来装数据的长度只有0-9下标这10个空间,10代表length
也有其他的一些可用的构造方法
InetAddress是ip地址的表现形式,在实例化DatagramPacket的时候,ip地址要以inetAddress的形式传递,要获得InetAddress的地址需要使用InetAddress的静态方法getByName(String ip);
(3)发送和接收
发送是send(DatagramPacket r)方法,接收是receive(DatagramPacket r)方法,这两个方法都是DatagramSocket对象的方法。
发送send的目的地是DatagramPacket数据报内维护的ip地址和端口号。
接收方法receive的DatagramPackert参数是一个输出型参数,这个被传入的packet对象的缓冲数组大小如果不够,收到的消息将会被截断,如果足够,被传入的参数的缓冲区length将会被receive方法修改成接收长度的length,ip地址和端口号会被赋值为发送端的ip地址和端口号。
receive方法在没有接收到数据的时候,会阻塞线程。
(4)DatagramPacket的一些常用方法
(一)获得地址
getSocketAdress();这个方法回返回packet对象中的ip地址和端口号都包括的对象
getAdress();这个方法返回inetAddress的形式的IP地址,要转换为String类型还需要调用toStrng方法
getPort();返回端口号
(二)获得缓冲字节数组和可用的缓冲长度
getData();返回缓冲字节数组
getLength();返回可用的缓冲数组长度
四、TCP协议的编码形式
(1)SecverSocket和Socket
SeverSocket是服务器专用的socket类,必须要指定端口号才能实例化(服务器的端口号得确定客户端才能找到)。
Socket类既能在服务器中使用也能在客户端中使用,实例化Socket对象需要传入ip地址和端口号,这里的ip地址就可以直接使用String类型直接实例化。在客户端实例化一个Socket对象就是在连接被传入的ip地址和端口号的服务器。(TCP协议是要连接的)
调用SeverSocket的accept方法就能接收客户端发起的连接请求,连接成功就回返回一个Socket对象。根据在服务器和客户端的这两个不同Socket对象就能实现网络通信。
(2)Socket的inputStream和OutputStream
调用Socket的getInputStream和OutputStream方法就能获得向连接上的对方接收数据和发送数据的输入输出流。(Tcp是面向流数据的)
使用OutputStream就能向对方发数据,使用IntputStream就能接收对方发出来的数据。接收数据如果没有得到消息就会阻塞。
(3)长连接和短连接
由于TCP协议需要连接的特性,产生了长连接和短连接两种编写TCP协议的方式。
长连接:一次连接上,可以根据用户需要,接收和发送多个数据,直到用户一方主动回收socket对象断开连接。
短连接:一次连接上,只能收发指定次数据,然后就自动回收socket对象断开连接。
(4)线程池实现TCP服务器响应多个客户端
由于Tcp协议需要连接,一个线程就只能处理一个客户端的请求。可以服务器中使用线程池,每次连接上,就将返回的Socket对象和响应业务作为一个任务上传给线程池,主线程就一直accept连接。
(5)io多路复用实现单线程TCP服务器响应多个客户端
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。