zoukankan      html  css  js  c++  java
  • JAVA笔记26-网络编程(不等于网站编程)

    一、网络基础(TCP/IP详解)

     

    1、IP协议(Internet Protocol):网络层,支持网间数据报通信。无连接数据报传送,数据报路由选择和差错控制。

    IPv4 32位(4字节),IPv6 128位(16字节)。P

    ping ICMP协议

    2、TCP协议、UDP协议

    (1)TCP(transmission control protocol 打电话):专门设计用于在不可靠的因特网上提供可靠的、端到端的字节流通信的协议。它是一种面向连接的协议。有三次握手。慢

    (2)UDP(user data protocol 寄信):提供了一种发送封装的原始IP数据报的方法、并且发送时无需建立连接,是一种不可靠的连接。快

    二、Socket

    两个Java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。

    Socket通常用来实现client-server连接。

    java.net包中定义的两个类Socket和ServerSocket,分别用来实现双向连接(TCP连接)的client和server端。

    建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port number)。端口号2字节,可以区分不同的应用程序。端口号又分TCP端口和UDP端口,每个都是65536个端口。

    例如:

    收邮件 POP3 110

    STMP 25

    FTP 21

    HTTP 80

    1、TCP Socket通信模型

    这只是练习,实际上的网络编程都是异步式的。System.in,accept(),readUTF()都是阻塞式的(非重点)

    例1

    import java.net.*;
    import java.io.*;
    public class TCPServer{
        public static void main(String args[]) throws Exception{
            ServerSocket ss = new ServerSocket(6666);//端口号6666
            while(true){
                Socket s = ss.accept();
                System.out.println("a client connect!");
                DataInputStream dis = new DataInputStream(s.getInputStream());
                System.out.println(dis.readUTF());
                dis.close();
                s.close();
            }
        }
    }
    import java.net.*;
    import java.io.*;
    public class TCPClient{
        public static void main(String args[]) throws Exception{
            Socket s = new Socket("127.0.0.1",6666);
            OutputStream os = s.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF("hello server!");
            dos.flush();
            dos.close();
            s.close();
        }
    }

     例2

    import java.io.*;
    import java.net.*;
    public class TestServer{
        public static void main(String[] args){
            try{
                ServerSocket s = new ServerSocket(8888);//服务器端口号8888
                while(true){
                    Socket s1 = s.accept();
                    OutputStream os = s1.getOutputStream();
                    DataOutputStream dos = new DataOutputStream(os);
                    dos.writeUTF("Hello,"+s1.getInetAddress()+"port#"+s1.getPort()+" byebye!");//客户端的IP地址和端口号
                    dos.close();
                    s1.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    import java.net.*;
    import java.io.*;
    public class TestClient{
        public static void main(String[] args){
            try{
                Socket s1 = new Socket("127.0.0.1",8888);//服务器地址和端口号
                InputStream is = s1.getInputStream();
                DataInputStream dis = new DataInputStream(is);
                System.out.println(dis.readUTF());
                dis.close();
                s1.close();
            }catch(ConnectException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

    例3

    import java.io.*;
    import java.net.*;
    public class TestServer{
        public static void main(String[] args){
            InputStream in = null;
            OutputStream out = null;
            try{
                ServerSocket ss = new ServerSocket(5888);//设置端口号
                Socket s1 = ss.accept();
                in = s1.getInputStream();
                out = s1.getOutputStream();
                DataOutputStream dos = new DataOutputStream(out);
                DataInputStream dis = new DataInputStream(in);
                String s = null;
                if((s=dis.readUTF())!=null){
                    System.out.println(s);
                    System.out.println("from: "+s1.getInetAddress());
                    System.out.println("Port: "+s1.getPort());
                }
                dos.writeUTF("hi,hello");
                dis.close();
                dos.close();
                s1.close();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    import java.net.*;
    import java.io.*;
    public class TestClient{
        public static void main(String[] args){
            InputStream in = null;
            OutputStream out = null;
            try{
                Socket s1 = new Socket("localhost",5888);//服务器地址和端口号
                in = s1.getInputStream();
                out = s1.getOutputStream();
                DataInputStream dis = new DataInputStream(in);
                DataOutputStream dos = new DataOutputStream(out);
                dos.writeUTF("hey");
                String s = null;
                if((s=dis.readUTF())!=null){
                    System.out.println(s);    
                }
                dos.close();
                dis.close();
                s1.close();
            }catch(UnknownHostException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

     练习4:(by myself)

    import java.io.*;
    import java.net.*;
    public class TestServer{
        public static void main(String[] args){
            InputStream in = null;
            OutputStream out = null;
            String si = null;
            String so = "";
            try{
                ServerSocket ss = new ServerSocket(5888);//设置端口号
                while(true){
                    Socket s1 = ss.accept();
                    in = s1.getInputStream();//接收数据
                    out = s1.getOutputStream();//发送数据
                    DataInputStream dis = new DataInputStream(in);
                    DataOutputStream dos = new DataOutputStream(out);
                    //从键盘读入
                    InputStreamReader isr2 = new InputStreamReader(System.in);
                    BufferedReader br2 = new BufferedReader(isr2);
                    while(!so.equals("exit")){
                        if((so=br2.readLine())!=null&&!so.equals("exit")){
                            System.out.println("Server:"+so);
                            dos.writeUTF(so);
                        }
                        if((si=dis.readUTF())!=null){
                            System.out.println("Client:"+si);    
                        }    
                    }    
                    dis.close();
                    br2.close();
                    dos.close();
                    s1.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }
    import java.net.*;
    import java.io.*;
    public class TestClient{
        public static void main(String[] args){
            InputStream in = null;
            OutputStream out = null;
            String si = null;
            String so= "";
            try{
                Socket s1 = new Socket("127.0.0.1",5888);//服务器地址和端口号
                in = s1.getInputStream();//接收
                out = s1.getOutputStream();//发送
                DataInputStream dis = new DataInputStream(in);
                DataOutputStream dos = new DataOutputStream(out);
                //从键盘读入
                InputStreamReader isr2 = new InputStreamReader(System.in);
                BufferedReader br2 = new BufferedReader(isr2); 
                while(!so.equals("exit")){
                    if((si=dis.readUTF())!=null){
                        System.out.println("Server:"+si);    
                    }    
                    if((so=br2.readLine())!=null&&!so.equals("exit")){
                        System.out.println("Client:"+so);
                        dos.writeUTF(so);
                    }
                }        
                dis.close();
                br2.close();
                dos.close();
                s1.close();
            }catch(UnknownHostException e){
                e.printStackTrace();
            }catch(IOException e){
                e.printStackTrace();
            }
        }
    }

     2、UDP Socket通信模型

    没有server,client的概念,不区分两者的socket。receive()方法也是阻塞式的。

    例1

    import java.net.*;
    public class TestUDPServer{
        public static void main(String args[]) throws Exception{
            byte buf[] = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            DatagramSocket ds = new DatagramSocket(5678);
            while(true){
                ds.receive(dp);
                System.out.println(new String(buf, 0, dp.getLength()));
            }
        }
    }
    import java.net.*;
    public class TestUDPClient{
        public static void main(String args[]) throws Exception{
            byte[] buf = (new String("Hello")).getBytes();
            DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1", 5678));
            DatagramSocket ds = new DatagramSocket(9999);
            ds.send(dp);
            ds.close();
        }
    }

     例2

    import java.net.*;
    import java.io.*;
    public class TestUDPServer{
        public static void main(String args[]) throws Exception{
            byte buf[] = new byte[1024];
            ByteArrayInputStream bais = new ByteArrayInputStream(buf);//从字节数组读数据
            DataInputStream dis = new DataInputStream(bais);
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            DatagramSocket ds = new DatagramSocket(5678);
            while(true){
                ds.receive(dp);
                long l = dis.readLong();
                System.out.println(l);
            }
        }
    }
    import java.net.*;
    import java.io.*;
    public class TestUDPClient{
        public static void main(String args[]) throws Exception{
            long n = 10000L;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeLong(n); 
            byte[] buf = baos.toByteArray();
            System.out.println(buf.length);
            DatagramPacket dp = new DatagramPacket(buf,buf.length,new InetSocketAddress("127.0.0.1",5678));
            DatagramSocket ds = new DatagramSocket(9999);
            ds.send(dp);
            ds.close();
        }
    }
  • 相关阅读:
    c++程序—冒泡排序法(函数、指针)
    c++程序—统计成绩
    c++程序—冒泡排序法
    c++程序—逆置
    c++程序—五只小猪称体重
    c++程序—goto
    c++程序—乘法表
    c++程序—循环嵌套
    RGB保存 .bmp文件踩坑记
    vdi文件扩容
  • 原文地址:https://www.cnblogs.com/seven7seven/p/3688392.html
Copyright © 2011-2022 走看看