编程的实现方式实现两台服务器socket编程,让服务器彼此通信,实现信息传输。使用C语言编程实现,具备高效且稳定的性能,为企业提供出色的服务。 (两台服务器socket)

随着互联网技术的发展,企业普遍采用分布式系统来提高服务的可靠性、可用性和可扩展性。分布式系统中,不同服务器之间需要进行通信,以实现共享资源、协作计算等功能。因此,如何实现服务器之间的通信就显得十分关键。

在分布式系统中,常用的通信方式是socket编程。socket是一种通信机制,它使用TCP/IP协议栈,在不同的计算机之间进行数据传输。通过socket编程,服务器可以相互通信,实现信息的传递和共享。

在这篇文章中,我们将介绍如何使用C语言编写socket程序,实现两台服务器之间的通信。

一、socket编程的基础知识

在开始编写socket程序之前,我们需要先了解socket编程的基础知识。socket编程主要涉及以下几个概念:

1. socket:socket是一种文件描述符,它用于标识一个网络连接。在程序中,通过socket可以进行读写操作。

2. IP地址:IP地址用于唯一地标识一台计算机。IP地址分为IPv4和IPv6两种类型。IPv4地址是32位的,通常以点分十进制表示(例如,192.168.1.1)。IPv6地址是128位的,通常以冒号分隔符表示(例如,fe80::200:f8ff:fe21:67cf)。

3. 端口号:端口号用于标识一个进程。在一台计算机中,同一时间可能会运行多个进程。每个进程都通过不同的端口号进行通信。端口号是一个16位的数字,它的范围是0~65535。

4. 协议:协议定义了通信时双方需要遵守的规则。常用的协议有TCP和UDP。TCP是面向连接的协议,具有可靠性和有序性。UDP是无连接的协议,具有高效性和实时性。

二、服务器端的socket编程实现

在实现服务器端的socket编程时,需要执行以下步骤:

1. 创建socket:使用socket函数创建一个socket。

2. 绑定IP地址和端口号:使用bind函数将服务器的IP地址和端口号绑定到socket上。

3. 监听连接请求:使用listen函数监听客户端的连接请求。

4. 接受连接请求:使用accept函数接受客户端的连接请求。

5. 接收和发送数据:使用recv和send函数进行数据的接收和发送。

下面是服务器端socket程序的示例代码:

“`c

#include

#include

#include

#include

#include

#include

int mn()

{

// 创建socket

int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (server_sock == -1)

{

printf(“create socket fled”);

return -1;

}

// 绑定IP地址和端口号

struct sockaddr_in server_addr;

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”);

server_addr.sin_port = htons(9999);

if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1)

{

printf(“bind fled”);

return -1;

}

// 监听连接请求

if (listen(server_sock, 5) == -1)

{

printf(“listen fled”);

return -1;

}

// 接受连接请求

struct sockaddr_in client_addr;

socklen_t client_addr_size = sizeof(client_addr);

int client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &client_addr_size);

if (client_sock == -1)

{

printf(“accept fled”);

return -1;

}

// 接收和发送数据

char buf[1024] = {0};

while (1)

{

memset(buf, 0, sizeof(buf));

int len = recv(client_sock, buf, sizeof(buf), 0);

if (len

{

printf(“recv fled”);

break;

}

printf(“recv: %s\n”, buf);

if (send(client_sock, buf, strlen(buf), 0) == -1)

{

printf(“send fled”);

break;

}

}

// 关闭socket

close(client_sock);

close(server_sock);

return 0;

}

“`

三、客户端的socket编程实现

在实现客户端的socket编程时,需要执行以下步骤:

1. 创建socket:使用socket函数创建一个socket。

2. 连接服务器:使用connect函数连接服务器。

3. 发送和接收数据:使用send和recv函数进行数据的发送和接收。

下面是客户端socket程序的示例代码:

“`c

#include

#include

#include

#include

#include

#include

int mn()

{

// 创建socket

int client_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if (client_sock == -1)

{

printf(“create socket fled”);

return -1;

}

// 连接服务器

struct sockaddr_in server_addr;

memset(&server_addr, 0, sizeof(server_addr));

server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = inet_addr(“127.0.0.1”);

server_addr.sin_port = htons(9999);

if (connect(client_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1)

{

printf(“connect fled”);

return -1;

}

// 发送和接收数据

char buf[1024] = {0};

while (1)

{

memset(buf, 0, sizeof(buf));

printf(“input message: “);

fgets(buf, sizeof(buf), stdin);

if (send(client_sock, buf, strlen(buf), 0) == -1)

{

printf(“send fled”);

break;

}

int len = recv(client_sock, buf, sizeof(buf), 0);

if (len

{

printf(“recv fled”);

break;

}

printf(“recv: %s\n”, buf);

}

// 关闭socket

close(client_sock);

return 0;

}

“`

四、程序的执行结果

我们可以将服务器端和客户端程序分别编译,并在两台计算机上执行。例如,我们可以将服务器端程序编译为server,客户端程序编译为client,并在计算机1上运行server,计算机2上运行client。

当client连接到server后,我们可以在client端输入一条消息,server将接收到该消息并将其原样发送回client。如下图所示:

![socket1](https://img-blog.csdnimg.cn/20231018120231406.png#pic_center)

五、

相关问题拓展阅读:

两台服务器手动部署大数据平台

两台服务器手动部署大数据平台

##### 初始服务器数量

– 2台centos7

##### 建议配置

– 32G(RAM)

– 24cpu

– 10t(SATA)

### 1.环境

– 系统centos7

– jdk:1.8.0_171(64位)

– zookeeper:3.4.8

– spark-2.1.0-bin-hadoop2.6

– kafka_2.10-0.10.2.1

– hadoop-2.7.0

– hbase-1.2.6

– elasticsearch-6.3.0

### 2.系统准备

对应的安装包文件:

elasticsearch-6.3.0.tar.gz

hadoop-2.7.0.tar.gz

hbase-1.2.6-bin.tar.gz

jdk-8u171-linux-x64.tar.gz

kafka_2.10-0.10.2.1.tgz

mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar

spark2.1.0hadoop2.6.tgz.gz

zookeeper-3.4.8.tar.gz

一、 配置好hosts

“`

两台设备的host

ip1 hello1

ip2 hello2

关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

二、机器之间做好免密

1. 在hello1服务器中,cd /root/

2. ssh-keygen -trsa  (全部按回车,走默认配置)

3. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

4. chmod 600 ~/.ssh/authorized_keys

5. scp ~/.ssh/authorized_keys root@hello2:~/.ssh/

到此处时可以实现hello1机器上通过root账户登录到hello2中,但从hello2中无法通过免密码登录到hello1服务器。

6. 在hello2服务器中,cd /root/

7. ssh-keygen -trsa  (全部按回车,走默认配置)

8. cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

9. scp ~/.ssh/authorized_keys root@hello1:~/.ssh/

到此处时可以实现hello1机器与hello2机器之间免密码互通

三、建立一个用户操作elasticsearch用户,后期所有安装软件放在该目录下(当猜竖前使用root账户安装)

1.添加用户:

useradd -m -s /bin/bash es

2.为该用户设置密码:

password es

四、安装JDK

如果系统自带openjdk,先将其卸载掉!

1.创建jdk安装路径(hello1、hello2都执行)

执行:伍闷 mkdir /usr/java

2.解压缩jdk到安装目录

执行: tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/java/

3.添加环境变量

vi /etc/profile,添加以下语句

export JAVA_HOME=/usr/java/jdk1.8.0_171

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin

执行:source /etc/profile

4.复制安装包和数据目录到hello2

scp  -r /usr/java/jdk1.8.0_171 hello2:/usr/java/

scp /etc/profile hello2:/etc/

登录腔兆弯到hello2上,进入/home/es目录

执行: source /etc/profile

5、验证:

两台服务器上分别执行: java -version,查看输出的版本是否与安装的版本一致。

五、安装mysql

1.如果centos系统中自带mariadb,先卸载mariadb。

2.解压mysql安装包程序

执行:tar -xvf  mysql-5.7.23-1.el7.x86_64.rpm-bundle.tar

3.依次安装里面rpm包组建

rpm -ivh mysql-community-common-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-libs-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-client-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-server-5.7.23-1.el7.x86_64.rpm

rpm -ivh mysql-community-devel-5.7.23-1.el7.x86_64.rpm

4.启动MySQL

执行: systemctl start mysqld

5.登录mysql服务器

这种方式安装好后,会再my.cnf文件中自动生成一个密码,

执行:cat /var/log/mysqld.log | grep password, 出现如下记录:

T01:58:11.863301Z 1 A temporary password is generated for root@localhost: m-NdrSG4ipuO

其中“m-NdrSG4ipuO”为mysql root账户的初始密码。

登录:

执行: mysql -uroot -p

输入密码: m-NdrSG4ipuO,即可进入mysql服务器。

后续可自行修改root密码,创建新账户等操作。

六、安装zookeeper

1.解压zookeeper安装包到指定目录(/home/es)

tar -zxvf zookeeper-3.4.8.tar.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s zookeeper-3.4.8 zookeeper

3.添加执行路径环境

vi /etc/profile

添加

export ZOOKEEPER_HOME=/home/es/zookeeper

export PATH=$PATH:$ZOOKEEPER_HOME/bin

执行

source /etc/profile

4.修改配置文件

cd /home/es/zookeeper

cp conf/zoo_sample.cfg conf/zoo.cfg

在/home/data下创建对应的zookeeper数据存储目录

mkdir /home/data/zookeeper

mkdir /home/data/zookeeper/data

mkdir /home/data/zookeeper/log

修改配置文件:conf/zoo.cfg,添加以下语句

dataDir=/home/data/zookeeper/data

dataLogDir=/home/data/zookeeper/log

server.1=hello1:2888:3888

server.2=hello2:2888:3888

5.创建server表示符文件

touch /home/data/zookeeper/data/myid

echo echo 1>/home/data/zookeeper/data/myid

6.复制安装包和数据目录到hello2

scp -r /home/es/zookeeper-3.4.8 es@hello2:/home/es

scp -r /home/data/zookeeper es@hello2:/home/data

scp  /etc/profile es@hello2:/etc

登录到hello2上

cd /home/es

ln -s zookeeper-3.4.8 zookeeper

echo echo 2>/home/data/zookeeper/data/myid

执行

source /etc/profile

7.两台机器上分别执行

zkServer.sh start

8.验证

jps | grep QuorumPeerMain,查看是否有该进程

zkServer.sh status,查看服务状态

六、安装kafka

1.解压kafka安装包到指定目录(/home/es)

tar -zxvf kafka_2.10-0.10.2.1.tgz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s kafka_2.10-0.10.2.1 kafka

3.修改配置文件

备份:

cp config/server.properties config/server.properties.bak

创建kafka日志目录:

mkdir /home/data/kafka

mkdir /home/data/kafka/kafka-logs

修改:config/server.properties,具体对应字段如下:

broker.id=0

delete.topic.enable=true

num.network.threads=10

num.io.threads=32

socket.send.buffer.bytes=102400

socket.receive.buffer.bytes=102400

socket.request.max.bytes=

log.dirs=/home/data/kafka/kafka-logs

num.partitions=1

num.recovery.threads.per.data.dir=1

log.retention.hours=168

log.segment.bytes=

log.retention.check.interval.ms=300000

zookeeper.connect=hello1:2181,hello2:2181

zookeeper.connection.timeout.ms=6000

6.复制安装包和数据目录到hello2

scp -r /home/es/kafka_2.10-0.10.2.1 es@hello2:/home/es

scp -r /home/data/kafka es@hello2:/home/data

修改hello2中的配置

登录到hello2上,cd /home/es/kafka,修改config/server.properties中broker.id值为2.

7.启动kafka

在两台机器的/home/es/kafka中,创建一个日志存放目录:mkdir start_log,执行以下命令:

nohup bin/kafka-server-start.sh config/server.properties > start_log/kafka_start_log 2>&1 &

8.验证运行情况

jps | grep Kafka,查看进程

通过kafka命令查看topic。

七、安装hadoop

1.解压hadoop安装包到指定目录(/home/es)

tar -zxvf hadoop-2.7.0.tar.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s hadoop-2.7.0 hadoop

3.创建数据存放目录

mkdir /home/data/hadoop

mkdir /home/data/hadoop/tmp

mkdir /home/data/hadoop/dfs

mkdir /home/data/hadoop/dfs/data

mkdir /home/data/hadoop/dfs/name

4.修改配置文件

修改/home/es/hadoop/etc/hadoop/core-site.xml

fs.defaultFS

hadoop.tmp.dir

file:/home/data/hadoop/tmp

io.file.buffer.size

修改/home/es/hadoop/etc/hadoop/hdfs-site.xml

dfs.namenode.name.dir

file:/home/data/hadoop/dfs/name

dfs.datanode.data.dir

file:/home/data/hadoop/dfs/data

dfs.replication

2

dfs.namenode.secondary.http-address

hello1:9001

dfs.webhdfs.enabled

true

修改/home/es/hadoop/etc/hadoop/mapred-site.xml

mapreduce.framework.name

yarn

mapreduce.jobhistory.address

hello1:10020

mapreduce.jobhistory.webapp.address

hello1:19888

修改/home/es/hadoop/etc/hadoop/yarn-site.xml

yarn.nodemanager.aux-services

mapreduce_shuffle

yarn.nodemanager.auxservices.mapreduce.shuffle.class

org.apache.hadoop.mapred.ShuffleHandler

yarn.resourcemanager.address

hello1:8032

yarn.resourcemanager.scheduler.address

hello1:8030

yarn.resourcemanager.resource-tracker.address

hello1:8031

yarn.resourcemanager.admin.address

hello1:8033

yarn.resourcemanager.webapp.address

hello1:8088

yarn.nodemanager.resource.memory-mb

配置/home/es/hadoop/etc/hadoop目录下hadoop-env.sh、yarn-env.sh的JAVA_HOME(不设置的话,启动不了)

export JAVA_HOME=/usr/java/jdk1.8.0_171

配置/home/es/hadoop/etc/hadoop目录下的slaves,删除默认的localhost,增加2个从节点,

hello1

hello2

5、将配置好的Hadoop复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/hadoop-2.7.0 hello2:/home/es/

scp  -r /home/data/hadoop hello2:/home/data/

登录到hello2上,进入/home/es目录

执行: ln -s hadoop-2.7.0 hadoop

6、格式化nameNode及启动hadoop

在主服务器启动hadoop,从节点会自动启动,进入/home/es/hadoop目录

初始化,输入命令,bin/hdfs namenode -format

全部启动in/start-all.sh,也可以分开in/start-dfs.sh、in/start-yarn.sh

输入命令,jps,可以看到相关信息

7、验证hadoop运行情况

浏览器打开

浏览器打开

8、添加hadoop环境变量到/etc/profile

export HADOOP_HOME=/home/es/hadoop export PATH=$PATH:$HADOOP_HOME/in

export PATH=$PATH:$HADOOP_HOME/bin

export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native

export HADOOP_OPTS=”-Djava.library.path=$HADOOP_HOME/lib/native”

执行: source /etc/profile

八、安装Hbase

1.解压hbase安装包到指定目录(/home/es)

tar -zxvf hbase-1.2.6-bin.tar.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s hbase-1.2.6 hbase

3.添加hbase环境变量到/etc/profile

export  HBASE_HOME=/home/es/hbase

  export  PATH=$HBASE_HOME/bin:$PATH

执行:source /etc/profile

4.修改HBASE配置文件

vi /home/es/hbase/conf/hbase-env.sh

增加: export JAVA_HOME=/usr/java/jdk1.8.0_171

修改: export HBASE_MANAGES_ZK=false

vi /home/es/hbase/conf/hbase-site.xml

修改类容:

hbase.rootdir

hbase.cluster.distributed

true

hbase.zookeeper.quorum

hello1,hello2

hbase.zookeeper.property.dataDir

/home/es/hbase/zookeeper

配置regionservers,vi /home/es/hbase/conf/regionservers

去掉默认的localhost,加入hello1、hello2

5、将配置好的hbase复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/hbase-1.2.6 hello2:/home/es/

scp /etc/profile hello2:/etc/

登录到hello2上,进入/home/es目录

执行: ln -s hbase-1.2.6 hbase

source /etc/profile

6、hbase的启动

hello1中执行: start-hbase.sh

7、验证hbase运行情况

输入jps命令查看进程是否启动成功,若 hello1上出现HMaster、HRegionServer、HQuormPeer,hello2上出现HRegionServer、HQuorumPeer,就是启动成功了。

输入hbase shell 命令 进入hbase命令模式,输入status命令,查看运行状态。

在浏览器中输入

就可以在界面上看到hbase的配置

注意事项:

正常安装后,创建普通不带压缩表可以正常读写,当使用snappy进行压缩创建表时,该表无法再regionServer中启动!

解决方法:

1.在hbase-site.xml文件中添加一下属性

  hbase.regionserver.codecs

  snappy

2.每台机器中将hadoop_native.zip解压缩到hbase安装目录的lib下,执行 unzip hadoop_native.zip $HBASE_HOME/lib/

3.在$HBASE_HOME/conf/hbase-env.sh 中添加:export HBASE_LIBRARY_PATH=/home/es/hbase/lib/native

4.重启Hbase服务即可

九、Spark安装

1.解压hbase安装包到指定目录(/home/es)

tar -zxvf spark2.1.0hadoop2.6.tgz.gz -C /home/es

2.创建程序软连接

cd /home/es/

ln -s spark2.1.0hadoop2.6 spark

3.修改配置文件

mv /home/es/spark/conf/spark-env.sh.template  /home/es/spark/conf/spark-env.sh

vi /home/es/spark/conf/spark-env.sh

修改对应配置:

export JAVA_HOME=/usr/java/jdk1.8.0_171

export SPARK_MASTER_IP=hello1

export SPARK_MASTER_PORT=7077

export SPARK_LOCAL_IP=hello1

修改slaves文件

mv /home/es/spark/conf/slaves.template  /home/es/spark/conf/slaves

vi /home/es/spark/conf/slaves

将localhost修改成:

hello1

hello2

5、将配置好的hbase复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/spark2.1.0hadoop2.6 hello2:/home/es/

登录到hello2上,进入/home/es目录

执行: ln -s spark2.1.0hadoop2.6 spark

在hello2中修改/home/es/spark/conf/spark-env.sh

export JAVA_HOME=/usr/java/jdk1.8.0_171

export SPARK_MASTER_IP=hello1

export SPARK_MASTER_PORT=7077

export SPARK_LOCAL_IP=hello2

6、启动spark

cd /home/es/spark

执行: in/start-all.sh

7、检测执行结果

jps | grep Worker,看是否有相应的进程。

十、安装elasticsearch

由于elasticsearch,用root账户无法启动,故该组件用es账户安装

1、切换到es账户: su es

2、解压hbase安装包到指定目录(/home/es)

tar -zxvf elasticsearch-6.3.0.tar.gz -C /home/es/

创建程序软连接

cd /home/es/

ln -s elasticsearch-6.3.0 elasticsearch

3、修改配置文件

vi /home/es/elasticsearch/config/elasticsearch.yml

# 集群的名字 

cluster.name: crrc-health

# 节点名字 

node.name: node-1 

# 数据存储目录(多个路径用逗号分隔) 

path.data: /home/data1/elasticsearch/data

# 日志目录 

path.logs: /home/data1/elasticsearch/logs

#本机的ip地址

network.host: hello1 

#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点

discovery.zen.ping.unicast.hosts:

# 设置节点间交互的tcp端口(集群),(默认9300) 

transport.tcp.port: 9300

# 监听端口(默认) 

http.port: 9200

# 增加参数,使head插件可以访问es 

http.cors.enabled: true

http.cors.allow-origin: “*”

4、创建elasticsearch数据和存储目录

mkdir /home/data1/elasticsearch

mkdir /home/data1/elasticsearch/data

mkdir /home/data1/elasticsearch/logs

5、修改linux系统的默认硬限制参数

切换至root用户: su root

vim /etc/security/limits.conf

添加:

es soft nofile 65536

es hard nofile 65536

退出es登录,重新用es账户登录,使用命令:ulimit -Hn查看硬限制参数。

vi /etc/sysctl.conf

添加:

vm.max_map_count=655360

执行:

sysctl -p

6、将配置好的elasticsearch复制到各个节点对应位置上,通过scp传送

scp  -r /home/es/elasticsearch-6.3.0 hello2:/home/es/

scp  -r /home/data1/elasticsearch hello2:/home/data1/

登录到hello2上,进入/home/es目录

执行: ln -s elasticsearch-6.3.0 elasticsearch-6.3.0

在hello2中修改/home/es/elasticsearch/config/elasticsearch.yml

修改: network.host: hello2

7、启动elasticsearch

使用es账户

执行:

/home/es/elasticsearch/bin/elasticsearch -d

8、验证

控制台中输入:curl

两台服务器socket的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于两台服务器socket,编程的实现方式实现两台服务器socket编程,让服务器彼此通信,实现信息传输。使用C语言编程实现,具备高效且稳定的性能,为企业提供出色的服务。,两台服务器手动部署大数据平台的信息别忘了在本站进行查找喔。


数据运维技术 » 编程的实现方式实现两台服务器socket编程,让服务器彼此通信,实现信息传输。使用C语言编程实现,具备高效且稳定的性能,为企业提供出色的服务。 (两台服务器socket)