TCP/IP
先复习一下TCP/IP协议,网络分为物理层、数据连接层、网络层、传输层、会话层、表现层和应用层、TCP协议作用在传输层,表现的是三次握手,IP是网络层、HTTP是应用层。归纳一下TCP/IP协议是传输层协议,而Socket就是对TCP/IP的封装与使用。而HTTP就是发货站,包装数据。
Socket接口几乎是所有语言都拥有的API(Socket不是协议,是接口),初学者通过Socket可以实现对网络的初步利用与研究,可以实现局域网内简单的接受发送数据等等,这些都需要实现。
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 = new Socket("localhost",8090); PrintWriter printWriter = new PrintWriter(socket.getOutputStream()); 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++服务端上体现
总结
本期博客尝试了一下Socket套接字在不同语言之间的数据传输。任何基础知识都必须经过尝试才能知道背后的原理,如果只是做研究而不去尝试,永远不会知道实用性与自由性