• java基础之网络编程


    一些基本的网络概念原理这里先略过。

    网络通信的三要素,这很重要。

    a.IP地址:InetAddress
        网络中设备的标识,不易记忆,可用主机名
    b.端口号
        用于标识进程的逻辑地址,不同进程的标识
    c.传输协议
        通讯的规则
        常见协议:TCP,UDP

    我们操作 IP地址 之类时,java为我们提供了一个类,InetAddress ,获取任意主机:getByName主机名:getHostName,主机Ip地址:getHostAddress

    物理端口 网卡口
    逻辑端口 我们指的就是逻辑端口
        A:每个网络程序都会至少有一个逻辑端口
        B:用于标识进程的逻辑地址,不同进程的标识
        C:有效端口:0~65535,其中0~1024系统使用或保留端口。
        通过360可以查看端口号

    两种传输方式:

    UDP
            将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
    TCP
            建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低

    一.UDP传输

    DatagramSocket与DatagramPacket
    建立发送端,接收端。
    建立数据包。
    调用Socket的发送接收方法。
    关闭Socket。
    发送端与接收端是两个独立的运行程序。
    A.发送端:

    1:建立udp的socket服务
    2:将要发送的数据封装成数据包
    3:通过udp的socket服务,将数据包发送出
    4:关闭资源

    代码:

    package com.etc.day17.net;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    public class UdpSend {
    	public static void main(String[] args) {
    		DatagramSocket ds = null;
    		try {
    			ds = new DatagramSocket();//建立UDP服务,发送端没有指定端口,会自动分配一个端口
    			//定义数据内容将数据封装成数据包
    			byte[] bytes = "我要发送啦!".getBytes();
    			//发送必须明确主机,和地址和端口号
    			DatagramPacket dp = new DatagramPacket(bytes,bytes.length,InetAddress.getByName("17SCVR42NV9WPB5"),10086);
    			
    			ds.send(dp);
    
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			ds.close();
    		}
    		
    		
    		
    		
    		
    		
    		
    		
    	}
    
    }
    
    B.接受端

    1:建立udp的socket服务.
    2:通过receive方法接收数据
    3:将收到的数据存储到数据包对象中
    4:通过数据包对象的功能来完成对接收到数据进行解析.
    5:可以对资源进行关闭

    package com.etc.day17.net;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    public class UdpReceive {
    	public static void main(String[] args) {
    		DatagramSocket ds = null;
    		DatagramPacket dp;
    		try {
    			ds = new DatagramSocket(10086);//定义一个socket服务,并让它监听一个端口,明确那些应用程序是可以处理的
    			while(true){
    			
    			byte[] bytes = new byte[1024];//预先定义好一个数据包,用于存储接收到的数据
    			dp = new DatagramPacket(bytes,bytes.length);
    			//使用socket服务的receive方法将接收到的数据存储到数据包中
    			ds.receive(dp);
    	
    		//通过数据包对象的方法获取其中的数据内容,包括地址端口,数据主体。
    		String ip = dp.getAddress().getHostName();
    		int port = dp.getPort();
    		byte [] bs = dp.getData();
    		String data= new String(bs,0,bs.length);
    		
    		System.out.println(ip+"----"+port+"***"+data);
    			}
    		} catch (SocketException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			ds.close();
    		}
    		
    	}
    
    }
    

    二.TCP传输

    Socket和ServerSocket
    建立客户端和服务器端
    建立连接后,通过Socket中的IO流进行数据的传输
    关闭socket
    同样,客户端与服务器端是两个独立的应用程序。

    A.客户端

    1:建立客户端的Socket服务,并明确要连接的服务器。
    2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
    3:通过Socket对象的方法,可以获取这两个流
    4:通过流的对象可以对数据进行传输
    5:如果传输数据完毕,关闭资源户端

    代码:

    package com.etc.day17.net;
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    public class TcpClient {
    	public static void main(String[] args) {
    		Socket socket = null;
    		try {
    		 socket = new Socket("10.0.17.77",10000);
    			OutputStream os = socket.getOutputStream();
    			
    			os.write("你好我的祖国!".getBytes());
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally{
    			try {
    				socket.close();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	
    		
    	}
    
    }
    

    B.服务端

    1:建立服务器端的socket服务,需要一个端口
    2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
    3:通过客户端的获取流对象的方法,读取数据或者写入数据
    4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的

    代码:

    package com.etc.day17.net;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TcpServer {
    	public static void main(String[] args) {
    		
    		ServerSocket socket = null;
    	 try {
    		socket = new ServerSocket(10000);
    			
    			Socket sokets = socket.accept();//accept方法获取客户端对象
    			
    			InputStream  is = sokets.getInputStream();//获取到客户端发过来的信息
    			
    			byte []bytes = new byte[1024];
    			int length = 0;
    			String str = null;
    			while((length=is.read(bytes))!=-1){
    				str =new String(bytes,0,length);
    				
    			}
    			
    			System.out.println(str);
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}finally{
    		try {
    			socket.close();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    		
    	}
    		
    		
    		
    		
    		
    		
    		
    	}
    
    }
    


  • 相关阅读:
    耐人寻味的 8 幅Java技术图
    什么是线程安全?怎么样才能做到线程安全?
    线程池
    ExecutorService的正确关闭方法
    js中let和var定义变量的区别
    sql的left join 、right join 、inner join之间的区别
    Collections.sort排序
    Mysql声明变量及使用
    java集合容器汇总
    TortoiseSVN提交commit提示Unable to create pristine install stream.系统找不到指定的路径 之解决方法
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767581.html
Copyright © 2020-2023  润新知