【黑马】程序员————网络编程

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-----

一、网络概述

网络编程三要素:

IP

 

IP地址是计算机或设备在网络上的唯一标识。

192.168.1.1 ip地址

255.255.255.0广播地址

Ipv4:4个字节 4个 0-255

 

端口

端口号是每个程序在设备上的唯一标识

常用默认端口号:

mysql:3306  

Oracle:1521

Tomcat:8080

QQ:4000  

FieQ:2425

Apache Nginx:80

 

 

协议

为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

UDP:面向无连接,数据不安全,速度快64K。不区分客户端与服务端。

TCP :面向连接(三次握手),数据安全,速度略低。分为客户端和服务端。

三次握手: 客户端先向服务端发起请求, 服务端响应请求, 传输数据

 

网络模型

OSI七层模型:

 

TCP/IP参考模型

 

Socket通信原理

 

Socket就是为网络服务提供的一种机制。

通信的两端都有Socekt.

数据在Socket两端通过IO传输。

 

 

 

 

二、UDP协议

流程:

1.发送Send

创建DatagramSocket, 随机端口号

创建DatagramPacket, 指定数据, 长度, 地址, 端口

使用DatagramSocket发送DatagramPacket

关闭DatagramSocket

2.接收Receive

创建DatagramSocket, 指定端口号

创建DatagramPacket, 指定数组, 长度

使用DatagramSocket接收DatagramPacket

关闭DatagramSocket

从DatagramPacket中获取数据3.接收方获取ip和端口号

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

int port = packet.getPort();

练习:

 

/*聊天小程序
 *思路:收发同时执行多线程 
 *
*/
import java.io.*;
import java.net.*;
public class ChatDemo {
    public static void main(String[] args) throws SocketException {
        
        
        new Thread(new Send(new DatagramSocket())).start();
        new Thread(new Receive(new DatagramSocket(10001))).start();
    }

}


class Send implements Runnable { //接收信息线程
    
    private DatagramSocket ds ;  //定义成员变量Socket
    
    Send(DatagramSocket ds) {  //构造方法
        
        this.ds = ds;
    }
    public void run() {  //override run方法
        //键盘输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null; 
        
        
        try {
            
            while((line = br.readLine()) != null) {  //循环读取键盘输入,readLine方法为阻塞方法
                
                if(line.endsWith("bye"))  //结束标记
                    break; 
                
                byte[] buf = line.getBytes(); //每读一行存入字节数组
                //封包
                DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.2"),10001);
                ds.send(dp);//发包
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("send fail");
        }
        
        
        
    }
}

class Receive implements Runnable {
    
private DatagramSocket ds ;
    
    Receive(DatagramSocket ds) {
        
        this.ds = ds;
    }
    
    
    
    public void run() {
        
try {
            
            while(true) {
                
                
                byte[] buf = new byte[1024];  //定义字节数组
                
                DatagramPacket dp = new DatagramPacket(buf, buf.length);//定义接受Packet
                ds.receive(dp);//接收已经存入本方Packet的数据包
                
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(),0,dp.getLength());//拆包
                
                System.out.println(ip+"....."+data);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            throw new RuntimeException("send fail");
        }
        
    }
}

 

三、TCP协议

步骤:

创建客户端和服务端

创建ServerSocket和Socket对象

建立链接后通过Socket中的IO进行数据传输:OutputStream = ss.getOutputstream();

关闭Socket

 

 

 

练习一:客户端键盘录入,服务端将录入文本反转并转换为大写

/*小练习,客户端从控制台接收文本信息,发送至服务端,服务端将文本转换为大写后传回客户端并打印到客户端控制台
 * 服务端流程:
 * 1:建立ServerSocket对象,指定服务端监听的portID
 * 2:调用ss.accept()方法获取客户端Socket对象
 * 3:获取IO通道
 * 4:将接收的数据大小写转换,并写入IO通道
 * 
*/


import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Server {
    
    public static void main(String[] args) {
        
        try {
                ServerSocket ss = new ServerSocket(10003);//建立ServerSocket对象,指定服务端监听的portID
                Socket s = ss.accept();//获取客户端Socket示例
                
                PrintWriter ps = new PrintWriter(s.getOutputStream(),true);//打印流自动刷新
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                
                String line = null;
                StringBuffer sb = new StringBuffer();
                while((line = br.readLine()) != null) {
                    
                    sb.append(line);
                    line = sb.reverse().toString();//利用StringBuffer反转字符串
                    ps.println(line.toUpperCase());//大小写转换
                
                }
                
                s.close();
                ss.close();
                
                
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    
        
}
/*客户端
 * 1、建立Socket指定目的IP和端口号
 * 2、建立输入流读取本地控制台
 * 3、建立IO通道
 * 4.发送控制台所接收的数据
 * 5、读取返回来的IO通道数据
 * */




import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client {  
    
    public static void main(String[] args) { 
        
        try {
            
                Socket s = new Socket("192.168.1.101",10003);//建立Socket指向服务器
                Scanner sc = new Scanner(System.in);//Scanner对象接收键盘录入
                
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                
                OutputStream os = s.getOutputStream();
                BufferedWriter bwos = new BufferedWriter(new OutputStreamWriter(os));
                
                String line = null;
                while(true) {
                    
                    
                    line = sc.nextLine();
                    if(line.equals("end"))
                        break;
                    
                    
                    bwos.write(line);
                    bwos.newLine();
                    bwos.flush();
                    
                    
                    System.out.println(br.readLine());
                    
                    
                }
                
                
                s.close();
                
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }
    
        
}

练习二

客户端并发向服务器上传图片

 

/*服务器
 * 
 */
import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws Exception {
        
        ServerSocket ss = new ServerSocket(10003);
        while(true) {
            
            new Thread(new Upload(ss.accept())).start();
            
        }
        
        
        
    }
}

class Upload implements Runnable {  //线程Upload实现上传功能
    
    
    private Socket s;
    
    Upload(Socket s) {
        this.s = s;
    }
    public void run() {
        
        try {
                
            
                BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
                InputStream is = s.getInputStream();
                
                File f = new File("F:\\abc.jpg"); //创建文件
                int count = 0;
                while(f.exists()) {  //重复改名
                    f = new File("F:\\abc("+(++count) +").jpg");
                }
                
                FileOutputStream os = new FileOutputStream(f);
                
                byte[] temp = new byte[1024*1024];
                int len;
                
                while((len = is.read(temp)) != -1) {
                    
                    os.write(temp,0,len);
                }
                
                
                
                String ip = s.getInetAddress().getHostAddress();
                bw.write(new String("ip:...."+ip+ "Upload Down")); //返回信息
                bw.flush();
                bw.close();
                
                os.close();
                s.close();
                
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
        
    }
}

 

/*客户端上传文件至服务器
 * 
 */

import java.io.*;
import java.net.*;

public class Client  {
    public static void main(String[] args) throws Exception {
        
        Socket s = new Socket("192.168.1.101",10003);
        
        FileInputStream localIs = new FileInputStream(new File("F:\\a.jpg")); //本地输入流关联文件
        
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));//网络通道
        OutputStream os = s.getOutputStream();
        
        byte[] temp = new byte[1024*1024];
        int len = 0;
        while((len =localIs.read(temp)) != -1) {
            
            os.write(temp, 0, len);
            
        }
        
        s.shutdownOutput(); //标记,传输完成
        
        System.out.println(br.readLine());  //获取服务器返回信息
        s.close();  //关闭socket,关闭链接释放资源
    }
}

 

 

四、其他网络知识小结

浏览器服务器通信原理:

浏览器相当于一个客户端,在TextField输入服务器地址,解析地址后,获得ip和端口,建立和服务器的连接。

所发送的数据加上报文头,封包,传至服务器。服务器解包处理后,返回数据给客户端,同样加上报文头封包。

客户端解析数据。

 

URL和域名解析

 URL:http:\\www.baidu.com\index.html

域名:www.baidu.com

 

URL url = new Url("");

URLConnection conn = url.openConnection();//应用层网络连接

你可能感兴趣的:(【黑马】程序员————网络编程)