网络编程基础知识

网络编程基础知识

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();
    }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值