Java--网络编程

网络编程

  • 网络相关知识
    • IPV4报文分类
    • 常用端口号
    • 网络通讯协议
  • 网络编程中的两个主要问题及其要素
  • InetAddress类的使用
  • TCP通信
    • 三次握手
    • 四次挥手
    • Socket
    • TCP通信实现
  • UDP通信实现(需要使用DatagramSocket 和DatagramPacket )
  • URL的使用(实现使用URL来下载网络资源)

现在是互联网时代,我们面临如何和网络打交道。

而在Java中的网络编程就是针对于网络进行编程的。一般会使用InetAddress和Socket这两个类。

网络相关知识

IPV4报文分类

Java--网络编程_第1张图片
Java--网络编程_第2张图片

常用端口号

  • ssh 22
  • ftp 21
  • smtp 25
  • http 80
  • tomcat 8080(以下几个都是默认下的端口,并不是只能是这个端口)
  • mysql 3306
  • oracle 1521
  • sqlserveer 1433
  • redis 6379

网络通讯协议

Java--网络编程_第3张图片

网络编程中的两个主要问题及其要素

  1. 如何准确地定位网络上一台或多台主机;定位主机上的特定的应用。这个问题对应元素是:IP和端口号
  2. 找到主机后如何可靠高效地进行数据传输。这个问题对应元素是:网络通信协议

InetAddress类的使用

try {
InetAddress inet1 = InetAddress.getByName("192.168.10.14");
System.out.println(inet1);
InetAddress inet2 = InetAddress.getByName("www.atguigu.com");
System.out.println(inet2);
InetAddress inet3 = InetAddress.getByName("127.0.0.1");
System.out.println(inet3);
//获取本地ip
InetAddress inet4 = InetAddress.getLocalHost();
System.out.println(inet4);
//getHostName():获取主机名
System.out.println(inet2.getHostName());
//getHostAddress():获取主机ip地址
System.out.println(inet2.getHostAddress());
} catch (UnknownHostException e) {
e.printStackTrace();
}

TCP通信

TCP协议:传输控制协议

  1. 使用TCP协议前,须先建立TCP连接,形成传输数据通道
  2. 传输前,采用“三次握手"方式,是可靠的
  3. TCP协议进行通信的两个应用进程: 客户端、服务端
  4. 在连接中可进行大数据量的传输
  5. 传输完毕,需释放已建立的连接,效率低

三次握手

Java--网络编程_第4张图片

四次挥手

Java--网络编程_第5张图片

Socket

  1. 套接字(Socket)开发网络应用程序被广泛采用,以至于成为事实上的标准
  2. 通信的两端都要有Socket,是两台机器间通信的端点
  3. 网络通信其实就是Socket间的通信。
  4. Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输
  5. 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端

TCP通信实现

//客户端,实际应该是写成一个类,这里为了测试方便,是写在JUnit单元的一个测试方法
public void client() throws IOException {
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);
OutputStream os = socket.getOutputStream();
FileInputStream fis = new FileInputStream(new File("beauty.jpg"));
byte[] buffer = new byte[1024];
int len;
while((len = fis.read(buffer)) != -1){
 os.write(buffer,0,len);
}
//关闭数据的输出
socket.shutdownOutput();
//接收来自于服务器端的数据,并显示到控制台上
InputStream is = socket.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] bufferr = new byte[20];
int len1;
while((len1 = is.read(buffer)) != -1){
 baos.write(buffer,0,len1);
}
System.out.println(baos.toString());
fis.close();
os.close();
socket.close();
baos.close();
}

//服务器,实际应该是写成一个类,这里为了测试方便,是写在JUnit单元的一个测试方法
public void server() throws IOException {
ServerSocket ss = new ServerSocket(9090);
Socket socket = ss.accept();
InputStream is = socket.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("beauty2.jpg"));
byte[] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1){
 fos.write(buffer,0,len);
}
//服务器端给予客户端反馈
OutputStream os = socket.getOutputStream();
os.write("图片传输完成".getBytes());
fos.close();
is.close();
socket.close();
ss.close();
os.close();
}

UDP通信实现(需要使用DatagramSocket 和DatagramPacket )

UDP协议:用户数据协议

  1. 将数据、源、目的封装成数据包,不需要建立连接
  2. 每个数据报的大小限制在64K内,不适合传输大量数据
  3. 因无需连接,故是不可靠的
  4. 发送数据结束时无需释放资源(因为不是面向连接的),速度快
//发送端
//实际应该是写成一个类,这里为了测试方便,是写在JUnit单元的一个测试方法
public void sender() throws IOException {
   DatagramSocket socket = new DatagramSocket();
   String str = "我是UDP方式发送的导弹";
   byte[] data = str.getBytes();
   InetAddress inet = InetAddress.getLocalHost();
   DatagramPacket packet = new DatagramPacket(data,0,data.length,inet,9090);
   socket.send(packet);
   socket.close();

}
//接收端
//实际应该是写成一个类,这里为了测试方便,是写在JUnit单元的一个测试方法
public void receiver() throws IOException {
   DatagramSocket socket = new DatagramSocket(9090);
   byte[] buffer = new byte[100];
   DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
   socket.receive(packet);
   System.out.println(new String(packet.getData(),0,packet.getLength()));
   socket.close();
}

URL的使用(实现使用URL来下载网络资源)

 HttpURLConnection urlConnection = null;
 InputStream is = null;
 FileOutputStream fos = null;
 try {
     URL url = new URL("https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fcrawl.nosdn.127.net%2F9e9f8b8595d2d7e8767cdf0191bfc76f.jpg&refer=http%3A%2F%2Fcrawl.nosdn.127.net&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1639997746&t=c6ea2954969b2011e0da4314691ecc39");//保证是一个有效的url
     urlConnection = (HttpURLConnection) url.openConnection();
     urlConnection.connect();
     is = urlConnection.getInputStream();
     fos = new FileOutputStream("photo3.jpg");
     byte[] buffer = new byte[1024];
     int len;
     while((len = is.read(buffer)) != -1){
         fos.write(buffer,0,len);
     }
     System.out.println("下载完成");
 } catch (IOException e) {
     e.printStackTrace();
 } finally {
     //关闭资源
     if(is != null){
         try {
             is.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
     if(fos != null){
         try {
             fos.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
     if(urlConnection != null){
         urlConnection.disconnect();
     }
 }

你可能感兴趣的:(java,java,网络,网络协议,url)