网络编程基础知识

01、两种软件架构(核心由javaweb阶段介绍)

A、BS架构

a.含义
    B:Browser浏览器
    S:Server服务器

b.举例
    淘宝网站、京东商城、百度搜索、CSDN论坛、网页小游戏

c.特点
    直接使用浏览器,访问网站,就可以进去

B、CS架构

a.含义
    C:Client客户端
    S:Server服务器

b.举例
    QQ软件、迅雷软件、酷狗音乐、LOL游戏

c.特点
    需要下载客户端,安装客户端,才能使用

02、网络编程三要素

A、IP地址 (ipv4和ipv6)
    a.查看IP地址的指令 ipconfig
    b.本地默认IP地址 127.0.0.1

B、端口号 
    a. 端口号 范围是 0~65535
    b. 其中 0~1024 属于系统端口,不要使用

C、通信协议
    a.TCP协议
        传输数据大
        安全性高
        速度慢
    b.UDP协议
        传输数据小 64KB
        安全性低
        速度快

TCP通信流程

01、客户端(发送数据)操作步骤

A.创建Socket的对象       // Socket clickSocket = new Socket(\"IP地址\",端口号);
B.获取IO流对象(输出)   // OutputStream os = clickSocket.getOutputStream();
C.写数据               // os.write(\"需要写入的数据\"); //可以进行流的增强
D.释放资源              // os.close();

02、服务端(接收数据)操作步骤

A.创建ServerScoket对象      // ServerSocket serverSocket = new ServerSocket(端口号);
B.连接客户端Socket对象     // Socket clientSocket = serverSocket.accept();
C.获取IO流对象(输入)       // InputStream is = clickSocket.getInputStream();
D.读数据                   // int ch = is.read(); //可以进行流的增强
E.释放资源              // is.close();

03、服务端(回复数据)操作步骤

A.获取IO流对象(输出)   // OutputStream os = clientSocket.getOutputStream();
B.写数据               // os.write(\"需要写回的数据\"); //可以进行增强流
C.释放资源              // os.close();
D.关闭客户端socket       // clickSocket.close();

04、客户端(接收数据)操作步骤

A.获取IO流对象(输入)   // InputStream is = clickSocket.getInputStream();
B.读数据               // int ch = is.read(); //可以进行流的增强
C.释放资源              // is.close();
D.关闭客户端socket       // clickSocket.close();

05、注意事项

A.采用 BufferedReader 和 BufferedWriter 进行读写操作. 
    BufferedWriter 每次写完一个数据,需要换行和刷新.才能被 BufferedReader 读取得到
    原因是: BufferedReader 采用 readLine()读取数据的结束条件是 \"遇到换行符结束\"

B.客户端的 Socket 和 服务端获取客户端Socket要匹配上
    客户端的 Socket ----- 匹配到 ---> 服务端的 serverSocket.accept();

C.常见问题
    a.IP地址如果写错
        处于一种等待的状态. 最终出现 连接超时的情况 Connection timed out: connect
    b.端口号如果写错
        直接拒绝访问. 出现 java.net.ConnectException: Connection refused: connect
    c.服务器重复运行两次及以上
        端口号已经被占用了,不能重复使用    java.net.BindException: Address already in use: NET_Bind

案例

简单交互

//客户端代码
package code.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class client {
    public static void main(String[] args)throws IOException {
        Socket  clientSocket=new Socket(\"192.168.34.57\", 777);
        OutputStream os = clientSocket.getOutputStream();
        os.write(\"你好,服务器\".getBytes());
        os.flush();

        InputStream is = clientSocket.getInputStream();
        int len;
        byte[] a=new byte[1024];
        len=is.read(a);
        System.out.println(new String(a,0,len));
        clientSocket.close();
    }
}

//服务器代码
package code.tcp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class server {
    public static void main(String[] args)throws IOException {
        ServerSocket serverSocket = new ServerSocket(969);
        Socket client = serverSocket.accept();
        InputStream is = client.getInputStream();
        byte[] a=new byte[1024];
        int len;
        len=is.read(a);
        System.out.println(new String(a,0,len));

        OutputStream os = client.getOutputStream();
        os.write(\"收到谢谢\".getBytes());
        os.flush();
        client.close();
    }
}

文件上传

//服务器多线程提高效率,且重命名避免文件被覆盖
//客户端代码
package code.shangchuan.youhua;
import java.io.*;
import java.net.Socket;

public class clientsocket {
    public static void main(String[] args)throws IOException {
        FileInputStream fis=new FileInputStream(\"f:\\\\音乐\\\\残酷月光.mp3\");
        Socket client=new Socket(\"192.168.34.92\",985);
        OutputStream os = client.getOutputStream();
        int len;
        byte[] b=new byte[1024];
        while ((len=fis.read(b))!=-1){
            os.write(b,0,len);
        }
        client.shutdownOutput();
        BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream()));
        String line;
        while((line=br.readLine())!=null){
            System.out.println(line);
        }
        fis.close();
        client.close();
    }
}

//服务器代码
package code.shangchuan.youhua;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args)throws IOException {
        ServerSocket ser=new ServerSocket(985);
        while (true) {
          Socket client = ser.accept();
          new Thread(()->{
              try {
                  upLoadFilm(client);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }).start();
        }
    }
    private static void upLoadFilm(Socket client) throws IOException {
        String path=\"f:\\\\\"+System.currentTimeMillis()+\".mp3\";
        FileOutputStream fos=new FileOutputStream(path);
        InputStream is = client.getInputStream();
        int len;
        byte[] b=new byte[1024];
        while((len=is.read(b))!=-1){
            fos.write(b,0,len);
        }
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        bw.write(\"上传完毕,请查收\");
        bw.newLine();
        bw.flush();
        fos.close();
        client.close();
    }
}

收藏 打印