欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java网络编程概述

程序员文章站 2022-04-04 11:13:39
...

一、Java网络编程

用Java语言实现计算机间数据的信息传递和资源共享,一个网络应用程序应该包含网路编程、IO流、多线程。

二、网络编程的三要素

生活举例:日常中快递邮寄,发件人和收件人都有确定的地址(IP),快递运输过程需要根据不同的地址找到最合适的快递投放点(端口),收件人到指定的快递投放点取件签字(协议),快递就实现了从一个位置到另一个位置的转换(客户端---服务器)。

Java网络编程概述

Java网络编程概述

1.地址

  • 通过域名表示:www.baidu.com
  • 通过IP地址表示:201.108.35.206
Java中提供了一个InetAddress类对象含有一个Internet主机地址的域名和IP地址,类中有以下 方法:

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有三次握手过程,能够建立安全可靠的连接,保证传输两端的“知情权”,比如打电话。