java开发的第二十二个博客(网络编程)

标题

1.网络编程

  • 在实现网络互连的不同计算机上的运行程序进行数据交换

2.软件结构

  • C/S结构 :客户端和服务器结构
  • B/S结构 :浏览器和服务器结构

3.网络模型分类
OSI七层模型----------TCP协议/IP地址
在这里插入图片描述

4.TCP协议下两个常用类名称

  • ServerSocket类:模拟服务器
  • Socket类:模拟客户端

5.网络应用程序的组成

  • 网络编程
  • IO流
  • 多线程

6.网络编程三要素

  • IP地址(计算机的唯一标识)

  • 端口(应用程序的标识)

     概念:正在运行的程序标记
     有效端口:0-65535  其中0-1024是系统使用或保留端口
    
  • 协议(通信的规则)

     UDP:将数据打包,数据大小有限制(64k),不建立连接,速度快,不可靠
     TCP:建立连接通道,数据无限制,速度慢,可靠
    

7.网络编程DOS命令

  • ipconfig 查看本机ip地址
  • ping 后跟IP地址,测试本机与该ip地址通信是否有问题
  • 特殊ip地址:127.0.0.1回环地址(表示本机)

8.结尾问题

由于管道流在接收数据时没有接收到结束标记,所以服务器不知道客户端已结束,
而服务器还在等待发出反馈

9.解决方案

1.多写一条数据告知服务器已结束(不好,该数据可能在文本已存在,导致提前结束)

2.客户端通过shutdownOutput方法通知服务器文件传输完毕

  • public void shutdownOutput()禁用此套接字的输出流。

注意:在通过字节流创建图片时,在读写数据传入通道的最后一次传输可能不会被传输,
所以要使用其的flush方法刷新缓冲区

10.Socket编程

  • 概念:等于网络编程=套接字编程
  • 包含了IP地址和端口

11.原理机制

  • 通信的两端都有Socket
  • 网络通信其实就是Socket间的通信
  • 数据在两个Socket通过IO流传输

12.三次握手,四次挥手

(1)三次握手

  • 客户端.发起连接
  • 服务器.确认客户端是否发起连接
  • 客户端.确认发起连接

(2)四次挥手

  • 客户端.断开连接
  • 服务器.服务端准备断开连接
  • 服务器.确认客户端是否断开连接
  • 客户端.断开连接
    在这里插入图片描述
    13.文件上传案例

客户端向服务器发送数据
服务端实现:

public class ServerTCP {
    public static void main(String[] args) throws IOException {
       //客户端向服务器发送数据
        System.out.println("服务端启动 , 等待连接 .... ");
        // 1.创建 ServerSocket对象,绑定端口,开始等待连接
        ServerSocket ss = new ServerSocket(6666);//端口要一致,才能绑定
        // 2.接收连接 accept 方法, 返回 socket 对象.
        Socket server = ss.accept();
        // 3.通过socket 获取输入流
        InputStream is = server.getInputStream();
        // 4.一次性读取数据
        // 4.1 创建字节数组
        byte[] b = new byte[1024];
        // 4.2 据读取到字节数组中.
        int len = is.read(b);
        // 4.3 解析数组,打印字符串信息
        String msg = new String(b, 0, len);
        System.out.println(msg);
        //5.关闭资源.
        is.close();
        server.close();
    }
}

客户端实现:

public class ClientTCP {
	public static void main(String[] args) throws Exception {
		System.out.println("客户端 发送数据");
		// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
		Socket client = new Socket("localhost", 6666);//localhost指的是本机ip,也就是我的电脑的ip
		// 2.获取流对象 . 输出流
		OutputStream os = client.getOutputStream();
		// 3.写出数据.
		os.write("你好么? tcp ,我来了".getBytes());
		// 4. 关闭资源 .
		os.close();
		client.close();
	}
}

服务器向客户端回写数据

服务端实现:

public class ServerTCP {
    public static void main(String[] args) throws IOException {
        System.out.println("服务端启动 , 等待连接 .... ");
        // 1.创建 ServerSocket对象,绑定端口,开始等待连接
        ServerSocket ss = new ServerSocket(6666);//端口要一致,才能绑定
        // 2.接收连接 accept 方法, 返回 socket 对象.
        Socket server = ss.accept();
        // 3.通过socket 获取输入流
        InputStream is = server.getInputStream();
        // 4.一次性读取数据
      	// 4.1 创建字节数组
        byte[] b = new byte[1024];
      	// 4.2 据读取到字节数组中.
        int len = is.read(b);
        // 4.3 解析数组,打印字符串信息
        String msg = new String(b, 0, len);
        System.out.println(msg);
      	// =================回写数据=======================
      	// 5. 通过 socket 获取输出流
      	 OutputStream out = server.getOutputStream();
      	// 6. 回写数据
      	 out.write("我很好,谢谢你".getBytes());
      	// 7.关闭资源.
      	out.close();
        is.close();
        server.close();
    }
}

客户端实现:

public class ClientTCP {
	public static void main(String[] args) throws Exception {
		System.out.println("客户端 发送数据");
		// 1.创建 Socket ( ip , port ) , 确定连接到哪里.
		Socket client = new Socket("localhost", 6666);//localhost指的是本机ip,也就是我的电脑的ip
		// 2.通过Scoket,获取输出流对象 
		OutputStream os = client.getOutputStream();
		// 3.写出数据.
		os.write("你好么? tcp ,我来了".getBytes());
      	// ==============解析回写=========================
      	// 4. 通过Scoket,获取 输入流对象
      	InputStream in = client.getInputStream();
      	// 5. 读取数据数据
      	byte[] b = new byte[100];
      	int len = in.read(b);
      	System.out.println(new String(b, 0, len));
		// 6. 关闭资源 .
      	in.close();
		os.close();
		client.close();
	}
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值