• Java基础——网络编程(二)


    一、套接字 Socket

    网络驱动程序提供给应用程序编程的接口和一种机制,可以比喻成一个港口码头 应用程序只要把货放在这,就算完成了货物的运送。它在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自已对应的IP 和 Port。

    Socket是 java 中网络编程的类 , 位于java.net包中。

    ---- DatagramSocket  //用于UDP通迅

    ---- ServerSocket //用于TCP通讯,用于服务端

    ---- Socket //用于Tcp通讯的服务端和客户端

    二、UDP 网络程序

    InetAddress 类  表示互联协议(IP)地址

    //static InetAddress getLocalHost()     throws UnknownHostException 返回本地主机        

    //static InetAddress getByName(String host)  在给定主机名的情况下确定主机的 IP 地址。 主机名可以是机器名
                                                                                             //(如 "java.sun.com"),也可以是其 IP 地址的文本表示形式

    //static InetAddress[] getAllByName(String host) 根据主机名返回其 IP 地址所组成的数组。

    static void ipDemo() throws UnknownHostException{
                    InetAddress netAddr=InetAddress.getLocalHost();
                    
                    //取得本地电脑的一些信息
                    System.out.println(netAddr.toString());  
                    System.out.println(netAddr.getHostAddress());
                    System.out.println(netAddr.getHostName()); //取得其他电脑的信息
                    InetAddress netAddr2=InetAddress.getByName("DELL-PC");  //这里也可以传IP地址
                    System.out.println(netAddr2.getHostAddress());  //169.254.170.71
                    System.out.println(netAddr2.getHostName()); //DELL-PC
                    
                    //取得百度的地址
                    InetAddress []  ipList=InetAddress.getAllByName("www.baidu.com");
                    for(InetAddress addr:ipList){
                        System.out.println(addr.toString()); 
                    }
                }

    三、UDP发送和接收  DatagramSocket , DatagramPacket

    //例一 最简的发送和接收

    发送端==要导java.net包

    通过UDP的方式把数据发出去:

    1) 建立UDPSocket服务

    2) 提供数据,将数据封装到数据包中  DatagramPacket (byte[] buf, int length, InetAddress address, int port) //构造函数有多个

    3) 通过Socket服务,发送数据

    4) 关闭资源

    import java.net.*;
                                class Sender4{
                                    //DatagramPacket (byte[] buf, int length, InetAddress address, int port) 
                                    public static void main(String [] args) throws Exception
                                    {
                                          byte [] buff="hello cat".getBytes(); 
                                            DatagramSocket socket=new DatagramSocket();
                                            DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("192.168.0.103"),8888);
                                            socket.send(packet);
                                            socket.close();
                                            System.out.println("ok");
                                    }
                                }

    --接收端

    1) 创建Socket服务,指定在某个端口上监听

    2) 创建一个用于接收数据的  DatagramPacket

    3) 从包中取出数据

    4) 关闭资源

    import java.net.*;
                                class Receive4
                                {
                                    public static void main(String [] args) throws Exception
                                    {
                                    DatagramSocket socket=new DatagramSocket(8888); //别忘了端口号
                                        byte[] buff=new byte[1024] ;
                                        DatagramPacket packet=new DatagramPacket(buff,buff.length);
                                        
                                        socket.receive(packet);
                                        
                                        String senderIp=packet.getAddress().getHostAddress();
                                        String senderData=new String(packet.getData(),0,packet.getLength());
                                        int senderPort=packet.getPort();
                                        System.out.println(senderIp+"---"+senderData+"---"+senderPort);
                                        
                                        socket.close();
                                    }
                                }

    //例二,循环的发送和接收

    import java.net.*;
                        import java.io.*;
                        class NewSender{
                            public static void main(String [] args) throws Exception
                            {
                                    System.out.println("发送端启动了");
                                    DatagramSocket socket=new DatagramSocket();
                                    
                                    BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); //包装键盘输入流
                                    String str=null;
                                    while((str=br.readLine())!=null){
                                            byte [] buff=str.getBytes();
                                            DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("127.0.0.1"),9000);
                                            socket.send(packet);
                                    }
                                    
                                    br.close();
                                    socket.close();            
                            }    
                        }
    import java.net.*;
                    class NewReceiver{
                        public static void main(String [] args) throws Exception
                        {
                                DatagramSocket socket=new DatagramSocket(9000);
                                System.out.println("接收端启动了");
                                
                                while(true){ 
                                      byte [] buff=new byte[1024] ; 
                                      DatagramPacket packet=new DatagramPacket(buff,buff.length);
                                      socket.receive(packet);
                                      
                                      String senderIp=packet.getAddress().getHostAddress();
                                      int sendPort=packet.getPort();
                                      String msg= new String(packet.getData(),0,packet.getLength());
                                      
                                      System.out.println(senderIp+":"+sendPort+":"+msg);    
                                }
                        }
                    }

     例三:多线程聊天室程序

    class Chat
            {
                    public static void main(String [] args)
                    {
                            new Thread(new SendThread()).start(); 
                            new Thread(new ReceiveThread()).start(); 
                    }
            }
    //发送端
            import java.io.*;
            import java.net.*;
            class SendThread implements Runnable
            {
                  private DatagramSocket socket;
                    public void run()
                    {
                        try{
                            socket=new DatagramSocket();
                            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                            String msg=null;
                            while((msg=br.readLine())!=null){
                                byte[] buff=msg.getBytes();
                                DatagramPacket packet=new DatagramPacket(buff,buff.length,InetAddress.getByName("127.0.0.1"),10000);
                                socket.send(packet);
                            }
                            
                            socket.close();
                            br.close();
                        }
                        catch(Exception ex){
                            ex.printStackTrace();
                        }
                    }
            }
    //接收端
            import java.net.*;
            class ReceiveThread implements Runnable{    
                    private DatagramSocket socket;
                        
                    public void run(){
                        try{
                            socket=new DatagramSocket(10000);
                            while(true){
                                byte [] buff=new byte[1024];
                                DatagramPacket packet=new DatagramPacket(buff,buff.length);
                                socket.receive(packet);
                                
                                String senderIp=packet.getAddress().getHostAddress();
                                int senderPort=packet.getPort();
                                String msg=new String(packet.getData(),0,packet.getLength());
                                
                                System.out.println(senderIp+":"+senderPort+":"+msg);
            
                            }
                        }
                        catch(Exception ex)
                        {
                            System.out.println(ex.getMessage());
                        }
                    }    
            }

  • 相关阅读:
    [转] packagelock.json
    前端框架和技术
    typescript
    微信小程序登陆流程
    Introduction to my galaxy engine 4: Test on local light model
    Introduction to my galaxy engine 3: Local light model
    Introduction to my galaxy engine 5: Differed Lighting
    Introduction to my galaxy engine 2: Depth of field
    自己整理的一些国外免费3D模型网站,以后还会陆续添加
    Introduction to my galaxy engine 6: Differed Lighting 2
  • 原文地址:https://www.cnblogs.com/1693977889zz/p/7154911.html
Copyright © 2020-2023  润新知