一、Java网络编程
用Java语言实现计算机间数据的信息传递和资源共享,一个网络应用程序应该包含网路编程、IO流、多线程。
二、网络编程的三要素
生活举例:日常中快递邮寄,发件人和收件人都有确定的地址(IP),快递运输过程需要根据不同的地址找到最合适的快递投放点(端口),收件人到指定的快递投放点取件签字(协议),快递就实现了从一个位置到另一个位置的转换(客户端---服务器)。
1.地址
- 通过域名表示:www.baidu.com
- 通过IP地址表示:201.108.35.206
Public static InetAddress getByName(stringhost):根据主机名或者IP地址的字符串表示得到IP地址对象
Public string getHostName();获取主机名
Public string getHostAddress();获取IP地址
public class InetAddressDemo { publicstatic void main(String[] args) throws UnknownHostException { //将一个域名或者IP地址传递给该方法的参数,得到一个inetAddress对象,该对象包含有主机地址域名和IP地址 InetAddressaddress =InetAddress.getByName("192.168.24.106"); //获取InetAddress对象所含的IP地址 Stringip=address.getHostAddress(); //获取InetAddress对象所含的域名 Stringname=address.getHostName(); System.out.println(name+ip); } }
2.端口
网络通信使用IP地址表示Internet上的计算机,使用端口号标识服务器上的进程(程序),一个程序占用服务器的一个端口,端口号规定为一个16为的0~65535之间的整数,其中0~1023被预先定义的服务通信占用,除非我们需要访问这些指定服务,否则应该使用1024~65535这些端口中的一个进行通信,以免发生端口冲突。
端口号与IP地址组合得出一个网络套接字,Java中用socket类建立套接字对象,通过socket间的IO进行操作。
Socket的构造方法:Socket(kStringhost,int port) 参数host是服务器IP地址,port是一个端口号。
3.协议
UDP协议:DatagramSocket类,此类表示用来发送和接收数据报包的套接字。
特点:数据打包,大小有限制,不需连接,效率高,不可靠
DatagramPocket类:数据报包
构造方法:public DatagramPacket(byte[] buf, intlength, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
public DatagramPacket(byte[] buf, intlength) 构造 DatagramPacket,用来接收长度为 length 的数据包
发送:
public class SendDemo { publicstatic void main(String[] args) throws IOException { //创建发送端socket对象 DatagramSocketds=new DatagramSocket(); //创建数据并把数据打包 byte[]buf="UDP发送端".getBytes(); DatagramPacketdp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.24.106"),10016); //调用socket对象的发送方法发送数据包 ds.send(dp); //释放资源 ds.close(); } }
接收:
public class ReceiveDemo { publicstatic void main(String[] args) throws IOException { //创建接收端socket对象,接收指定端口 DatagramSocketds=new DatagramSocket(10016); //创建一个数据包,作为接收容器 byte[]bys=new byte[1024]; DatagramPacketdp=new DatagramPacket(bys,bys.length); //调用socket对象的方法接收数据 ds.receive(dp);//阻塞式 //获取对方IP //InetAddressaddress=dp.getAddress();//得到IP地址对象 Stringip=dp.getAddress().getHostAddress();//得到IP地址名 //解析数据包,并显示在控制台 Strings=new String(dp.getData(),0,dp.getLength()); System.out.println(ip+"向你传输数据:"+s); } } 运行结果:192.168.24.106 向你传输数据:UDP发送端
TCP协议:Socket此类实现客户端套接字 ServerSocket此类实现服务器套接字
特点:建立数据通道,数据大小无限制,效率低,可靠
客户端
Socket方法:public Socket(String host,int port)创建一个流套接字并将其连接到指定主机上的指定端口号。
public InputStream getInputStream()返回此套接字的输入流。如果此套接字具有关联的通道,则所得的输入流会将其所有操作委托给通道。
public OutputStream getOutputStream()返回此套接字的输出流。如果此套接字具有关联的通道,则得到的输出流会将其所有操作委托给通道。
public class TcpClient { publicstatic void main(String[] args) throws IOException { //创建客户端Socket对象 Sockets=new Socket("192.168.24.106", 8888); //获取输出流 OutputStreamos=s.getOutputStream(); os.write("TCP客户端".getBytes()); //获取输入流反馈 InputStreamis=s.getInputStream(); byte[]bys=new byte[1024]; intlen=is.read(bys); Stringclient=new String(bys,0,len); System.out.println("client:"+client); s.close(); } } 运行结果:数据已收到
服务器端
ServerSocket类方法:publicServerSocket(int port)创建绑定到特定端口的服务器套接字
public Socketaccept()侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
public class TcpServer { publicstatic void main(String[] args) throws IOException { //创建服务器端ServerSocket对象 ServerSocketss=new ServerSocket(8888); //监听客户端连接返回一个对应的socket对象 Sockets=ss.accept();//阻塞式 //获取输入流,读取数据显示在控制台 InputStreamis=s.getInputStream(); byte[]bys=new byte[1024]; intlen=is.read(bys); Stringstr=new String(bys,0,len); //获取客户端的IP地址 Stringip=s.getInetAddress().getHostAddress(); System.out.println(ip+"客户端发来:"+str); //获取输出流,对客户端给出反馈。 OutputStreamos=s.getOutputStream(); os.write("数据已经收到".getBytes()); s.close(); } } 运行结果:192.168.24.106客户端发来:TCP客户端
说明:从电脑管家的进程中可以看出,大部分的软件中既包含了UDP协议也包含了TCP协议传输,需要哪种方式要看具体的需求。UDP由于没有建立连接通道,只考虑发送而没有接收反馈,所以传输速度快,比如QQ留言功能,发送短信,新闻推送。TCP有三次握手过程,能够建立安全可靠的连接,保证传输两端的“知情权”,比如打电话。