Socket网络编程入门篇
一.网络编程概述
-
什么是网络?
- 在计算机领域中,网络是信息传输、接收、共享的虚拟平台
-
什么是网络编程?
- 通过操作相应API调度计算机硬件资源,并利用传输管道(网线)进行数据交换的过程
-
7层网络模型
- 基础层:物理层(Physical)、数据链路层(Datalink)、网络层(Network)
- 传输层:TCP-UDP协议层、Socket
- 高级层:会话层(Session)、表示层(Presentation)、应用层(Application)
二.Socket与TCP、UDP
-
什么是Socket
- 是IP地址与端口的结合协议(RFC 793)
- 一种地址与端口的结合描述协议
- TCP/IP协议的相关API总称,是网络API的集合实现
-
Socket的作用与组成
- 在网络传输中用于唯一标识两个端点之间的连接
- 端点:IP+Port
- 4个要素:客户端地址、客户端端口、服务器地址、服务器端口
-
Socket——TCP
- TCP是面向连接的通信协议
- 通过三次握手建立连接,通讯完成时拆除连接
- 只能用于端到端的通讯
-
Socket——UDP
- UDP是面向无连接的通讯协议
- UDP数据包括目的端口号和源端口号信息
- 该通讯不需要连接,可以实现广播发送,不局限于端到端
-
Client-Server Application
- TCP/IP协议中,两个进程间通信的主要模式为 CS模型
- 目的:协同网络中计算机资源、服务模式、进程间数据共享
三.Socket TCP-客户端和服务端简单实现
-
客户端(Client)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62public class Client {
public static void main(String[] args) throws IOException {
//初始化Socket
Socket socket = new Socket();
//超时时间
socket.setSoTimeout(3000);
//连接本地,端口2000,超时时间3000毫秒
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000),3000);
System.out.println("已发起服务器连接,并进入后续流程");
System.out.println("客户端信息:"+socket.getLocalAddress()+"P:"+socket.getLocalPort());
System.out.println("服务器信息:"+socket.getInetAddress()+"P:"+socket.getPort());
try {
//发送接收数据
todo(socket);
}catch (Exception e){
e.printStackTrace();
}
socket.close();
System.out.println("客户端已退出...");
}
private static void todo(Socket client) throws IOException{
//构建键盘输入流
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
//得到Socket输出流,并转换为打印流
OutputStream outputStream = client.getOutputStream();
PrintStream socketPrintStream = new PrintStream(outputStream);
//得到Socket输入流
InputStream inputStream = client.getInputStream();
//并转换为BufferedReader
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean flag = true;
do{
//键盘读取一行
String str = input.readLine();
//发送到服务器
socketPrintStream.println(str);
//从服务器读取一行
String echo = socketBufferedReader.readLine();
if("bye".equalsIgnoreCase(echo)){
flag = false;
}else {
System.out.println(echo);
}
}while (flag);
//资源释放
socketPrintStream.close();
socketBufferedReader.close();
}
} -
服务器端(Server)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74public class Server {
public static void main(String[] args) throws IOException {
//没指定IP地址默认本机,若要指定ip可以参考下面注释的bind方法
ServerSocket server = new ServerSocket(2000);
//server.bind(new InetSocketAddress("192.168.1.104",2000));
System.out.println("服务器准备就绪...");
System.out.println("服务器信息:"+server.getInetAddress()+"P:"+server.getLocalPort());
//等待客户端连接
for(;;){
//得到客户端连接
Socket client = server.accept();
//客户端构建异步过程
ClientHandler clientHandler = new ClientHandler(client);
//启动线程
clientHandler.start();
}
}
/**
* 客户端消息处理
*/
private static class ClientHandler extends Thread{
private Socket socket;
private boolean flag = true;
public ClientHandler(Socket socket){
this.socket = socket;
}
public void run(){
super.run();
System.out.println("新客户端连接了:"+socket.getInetAddress()+"P:"+socket.getPort());
try {
//得到打印流,用于数据输出;服务器回送数据
PrintStream socketOutput = new PrintStream(socket.getOutputStream());
BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
do{
//从客户端拿一条数据
String str = socketInput.readLine();
if("bye".equalsIgnoreCase(str)){
flag=false;
//回送
socketOutput.println("bye");
}else {
//打印到屏幕,回送数据长度
System.out.println(str);
socketOutput.println("回送:"+str.length());
}
}while (flag);
//关闭输入输出流
socketInput.close();
socketOutput.close();
}catch (Exception e){
e.printStackTrace();
} finally {
try {
socket.close();
System.out.println("客户端已退出");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四.报文、协议、Mac地址
报文
- 报文段是指TCP/IP协议网络传输过程中,起着路由导航作用
- 用于查询各个网络路由段、IP地址、交换协议等IP数据包
- 报文在传输过程中会不断地封装成分组、包、帧来传输
传输协议
- 协议是一种规定,约束
- 约定大于配置,网络传输流程是稳定的,得益于基础的协议构成
- 相互传输的数据都能相互识别
Mac地址
- Media Access Control
- 物理地址、硬件地址
- 用来定义网络设备的位置
五.IP、端口、远程服务器
IP
- Internet Protocol Address(互联网协议地址)
- 是分配给网络上使用网际协议的设备的数字标签
- 常见的IP地址分为IPv4与IPv6两大类
- IP地址由32位二进制数组成,以XXX.XXX.XXX.XXX形式表示(每组XXX代表<=255的十进制数)
端口
- 若把IP地址比作一间房子,端口就是这间房子的门或窗户
- 0到1023以及1024到49151为特殊端口
- 计算机间依照互联网传输层TCP/IP协议通信,不同协议对应不同端口
- 49152到65535为动态端口
远程服务器
- 具备公网IP
- 能够将多台电脑连接在一起,并进行数据交换
下一篇文章推荐:Socket网络编程进阶之UDP,更加深入学习Socket编程,最后实现聊天室项目!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 515code-实验室!
评论