黑马程序员-java网络编程总结

-------<a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流!----------


一:概述


  1、网络模型
        OSI参考模型      TCP/IP参考模式
        应用层          应用层
        表示层
        会话层
        传输层          传输层
        网络层          网际层
        数据链路层
        物理层          主机至网络层
    2、网络通讯要素
        (1)、IP地址
        (2)、端口号
        (3)、传输协议
    3、过程
        (1)、找到对方 IP
        (2)、数据要发到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行了标识。为了方便称呼这个数字,叫做端口。(逻辑端口)
        (3)、定义通信规则。这个通讯规则成为协议。


  4、网络编程(IP地址)
     1、IP地址
        (1)、网络中设备的标识
        (2)、不易记忆,可用主机名
        (3)、本地回环地址:127.0.0.1主机名:localhost
     2、端口号
        (1)、用于标识进程的逻辑地址,不同进程的标识
        (2)、有效端口:0~65535,其中0~1024系统使用或保留端口
     3、传输协议
        (1)、通讯的规则
        (2)、常见协议:TCP,UDP

     TCP和UDP
       1、UDP
          (1)、将数据及源和目的封装成数据包中,不需要建立连接
          (2)、每个数据包的大小限制在64k内
          (3)、因无连接,是不可靠协议
          (4)、不需要建立连接,速度快
       2、TCP
          (1)、建立连接,形成传输数据的通道
          (2)、在连接中进行大数据量传输
          (3)、通过三次捂手完成连接,是可靠协议
          (4)、必须建立连接,效率会稍低
 5、Socket
    1、Socket就是为网络服务提供的一种机制
    2、通信的两端都有Socket
    3、网络通信其实就是Soket间的通信
    4、数据在两个Socket间通过IO传输
 6、Udp-发送端
    1、DatagramSocket与DatagramPacket
    2、简历发送端,接收端
    3、建立数据包
    4、调用Socket的发送接收方法
    5、关闭Socket
    发送端与接收端是两个独立运行的程序
public class DatagramSocketextends Object 此类表示用来发送和接收数据报包的套接字。
public final class DatagramPacketextends Object 此类表示数据报包。

 

二:Udp-接收端

 

/* 

需求:通过udp阐述方式,将一段文字数据发送出去 

思路: 

1、建立udpsocket服务 

2、提供数据,并将数据封装到数据包中 

3、通过socket服务的发送功能,将数据包发送出去 

4、关闭资源 

 

 

 

 

需求:定义一个应用程序,用于接收udp协议传输的数据并处理 

要定义udp接收端 

思路: 

1、创建udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识,方便于明确哪些数据过来该应用可以处理 

2、定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息 

3、通过socket服务的receive方法将收到的数据存入到已定义好的数据包中 

4、通过数据包对象的特有功能。将这些不同的数据取出,打印在控制台上。 

5、关闭资源 

代码示例:

*/

import java.net.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

        new UdpRece().start();  

        new UdpSend().start();  

    }  

    public static void sop(Object obj){  

        System.out.println(obj);  

    }  

}  

class UdpSend extends Thread{  

    public void run(){  

        try{  

            //1、创建UDP服务,通过DatagramSocket对象  

            DatagramSocket ds = new DatagramSocket();//可设置端口  

            //2、确定数据,并封装成数据包  DatagramPacket(byte[] buf, int length, InetAddress address, int port)  

            byte[] buf = "udp ge men lai le".getBytes();  

            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);  

            //3、通过socket服务,将已有的数据包发送出去,通过send方法  

            ds.send(dp);  

            //4、关闭资源  

            ds.close();  

        }catch(Exception e){  

              

        }  

    }  

}  

class UdpRece extends Thread{  

    public void run(){  

        try{  

            //1、创建UDP服务,建立端点。  

            DatagramSocket ds = new DatagramSocket(10000);  

            //2、定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息 DatagramPacket(byte[] buf, int length)   

            byte[] buf = new byte[1024];  

            DatagramPacket dp = new DatagramPacket(buf,buf.length);  

            //3、通过socket服务的receive方法将收到的数据存入到已定义好的数据包中  

            ds.receive(dp);  

            //4、通过数据包对象的特有功能。将这些不同的数据取出,打印在控制台上。  

            String ip = dp.getAddress().getHostAddress();  

            String data = new String(dp.getData(),0,dp.getLength());  

            int port = dp.getPort();  

            Demo.sop(ip+"::"+data+"::"+port);  

            //5、关闭资源  

            ds.close();  

        }catch(Exception e){  

              

        }  

    }  

}  



三、UDP-键盘录入方式数据

 

/* 

需求:通过udp阐述方式,将一段文字数据发送出去 

思路: 

1、建立udpsocket服务 

2、提供数据,并将数据封装到数据包中 

3、通过socket服务的发送功能,将数据包发送出去 

4、关闭资源 

 

 

 

 

需求:定义一个应用程序,用于接收udp协议传输的数据并处理 

要定义udp接收端 

思路: 

1、创建udpsocket服务,通常会监听一个端口,其实就是给这个接收网络应用程序定义数字标识,方便于明确哪些数据过来该应用可以处理 

2、定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息 

3、通过socket服务的receive方法将收到的数据存入到已定义好的数据包中 

4、通过数据包对象的特有功能。将这些不同的数据取出,打印在控制台上。 

5、关闭资源 

*/  

import java.net.*;  

import java.io.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

        new UdpRece().start();  

        new UdpSend().send();  

    }  

    public static void sop(Object obj){  

        System.out.println(obj);  

    }  

}  

class UdpSend{  

    public void send() throws Exception{  

        //1、创建UDP服务,通过DatagramSocket对象  

        DatagramSocket ds = new DatagramSocket();  

        //2、确定数据,并封装成数据包  DatagramPacket(byte[] buf, int length, InetAddress address, int port)  

        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  

        String line = null;  

        while((line=bufr.readLine())!=null){  

            if("886".equals(line)){  

                break;  

            }  

            byte[] buf = line.getBytes();  

            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000);//如果改为192.168.1.255,广播,则都能收到  

            //3、通过socket服务,将已有的数据包发送出去,通过send方法  

            ds.send(dp);  

        }  

          

  

  

        //4、关闭资源  

        ds.close();  

    }  

}  

class UdpRece extends Thread{  

    public void run(){  

        try{  

            while(true){  

                //1、创建UDP服务,建立端点。  

                DatagramSocket ds = new DatagramSocket(10000);  

                //2、定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息 DatagramPacket(byte[] buf, int length)   

                byte[] buf = new byte[1024];  

                DatagramPacket dp = new DatagramPacket(buf,buf.length);  

                //3、通过socket服务的receive方法将收到的数据存入到已定义好的数据包中  

                ds.receive(dp);  

                //4、通过数据包对象的特有功能。将这些不同的数据取出,打印在控制台上。  

                String ip = dp.getAddress().getHostAddress();  

                String data = new String(dp.getData(),0,dp.getLength());  

                int port = dp.getPort();  

                Demo.sop(ip+"::"+data+"::"+port);  

                //5、关闭资源  

                ds.close();  

            }  

        }catch(Exception e){  

              

        }  

    }  

}  



四、UDP-聊天(接收,发送功能)

 

/* 

编写一个聊天程序 

有收数据的部分,和发数据的部分 

这两部分需要同时执行 

那就需要用到多线程技术 

一个线程控制收,一个线程控制发 

 

 

因为收和发动作是不一致的,所以要定义两个run方法 

而且这两个方法要封装到不同的类中 

 

 

*/  

代码示例:

import java.net.*;  

import java.io.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

        DatagramSocket sendSocket = new DatagramSocket();  

        DatagramSocket receSocket = new DatagramSocket(10000);  

        new Thread(new Send(sendSocket)).start();  

        new Thread(new Rece(receSocket)).start();  

    }  

    public static void sop(Object obj){  

        System.out.println(obj);  

    }  

}  

class Send implements Runnable{  

    private DatagramSocket ds;  

    Send(DatagramSocket ds){  

        this.ds = ds;  

    }  

    public void run(){  

        try{  

            BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  

            String line = null;  

            while((line=bufr.readLine())!=null){  

                if("886".equals(line))  

                    break;  

                byte[] buf = line.getBytes();  

                DatagramPacket dp = new DatagramPacket(buf,0,buf.length,InetAddress.getByName("192.168.1.255"),10000);  

                ds.send(dp);  

            }  

        }catch(Exception e){  

            throw new RuntimeException("发送失败");  

        }finally{  

            ds.close();  

        }  

    }  

}  

class Rece implements Runnable{  

    private DatagramSocket ds;  

    Rece(DatagramSocket ds){  

        this.ds = ds;  

    }  

    public void run(){  

        try{  

            while(true){  

                byte[] buf = new byte[1024];  

                DatagramPacket dp = new DatagramPacket(buf,buf.length);  

                ds.receive(dp);  

                String ip = dp.getAddress().getHostAddress();  

                String data = new String(dp.getData(),0,dp.getLength());  

                Demo.sop(ip+"::"+data);  

            }  

        }catch(Exception e){  

            throw new RuntimeException("接收失败");  

        }finally{  

            ds.close();  

        }  

    }  

五、TCP传输

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

 

/* 

演示TCP传输 

 

 

1、Tcp分客户端和服务端 

2、客户端对应的是Socket,服务端对应的是ServerSocket 

 

 

 

 

 

 

客户端 

通过查阅 Socket 对象,发现在该对象建立时,就可以去连接指定主机 

因为tcp是面向连接的,所以在建立socket服务时,就要有服务端存在,并连接成功,形成通路后,在该通道进行数据的传输 

步骤: 

1、创建Socket服务,并制定要连接的主机和端口。 

 

 

 

 

 

 

需求:给服务端发送一个文本数据 

步骤 

 

 

*/  

 

代码示例:

import java.net.*;  

import java.io.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

          

    }  

    public static void sop(Object obj){  

        System.out.println(obj);  

    }  

}  

class TcpClient{  

    public static void main(String[] args) throws Exception{  

        //创建客户端的Socket服务,指定目的主机和端口  

        Socket s = new Socket("127.0.0.1",10000);  

          

        //为了发送数据,应该获取socket流中的输出流  

        OutputStream out = s.getOutputStream();  

          

        out.write("tcp ge men lai le ".getBytes());  

        s.close();  

    }  

}  

/* 

需求:定义端点接收数据并打印在控制台上 

 

 

服务端: 

1、建立服务端的socket服务,ServerSocket(); 

    并监听一个端口 

2、获取连接过来的客户段对象 

    通过ServerSocket 的 accept方法,所以这个方法是阻塞式的 

3、客户端如果发过来数据,服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据 

4、关闭服务.(可选) 

*/  

class TcpServer{  

    public static void main(String[] args) throws Exception{  

        //建立服务端socket服务,并监听一个端口  

        ServerSocket ss = new ServerSocket(10000);  

        //通过accept方法获取链接过来的客户端对象  

        Socket s = ss.accept();  

          

        String ip = s.getInetAddress().getHostAddress();  

          

        Demo.sop(ip);  

          

        //获取客户端发过来的数据,那么要使用客户端对象的读取刘来读取数据  

        InputStream in = s.getInputStream();  

        byte[] buf = new byte[1024];  

        int len = in.read(buf);  

        Demo.sop(new String(buf,0,len));  

        s.close();  

        ss.close();  

    }  

}  

 

六、TCP-客户端并发上传图片

代码示例:

import java.io.*;  

import java.net.*;  

public class Demo{  

    public static void main(String[] args){  

          

    }  

}  

/* 

需求:上传图片。 

 

 

*/  

/* 

客户端: 

1、服务端点。 

2、读取客户端已有的图片数据 

3、通过Socket输出流,将数据发给服务端 

4、读取服务端反馈的信息 

5、关闭 

*/  

  

  

class PicClient{  

    public static void main(String[] args) throws Exception{  

        if(args.length!=1){  

            System.out.println("请选择一个jpg格式的图片");  

            return;  

        }  

        File file = new File(args[0]);  

        if(!(file.exists()&&file.isFile())){  

            System.out.println("该文件有问题,要么不存在,要不不是文件");  

            return;  

        }  

        if(!file.getName().endsWith(".jpg")){  

            System.out.println("图片格式错误,请重新选择jpg");  

            return;  

        }  

        if(file.length()>1024*1024){  

            System.out.println("图片过大");  

            return;  

        }  

        Socket s = new Socket("127.0.0.1",10007);  

        FileInputStream fis = new FileInputStream(file);  

        OutputStream out = s.getOutputStream();  

        byte[] buf = new byte[1024];  

        int len = 0;  

        while((len=fis.read(buf))!=-1){  

            out.write(buf,0,len);  

        }  

        s.shutdownOutput();  

        InputStream in = s.getInputStream();  

        byte[] bufIn = new byte[1024];  

        int num = in.read(bufIn);   

        System.out.println(new String(bufIn,0,num));  

        fis.close();  

        s.close();  

    }  

}  

/* 

服务端: 

这个服务端有个局限性。当a客户端连接上后,被服务端获取到,服务段执行具体流程, 

、b客户端只有等待, 

因为服务端 还没有处理完a客户端的请求,还有循环回来执行下次accept方法,所以 

暂时获取不到b客户端对象 

那么为了可以让多个客户端同时并发访问服务端 

那么服务端最好是将每个客户端封装到一个单独的线程中,这样,就可以同时处理多个客户端请求 

 

 

如何定义线程呢? 

只要明确了每一个客户端要在服务端执行的代码即可,将该代码存入到run方法中 

*/  

class PicThread implements Runnable{  

    private Socket s;  

    PicThread(Socket s){  

        this.s = s;  

    }  

    public void run(){  

        String ip = s.getInetAddress().getHostAddress();  

        try{  

            int count = 1;  

            System.out.println(ip+".....conneted");  

            InputStream in = s.getInputStream();  

              

              

            File file = new File(ip+".jpg");  

              

            while(file.exists()){  

                file = new File(ip+"("+(count++)+").jpg");  

            }  

              

            FileOutputStream fos = new FileOutputStream(file);  

            byte[] buf = new byte[1024];  

            int len = 0;  

            while((len=in.read(buf))!=-1){  

                fos.write(buf,0,len);  

            }  

            OutputStream out = s.getOutputStream();  

            out.write("上传成功".getBytes());  

            System.out.println(ip+".....success");  

            fos.close();  

            s.close();  

        }catch(Exception e){  

            throw new RuntimeException("上传失败");  

        }  

    }   

}  

class PicServer{  

    public static void main(String[] args) throws Exception{  

        ServerSocket ss = new ServerSocket(10007);  

        while(true){  

            Socket s = ss.accept();  

            new Thread(new PicThread(s)).start();  

        }  

        //ss.close();  

    }  

}  



七、TCP-客户端并发登录

代码示例:

/* 

客户端通过键盘录入用户名 

服务端对这个用户名进行校验 

 

 

如果该用户存在,在服务端显示xxx,已登录 

并在客户端显示,xxx,欢迎光临 

 

 

如果该用户不存在,在服务器端显示xxx,尝试登陆 

并在客户端显示 xxx,该用户不存在 

 

 

最多就登陆三次 

*/  

import java.io.*;  

import java.net.*;  

public class Demo{  

    public static void main(String[] args){  

          

    }  

}  

/* 

需求:上传图片。 

 

 

*/  

/* 

客户端: 

 */  

  

  

class LoginClient{   

    public static void main(String[] args) throws Exception{  

        Socket s = new Socket("127.0.0.1",10008);  

        BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));  

        PrintWriter out = new PrintWriter(s.getOutputStream(),true);  

        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));  

        for(int x= 0;x<3;x++){  

            String line = bufr.readLine();  

            if(line == null||line.length()==0)  

                break;  

            out.println(line);  

            String info = bufIn.readLine();  

            System.out.println("info:"+info);  

            if(info.contains("欢迎"))  

                break;  

        }   

        bufr.close();  

        s.close();  

    }  

}  

/* 

服务端: 

 

 

*/  

class UserThread implements Runnable{  

    private Socket s;  

    UserThread(Socket s){  

        this.s = s;  

    }  

    public void run(){  

        String ip = s.getInetAddress().getHostAddress();  

        try{  

            for(int x=0;x<3;x++){  

                BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));  

                String name = bufIn.readLine();  

                if(name==null)  

                    break;  

                BufferedReader bufr = new BufferedReader(new FileReader("user.txt"));  

                PrintWriter out = new PrintWriter(s.getOutputStream(),true);  

                String line = null;  

                boolean flag = false;  

                while((line = bufr.readLine())!=null){  

                    if(line == null)  

                        break;  

                    if(line.equals(name)){  

                        flag =true;  

                        break;  

                    }  

                }  

                if(flag){  

                    System.out.println(name+"已登录");  

                    out.println(name+",欢迎观临");  

                    break;  

                }else{  

                    System.out.println(name+"尝试登陆");  

                    out.println(name+",用户名不存在");  

                }  

            }  

            s.close();  

        }catch(Exception e){  

            throw new RuntimeException(ip+"校验失败");  

        }  

    }   

}  

class LoginServer{  

    public static void main(String[] args) throws Exception{  

        ServerSocket ss = new ServerSocket(10008);  

        while(true){  

            Socket s = ss.accept();  

            new Thread(new UserThread(s)).start();  

        }  

    }  

}  

 

 

八:自定义浏览器-Tomcat服务端



代码示例:

/* 

演示客户端和服务端 

1、 

客户端:浏览器 

服务端:自定义 

 

 

2、 

客户端:浏览器 

服务端:Tomcat 服务器 

 

 

3、 

客户端:自定义 

服务端:Tomcat服务器 

*/  

import java.io.*;  

import java.net.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

        Socket s = new Socket("127.0.0.1",8080);  

        PrintWriter out = new PrintWriter(s.getOutputStream(),true);  

        out.println("GET /myweb/index.html HTTP/1.1");  

        out.println("Accept: */*");  

        out.println("Accept-Language: zh-cn");  

        out.println("Host: 127.0.0.1:11000");  

        out.println("Connection: Keep-Alive");  

        out.println();  

        out.println();  

        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream()));  

        String line =null;  

        while((line=bufr.readLine())!=null){  

            System.out.println(line);  

        }  

        s.close();  

    }  

}  



九、URL-URLConnection

 

URL(String spec)  根据 String 表示形式创建 URL 对象。  

URL(String protocol, String host, int port, String file)  根据指定 protocol、host、port 号和 file 创建 URL 对象。  

 

 

 Object getContent()  获取此 URL 的内容。  

 Object getContent(Class[] classes)  获取此 URL 的内容。  

 int getDefaultPort()  获取与此 URL 关联协议的默认端口号。  

 String getFile()   获取此 URL 的文件名。  

 String getHost()  获取此 URL 的主机名(如果适用)。  

 String getPath()  获取此 URL 的路径部分。  

 int getPort()  获取此 URL 的端口号。  

 String getProtocol()  获取此 URL 的协议名称。  

 String getQuery()  获取此 URL 的查询部分。 

 

代码示例:

import java.io.*;  

import java.net.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

        URL url = new URL("http://127.0.0.1:8080/myweb/index.html?a=1&b=2");  

        sop("getDefaultPort() :"+url.getDefaultPort());//getDefaultPort() :80  

        sop("getFile() :"+url.getFile());//getFile() :/myweb/index.html  

        sop("getHost() :"+url.getHost());//getHost() :127.0.0.1  

        sop("getPath() :"+url.getPath());//getPath() :/myweb/index.html  

        sop("getPort() :"+url.getPort());//getPort() :8080,如果没有填,则获取的时候,会返回-1,可以判断是否为-1,给他一个端口号  

        sop("getProtocol() :"+url.getProtocol());//getProtocol() :http  

        sop("getQuery() :"+url.getQuery());//getQuery() :a=1&b=2  

  

  

    }  

    public static void sop(Object obj){  

        System.out.println(obj);  

    }  

}  

  

  

/* 

URLConnection openConnection() 返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。  

*/  

import java.io.*;  

import java.net.*;  

public class Demo{  

    public static void main(String[] args) throws Exception{  

        URL url = new URL("http://127.0.0.1:8080/myweb/index.html");  

        URLConnection conn = url.openConnection();  

        InputStream in = conn.getInputStream();  

        BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));   

        String line = null;  

        while((line = br.readLine())!=null){  

            sop(line);  

        }  

    }  

    public static void sop(Object obj){  

        System.out.println(obj);  

    }  

}  

 

------- <ahref="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值