Socket通信

TCP/IP

先复习一下TCP/IP协议,网络分为物理层、数据连接层、网络层、传输层、会话层、表现层和应用层、TCP协议作用在传输层,表现的是三次握手,IP是网络层、HTTP是应用层。归纳一下TCP/IP协议是传输层协议,而Socket就是对TCP/IP的封装与使用。而HTTP就是发货站,包装数据。

Socket接口几乎是所有语言都拥有的API(Socket不是协议,是接口),初学者通过Socket可以实现对网络的初步利用与研究,可以实现局域网内简单的接受发送数据等等,这些都需要实现。

TCP协议是所有学习计算机的人必须知道的。

TCP通信

在了解TCP协议后我们就可以使用Socket实现简单的消息服务器了,事不宜迟,现在就动手操作!

开始编写

再读懂这些代码之前保证你有C++,java,python的基础,否则对下面的代码很难理解,毕竟为了演示Socket通信的能力,我会尽力多去使用各种语言,以帮助大家建立起真正的网络系统模型

数据接受端(C++)

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
#include <iostream>
#include <WINSOCK2.H>
#include "windows.h"

#pragma comment(lib, "ws2_32.lib")
#define _WINSOCK_DEPRECATED_NO_WARNINGS

int main()
{
//定义数据套接字
WSADATA wsaData;
SOCKET Server;
SOCKET Client;
SOCKADDR_IN local;
SOCKADDR_IN client;
//传过来的数据
char Messagesize[1024];
int retu;
int iaddrSize = sizeof(SOCKADDR_IN);
WSAStartup(0x0202, &wsaData);
//设置服务端
Server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
local.sin_family = AF_INET;
//设置端口
local.sin_port = htons(8090);
//得到地址
local.sin_addr.s_addr = htonl(INADDR_ANY);
//监听服务
bind(Server, (struct sockaddr*)&local, sizeof(SOCKADDR_IN));
listen(Server, 1);
//得到客户端
Client = accept(Server, (struct sockaddr*)&client, &iaddrSize);
printf("服务器得到客户端的连接:%s:%d\n", inet_ntoa(client.sin_addr),ntohs(client.sin_port));
//输出得到的内容
while (TRUE) {
retu = recv(Client, Messagesize, 1024, 0);
Messagesize[retu] = '\0';
printf("接收到数据 [%d 字节]: '%s'\n", retu, Messagesize);
}
return 0;
}

数据发送客户端1号(Java)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.io.*;
import java.net.Socket;

public class Main {
public static void main(String[] args) {
try {
//配置Socket对象
Socket socket = new Socket("localhost",8090);
//定义输出流对象
PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
//字符串转如Socket发送出去
printWriter.write("Hey!Im java client");
//释放空间
printWriter.flush();
} catch (IOException exception) {
exception.printStackTrace();
}
}
}

数据发送客户端2号(Python)

1
2
3
4
5
6
7
8
9
10
11
import socket

s = socket.socket()
s.connect(("127.0.0.1", 8090))

while 1:
s.send("Hi,Im python client".encode("utf-8"))
data = s.recv(1024)
print('recv:',data.decode())

s.close()

结果

均可在C++服务端上体现

python

java

总结

本期博客尝试了一下Socket套接字在不同语言之间的数据传输。任何基础知识都必须经过尝试才能知道背后的原理,如果只是做研究而不去尝试,永远不会知道实用性与自由性


Socket通信
https://blog.minloha.cn/posts/122220a9e174ed2021122252.html
作者
Minloha
发布于
2021年12月22日
更新于
2024年4月9日
许可协议