第一部分为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秒会有信息输出