Java网络编程概述

一、Java网络编程

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

二、网络编程的三要素

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


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


猜你喜欢

转载自blog.csdn.net/tigaoban/article/details/72860870