点击打开原文链接
第一部分为C++实现,第二部分为python实现
第一部分
该socket 的功能是在客户端输入了两个浮点数组成的字符串,在服务端接受后将其转换为浮点数输出,统一时刻只能有一个客户端连接
服务端:
tcp_server.cpp
- #include <stdio.h>
- #include <iostream>
- #include <stdlib.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <string.h>
- using namespace std;
-
- #define PORT 10001
-
- int main()
- {
- struct sockaddr_in s_in;//server address structure
- struct sockaddr_in c_in;//client address structure
- int l_fd,c_fd;
- socklen_t len;
- char buf[100];//content buff area
- string tem;
- float x_value = 0.0;
- float y_value = 0.0;
- memset((void *)&s_in,0,sizeof(s_in));
-
- s_in.sin_family = AF_INET;//IPV4 communication domain
- s_in.sin_addr.s_addr = INADDR_ANY;//accept any address
- s_in.sin_port = htons(PORT);//change port to netchar
-
- l_fd = socket(AF_INET,SOCK_STREAM,0);//socket(int domain, int type, int protocol)
- bind(l_fd,(struct sockaddr *)&s_in,sizeof(s_in));
- listen(l_fd,1);//同时只能有一个连接
-
- cout<<"begin"<<endl;
- while(1){
- c_fd = accept(l_fd,(struct sockaddr *)&c_in,&len);
- while(1){
- for(int j=0;j<100;j++){
- buf[j] = 0;
- }
- int n = read(c_fd,buf,100);//read the message send by client
- if(!strcmp(buf, "q\n") || !strcmp(buf, "Q\n")){
- cout << "q pressed\n";
- close(c_fd);
- break;
- }
- // inet_ntop(AF_INET,&c_in.sin_addr,addr_p,16);//“二进制整数” -> “点分十进制
- tem = buf;
- x_value = atof(tem.substr(0,5).c_str());
- y_value = atof(tem.substr(5,5).c_str());
- cout << x_value << "dd" << y_value <<endl;
- write(c_fd,buf,n);//sent message back to client
- }
- }
- return 0;
- }
客户端:
tcp_client.cpp
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- #include <stdlib.h>
- #include <string>
- #include <unistd.h>
- #include <arpa/inet.h>
- #include <sys/socket.h>
- #define BUF_SIZE 100
- #define ADDR "127.0.0.1" //在本机测试用这个地址,如果连接其他电脑需要更换IP
- #define SERVERPORT 10001
- using namespace std;
- int main(int argc, char *argv[])
- {
- int sock;
- char opmsg[BUF_SIZE];
- char get_msg[BUF_SIZE] = {0};
- int result, opnd_cnt, i;
- int len;
- bool if_first = true;
- struct sockaddr_in serv_addr;
-
- sock = socket(PF_INET, SOCK_STREAM, 0);
- if(sock == -1){
- return -1;
- }
- memset(&serv_addr, 0, sizeof(serv_addr));
- serv_addr.sin_family = AF_INET;
- serv_addr.sin_addr.s_addr = inet_addr(ADDR); // 注释1
- serv_addr.sin_port = htons(SERVERPORT);
- if(connect(sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr))==-1){ // 注释2
- cout << "connect error\n";
- return -1;
- }
- else{
- cout << "connected ...\n" << endl; //注释3
- }
-
- while(1){
- fgets(opmsg, BUF_SIZE, stdin);
- len = write(sock, opmsg, strlen(opmsg)); // 注释4
- if(!strcmp(opmsg, "q\n") || !strcmp(opmsg, "Q\n"))
- {
- puts("q pressed\n");
- break;
- }
- else
- {
- int read_msg = read(sock, get_msg, len);
- cout << "send length:" << len << " get:" << get_msg << endl;
- }
- }
- close(sock);
- return 0;
- }
两个放在同一个文件夹下,先编译后运行。
编译并运行服务端:
- g++ tcp_server.cpp -o tcp_server.out -lstdc++
-
- ./tcp_server.out
打开另一个窗口编译并运行客户端:
- g++ tcp_client.cpp -o tcp_client.out
-
- ./tcp_client.out
在客户端输入字符串例如1.2223.444按回车,服务端会将其转换为浮点数输出,!!!!!!!!注意每个浮点数带上小数点在内必须是总共五位,否则会出错!!!!!!!!!
第二部分
python的代码比较简单
serverpy
- # coding=utf-8
- import socket # socket模块
- import commands # 执行系统命令模块
-
- HOST = '127.0.0.1'
- PORT = 1234
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 定义socket类型,网络通信,TCP
- s.bind((HOST, PORT)) # 套接字绑定的IP与端口
- s.listen(1) # 开始TCP监听
- while 1:
- conn, addr = s.accept() # 接受TCP连接,并返回新的套接字与IP地址
- print'Connected by', addr # 输出客户端的IP地址
- while 1:
- data = conn.recv(100) # 把接收的数据实例化
- print(data)
- conn.sendall(data)
- conn.close() # 关闭连接
client.py
- # coding=utf-8
-
- import socket
- import time
-
- HOST = '127.0.0.1'
- PORT = 1234
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 定义socket类型,网络通信,TCP
- s.connect((HOST, PORT)) # 要连接的IP与端口
- while 1:
- # cmd = raw_input("Please input cmd:") # 与人交互,输入命令
- s.sendall('this is python socket') # 把命令发送给对端
- data = s.recv(1024) # 把接收的数据定义为变量
- print data # 输出变量
- time.sleep(3)
- s.close() # 关闭连接
运行方式:打开两个终端一个运行server.py,在终端输入:python server.py
打开第二个终端,在终端输入python client.py
即可看到每隔3秒会有信息输出
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)