我正在使用 OpenSSL的BIO API发送HTTPS请求。我需要通过无阻塞套接字同时通过 HTTP / 1.1 将同时(不是串行)发送2个以上的请求到同一目标
我有正在处理的请求,但它们是通过串行方式发送/处理的,而不是同时进行的。
例如,当前,使用一个生物对象并同时向模拟API发送多个请求时,该API在发送响应之前具有5秒钟的内置延迟,我收到了5秒,10秒,15秒,20秒等之后响应。指示请求将按顺序处理。 (服务器可以在5秒钟的延迟时间内处理并响应来自不同客户端的多个请求,并确认这与客户端代码有关。)
问题:
//// resolve refresh status
var my_status = $('input[name="status"]:checked').val(); var socket = io.connect('http://localhost:5000',{
query: 'user_id='+user_id+'&first_name='+first_name+'&mylist='+mylist.join(',')+'&status='+my_status });
// array for emit
var array_emit = ['is_online','iam_online','iam_offline','new_status'];
// function for all emit status connection
$.each(array_emit,function (key,value) {
socket.on(value,function (data) {
statusUser(data.user_id,data.status);
if (data.status === 'online')
{
$('.status_string_'+data.user_id).text('active now');
}else if(data.status === 'offline')
{
$('.status_string_'+data.user_id).text('Inactive');
}else if(data.status === 'bys')
{
$('.status_string_'+data.user_id).text('Busy');
}else
{
$('.status_string_'+data.user_id).text('DND');
}
});
}); // send my friends i online socket.on('connect',function (data) { $('.user-chat').each(function () { var uid = $(this).data('id'); socket.emit('check_online',{
user_id:'user_'+uid });
});
});
?还是有其他方法可以使用Bio来同时发送和处理请求?答案 0 :(得分:0)
BIO对象与SSL对象具有相同的线程安全性。即单个SSL上下文不是线程安全的。您可以同时运行多个SSL上下文,但不能在同一SSL上下文中运行。
因此,如果确实需要同时运行多个HTTPS请求,则需要具有多个套接字(每个同时请求一个)。每个套接字都有自己的SSL上下文和自己的BIO上下文。
我的简单实现是每个线程一个套接字。更好(甚至可能更复杂)的是每个CPU一个套接字,您可以在其中使用某种方式来序列化对SSL上下文的访问,以使它们不重叠(例如,每个ssl流的boost asio链)