TCP通信
网络编程的入门:
C/S结构 Client/Server 客户端和服务器结构 QQ 微信 迅雷
B/S结构 Browser/Server 浏览器和服务器结构 谷歌 火狐
两种架构各有优势 无论哪种都离不开网络的支持
网络编程:
就是在一定协议下 实现两台计算机的通信程序
网络通信协议:
通信协议是对计算机必须遵守的规则------目的是完成数据交换
TCP/IP 传输控制协议/因特网互联协议 4层分层的模型
1.物理层
数据链路层 底层网络协议
2.网络层 IP
3.传输层 TCP UDP
4.应用层 HTTP
协议分类:
java.net包中 包含类和接口→两种常见的网络协议支持
TCP:面向连接的通信协议
三次握手:
- 客户端向服务器发出请求 等待服务器确认
- 服务端向客户端做出响应 确认请求
- 客户端再次向服务器发出确认请求 确认连接 可以保证数据安全传输 下载文件、浏览网页
UDP:用户数据报协议 面向无连接的协议
- 传输数据不需要连接 不管对方在不在线
- 传输速度快,但是容易丢失数据,不可靠的协议 视屏会议、QQ聊天
网络通信的三要素:
协议
IP IPv4 32位的二级制 42亿 0-255之间
IPv6 解决网络资源不够用的问题
ipconfig:查询自己的IP
ping IP地址 判断网络是否畅通
本机IP:localhost
端口号 网络通信本质是两个进程(应用程序) 端口号用两个字节表示整数 0-65535 0-1023 不能赢知名网络服务已经用了
TCP 通信:
严格区别客户端 Client 服务端:Server
两端通信的步骤:
客户端主动连接服务器,连接成功才能通信
服务器端一定要先启动
java中 提供了两个类 来实现TCP程序
java.net.Socket----------创建对象Socket---------发送请求给服务器 服务器做出响应两者建立通信
java.net.ServleScoket--------创建对象ServleScoket-------相当于开启一个服务 用来等待客户端连接
Socket套接字:
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
构造方法
Scoket(InetAddress address,int port) 创建对象 连接到主机指定的端口号
成员方法
- getInputStream() 套接字的输入流
- getOutputStream() 套接字的输出流
- close()
- shutdownOutput() 禁用此套接字的输出流
ServerScoket:
ServerScoket构造方法
ServerSocket(int port) 绑定一个指定端口号
成员方法
- accept() 监听并且接受连接 用于客户端实现通信 阻塞直到建立连接
上传图片到服务器:
文件上传服务器的原理
- 客户端使用本地字节流 读取本地文件
- 客户端使用网络字节输出流 把图片传到服务器上
- 服务器使用网络字节输入流 读取客户端上传的文件
- 服务器端使用本地字节输出流 把客户端的文件保存到服务器的硬盘上
- 服务器网络输出流 给客户端写传输成功
- 客户端使用网络的字节输入流 读取服务器回写“传输成功”
注意:
客户端/服务器端和本地文件读写 必须用自己的创建流
客户端/服务器端之间的交互 用Socket中提供的网络流
客户端本地------复制------服务器
服务器------复制------服务器本地硬盘
必须清楚: 数据源 目的地
ServerScoket:
package cn.kgc.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args)throws IOException {
//建立服务器ServerSocket对象,并指定端口号
ServerSocket serverSocket = new ServerSocket(8800);
//通过建立的服务器ServerSocket对象调用其accept()方法监听并获得客户端的Socket对象
Socket socket = serverSocket.accept();
//通过监听获得的客户端的Socket对象调用getInputStream()方法获取网络输入流对象
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
//使用网络输入流对象的read()方法读取客户端发送的数据
int read = is.read(bytes);
System.out.println(new String(bytes,0,read));
//通过监听获得的客户端的Socket对象调用getOutputStream()方法获取网络输出流对象
OutputStream os = socket.getOutputStream();
//使用网络输出流对象的write()方法回应客户端
os.write("OK~".getBytes());
//释放资源
socket.close();
serverSocket.close();
}
}
Socket:
package cn.kgc.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args)throws IOException {
//建立客户端Socket对象,指定(封装)IP地址和端口号
Socket socket = new Socket("localhost",8800);
//通过建立的客户端Socket对象调用其getOutputStream()方法获得网络输出流对象
OutputStream os = socket.getOutputStream();
//使用网络输出流对象的write()方法向服务器写入数据发出请求
os.write("你好,服务器".getBytes());
//通过建立的客户端Socket对象调用其getInputStream()方法获得网络输入流对象
InputStream is = socket.getInputStream();
byte[] bytes = new byte[1024];
//使用网络输入流对象的read()方法读取服务器回应的数据信息
int read = is.read(bytes);
System.out.println(new String(bytes,0,read));
//关闭流对象
socket.close();
}
}