Java网络基础,Socket通信基础

一、网络基础
    1、 InetAddress
          InetAddress构造器私有,可以通过多种方式获得inetAddress对象
InetAddress ip = InetAddress. getLocalHost ();//获取本机IP
ip = InetAddress. getByName ( "100.64.141.89" );//通过名字获取指定地址IP
String name = ip.getHostName();//通过IP获取IP名字
    2、URL统一资源定位符
          典型构成:1、网络协议(http://);2、主机地址(192.168.46.20/myServlet);3、端口号(80);4、资源路径(crm/index.jsp);5、查询地址(gid=117)
//构造器多种,可以采用指定URL连接构造一个URL,也可以使协议,用端口号,文件名等信息构成URL
 URL url = new URL( str );
String protocol = url.getProtocol();// 获取协议
 String host = url.getHost();// 主机名
int port = url.getPort();//端口号
        对资源文件的一般操作
String file = url.getFile();//获取资源中包含的文件名称
InputStream is = url.openStream();//打开此URL连接( URLConnection),并获取连接的输入流(URLconnection.getOutputStream())
        对URL地址进行转码,解码,防止乱码
String str1 = URLEncoder.encode( str , "UTF-8");//对str字符串进行UTF-8转码

String str2 = URLDecoder.decode(str1, "UTF-8");//解码
    3、HttpURLConnection
            继承URLConnection类; Http 协议简介 http 是一个无状态协议,请求、响应协议由请求头和响应头构成 。
            ①请求头: 请求方法:get post delete  put..... 
               ②响应头 响应状态码:status code:200(正常响应)   400~(404,405请求资源异常,不存在,请求响应格式不一致) 500~(500服务器内部异常)
 //利用HttpURL协议下载文件
              String str3 = " http://192.168.46.254:8888/easyBuy/images/plmm.jpg " ;
           URL url2 = new URL( str3 );
            // 打开一个URL连接
           HttpURLConnection conn = (HttpURLConnection) url2 .openConnection();//获取一个连接( URLConnection)
            // 设置请求方法
            //conn.setRequestMethod("GET");
             // conn.setRequestProperty(" Accep -Language", " zh - en ");
          //  conn .setReadTimeout(10000); // 设置读取超时时间,可以默认
               //  conn.setDoInput(true);// 打开输入和输出,可以不设置,默认true
               //conn.setDoOutput(true);
          //  int code = conn .getResponseCode(); // 获取响应状态码
               // System.out.println(code);
            // 判断是否响应成功
            if ( code == HttpURLConnection. HTTP_OK ) {
                InputStream is1 = conn .getInputStream();
                FileOutputStream fileOutputStream = new FileOutputStream( new File( "C:\\Users\\lx\\Desktop\\test\\mn.jpg" ));
               BufferedInputStream bfi = new BufferedInputStream( is1 );
               BufferedOutputStream bfo = new BufferedOutputStream( fileOutputStream );
                 int len ;
                 byte [] bs = new byte [1024];
               while (( len = bfi .read( bs ))!=-1){
                 bfo .write( bs , 0, len );
                 bfo . flush();
               }
           }


二、Socket通讯:
     1、TCP/IP
    IP:InternetProtocol    网络协议,支撑主机之间通讯的基本协议,如果需要实现主机之间的消息安全传输,通常会结合TCP协议共同使用。全称为TCP/IP。都是传输层协议。
    TCP:传输控制协议,能保证数据消息的在主机之间安全传输,三次握手,四次挥手。是一个安全传输数据协议,所以一般用于数据传输的准确性,安全性较高的应用,但是效率较低,如:视频通话。

C/S 架构:    Client/Server    客户端/服务器模式    
B/S 架构:    Browser/Server    浏览器/服务器模式

服务器端:
1、创建serverSocket,此套接字为服务器专用,构造器应当包含端口号,以供其他主机连接。
2、监听套接字,并获得连接:Socket socket = serverSocket.accept( );
3、获取套接字输出流:socket.getOutputStream( );
               ServerSocket serverSocket = new ServerSocket(9999);
           System. out .println( "服务器开启" );
            while ( true ) {
                Socket socket = serverSocket .accept();
                System. out .println( "客户端已经连接" + socket .getInetAddress());
                PrintStream ps = new PrintStream( socket .getOutputStream());
                 ps .print( "欢迎使用socket服务器" );
               }
       客户端
        1、利用构造器获取以供连接的套接字,属性包含目标IP和端口号
        2、获取套接字里面的输入流:socket.getInputStreeam( );
           Socket socket = new Socket( "127.0.0.1" , 9999);
           InputStreamReader isr = new InputStreamReader( socket .getInputStream());
           BufferedReader br = new BufferedReader( isr );
           String msg = br .readLine();
           System. out .println( msg );
     2、UDP
UDP:user datagram Protocol    用户数据协议,无法保证数据的安全性,但是可以提交数据传输的效
    接收数据:为阻塞式,需要单独作为一个线程
    1、创建网络通道datagramSocket,应当是包含端口地址的构造器
    2、创建数据包datagramPacket ,其中构造方法必须包含一个空的字符缓冲区,偏移量等信息。
    3、通过datagramSocket.receiver(datagramPacket);接受数据,向数据包写入数据。
    4、 获取数据包内容 new String(datagramPacket.getData() , datagramPacket.getOffset(),datagramPacket.getLength());
public static void main(String[] args ) throws IOException {
           DatagramSocket datagramSocket = new DatagramSocket(2345);
            byte [] b = new byte [1024];
            while ( true ) {
                DatagramPacket datagramPacket = new DatagramPacket( b , b . length );
                 datagramSocket .receive( datagramPacket );//接受数据
                String string = new String( datagramPacket .getData(), datagramPacket .getOffset(),
                            datagramPacket .getLength());               
                System. out .println( "接受到的数据是" + string );
           }
     }
    发送数据:
    1、创建网络通道datagramSocket,构造器不需写入
    2、创建数据包 datagramPacket,构造方法里面包含需要写入的字节数组,偏移量,目标地址,目标端口号,当然也可以通过set方式设置目标地址地址等信息
    3、发送数据报  datagramSocket.send(datagramPacket);
public static void main(String[] args ) throws IOException {
            //创建一个网络通道
           DatagramSocket datagramSocket = new DatagramSocket();
            //将数据打包成数据报包
           String message = "nnnnnn" ;
           
           DatagramPacket datagramPacket = new DatagramPacket(
                      message .getBytes(), message .getBytes(). length ,
                     InetAddress. getByName ( "192.168.46.19" ),
                     2345);
            datagramSocket .send( datagramPacket );         
            datagramSocket .close();
     }
3、UDP多播广播
    发送数据:
1、创建多播广播通道 new MulticastSocket( );
2、获取组播地址并将广播加入此地址   multicastSocket.jionGroup(  InterAddress.getByName("266.81.9.8") );
3、构建datagramPacket,包含byte[]的内容,byte[]长度,ip,端口号。当然可以不用在构建方法添加ip和端口号。
4、发送消息:multicastSocket.send(datagramPacket);
      public static void main(String[] args ) throws IOException {
           MulticastSocket multicastSocket = new MulticastSocket();
           InetAddress group = InetAddress. getByName ( "226.81.9.8" ); 
            multicastSocket .joinGroup( group );
           String content = "刷屏100遍" ;
           
           DatagramPacket dp = new DatagramPacket( content .getBytes(), content .getBytes(). length );
            dp .setAddress( group );
            dp .setPort(2426);
           
            multicastSocket .send( dp );
     }
    接收数据:阻塞式,需要单独作为一个线程
1、创建多播广播通道:new MuliticastSocket(2426);    构造方法应当包含开启的端口号
2、获取广播地址,并加入此广播地址  muliticast.jionGroup(InterAddress.getByName("192.22.22.2"));
3、创建你个空的btye[]数组。和一个datdagramPacke对象。包含btye[]相关信息
4、接收数据:mutilicastSocket.receive(datagramPacket);
5、读取datagramPacket内容:利用String的构造方法
      public static void main(String[] args ) throws IOException {
           MulticastSocket ms = new MulticastSocket(2426);
           InetAddress group = InetAddress. getByName ( "226.81.9.8" );
            ms .joinGroup( group );
            byte [] b = new byte [1024];
        while ( true ) {
             DatagramPacket datagramPacket = new DatagramPacket( b , b . length );
             ms .receive( datagramPacket ); //接受数据
             String string = new String( datagramPacket .getData(), datagramPacket .getOffset(),
                        datagramPacket .getLength());              
             System. out .println( datagramPacket .getAddress()+ "" + string );
        }
     

4、NIO
    NIO是jdk1.4之后引入的一套全新的IO API,处理数据的方式不同于传统IO,传统IO的处理数据的方式以字节为单位,而NIO是一个Buffer(数据块) 为单位,传统IO属于阻塞式(流在读取数据时如果未读到时,程序会处于阻塞状态);而NIO的处理的方式为非阻塞式方式允许(底层为信号通讯),NIO可以在单线程 应用中处理多个客户请求。



猜你喜欢

转载自blog.csdn.net/qq_24065713/article/details/76468057
今日推荐