java socket 编程,实现客户端和服务端接收信息
#学习笔记/编程/socket
tcp/IP四层模型
- 链路层:数据物理层,光纤,网线之类
- 网络层:用于将传输的数据进行分组,分配到相应的计算机或端口
- 传输层:网络之间进行通信
- 应用层:应用程序
常见网络通信协议
网络双方必须同时遵守才能进行数据交换
UDP:
- 数据源和目的地封装在数据包中
- 数据包大小<64k
- 安全性差,速度快,面向无连接,容易丢包,用于传输即时性数据,比如视频,音频;
TCP
通过三次握手后形成通道,再传输数据,安全性较高。
三次握手
- 客户端发送连接请求,等待服务器确认
- 服务器向客户端发送连接响应
- 客户端再向服务端发连接确认,连接形成。
网络知识
- IPV4:32位二进制数
- IPV6:128位二进制数,分成8组十六进制
- 端口号:进程占用的地址,由两个字节构成(0-65535)
操作系统会为网络软件分配随机端口号/或网络软件申请固定端口号。(1024之前的端口不可使用)
常用端口: 80(网络端口),3306(mysql),1521(oracle),8080(Tomcat)
TCP通信程序流程
通信前
- 服务端监听请求
- 客户端主动连接,连接包含IO对象,一个数据交互要使用四个io流对象
下面以客户端和服务器端互发消息为例
客户端
- 创建客户端对象,绑定服务器IP地址和端口号 Socket(String host , int port);
- 使用客户端对象中的getOutputStream()获取网络字节输出流对象
- 使用网络字节输出流的write方法给服务器发送数据
- 获取网络字节输入流对象
- 使用read方法读服务器回来的数据
- 释放资源;
实现代码
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