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