标签: client-server

为什么我要使用证书对客户端进行身份验证?

我正在实现一个python's twisted的客户端,在连接时检查服务器ssl证书,基本上遵循这个配方.我在许多HOWTO中看到过,例如服务器通过ssl证书检查客户端的真实性.目前,我使用唯一的id和1024 char字符串验证我的客户端(它们是没有人工交互的自动客户端).

我不明白的是,为什么我必须使用整个ssl而不是仅仅将"密码"发送到服务器.在所有连接已经ssl加密后,检查服务器证书和所有内容.是一个类似的问题,但我想知道为什么人们使用ssl客户端证书,而不仅仅是最好的方法.

authentication ssl client-server certificate

15
推荐指数
1
解决办法
6600
查看次数

处理WPF退出事件

我想知道是否有办法处理WPF应用程序退出事件,以便取消退出.用例是我有一个客户端 - 服务器情况,其中服务器是WPF应用程序.我希望WPF应用程序在关闭时通知客户端,但取消关闭过程.客户端应该收到关闭通知,执行自己需要的清理,然后通过请求请求WPF应用程序关闭.

这可能吗?

wpf events client-server exit

15
推荐指数
1
解决办法
2万
查看次数

在Mac OS X上使用+ clientserver功能编译Vim 7.3

如何使用clientserverMac OS X上的功能编译Vim ?我有vim-7.3.tar.bz2源码

我知道MacVim内置了,但它只在GUI运行时才有效.我想使用CLI版本,因为我的工作使用CLI更容易(例如,我可以轻松切换到终端).

我使用以下./configure选项编译了Vim 7.3

./configure --enable-rubyinterp --enable-pythoninterp --with-features=huge
Run Code Online (Sandbox Code Playgroud)

在Unix和Linux上看过这个问题,但它只关注Ubuntu解决方案.此外,由于我启用了huge功能集,我应该期待+clientserver,根据vimdoc:

因此,如果某个功能标有"N",则它包含在Vim的普通版,大版和大版中.

更新:

服务器功能仅适用于GUI MacVim.要重现这个:

$ Applications/MacVim.app/Contents/MacOS/Vim --servername VIM
Run Code Online (Sandbox Code Playgroud)

在另一个控制台:

$ vim --serverlist # does not output anything
Run Code Online (Sandbox Code Playgroud)

如果我要启动GUI MacVim,

$ vim --serverlist
VIM1
Run Code Online (Sandbox Code Playgroud)

但我的要求是在CLI Vim中工作.

macos vim client-server compilation

15
推荐指数
3
解决办法
6159
查看次数

14
推荐指数
2
解决办法
2万
查看次数

使用POSIX消息队列而不是TCP套接字 - 如何建立"连接"?

我有客户端和服务器程序,现在通过TCP进行通信.我正在尝试使用POSIX消息队列(当然,在客户端和服务器位于同一台机器上的情况下).我希望它能提高性能(特别是通过减少延迟).

我已经解决了大部分问题,但我不确定一件事:如何建立"连接".服务器同时接受来自多个客户端的连接,所以我很想模仿TCP连接建立过程,如下所示:

  1. 服务器打开一个具有已知名称的队列并连续读取它(它可以select(2)像TCP一样使用).
  2. 客户端打开三个队列:两个具有任意名称(包括一些唯一性,例如PID以避免冲突),以及一个具有服务器使用的已知名称的队列.
  3. 客户端向服务器的队列发送"连接"消息,包括客户端的队列名称(一个用于客户端到服务器的流量,另一个用于反向).
  4. 服务器打开客户端连接消息中指定的队列,并开始从客户端到服务器读取(选择).
  5. 客户端使用众所周知的名称关闭服务器队列.使用客户端命名的两个队列(每个方向一个)进行双向通信.

您可能会看到此方案与常见的TCP方法类似,这并非偶然.但是,我想知道:

  1. 你能想到一个更好的方法吗?
  2. 你看到我的方法有任何潜在的问题吗?
  3. 您是否有任何其他想法,包括在同一台计算机上使用消息队列而不是TCP实际上可以提高性能(延迟)的可能性?

请记住,之前我没有使用POSIX消息队列(我之前使用过的是IBM WebSphere MQ,但这有点不同).该平台是Linux.

c connection posix client-server message-queue

14
推荐指数
2
解决办法
1万
查看次数

试图通过SSL创建一个简单的Ruby服务器

我试图在Ruby中创建一个简单的SSL客户端和服务器.但我收到一个神秘的错误消息,文档没有任何帮助.

这是我的服务器代码:

#!/usr/bin/ruby

require "gserver"
require "openssl"

listeningPort = Integer(ARGV[0])

class Server < GServer
  def initialize(listeningPort)
    @sslContext = OpenSSL::SSL::SSLContext.new
    @sslContext.cert = OpenSSL::X509::Certificate.new(File.open("MyCert.pem"))
    super(listeningPort, "0.0.0.0")
  end
  def serve(io)
    begin
      ssl = OpenSSL::SSL::SSLSocket.new(io, @sslContext)
      ssl.sync_close = true
      ssl.connect
      while (lineIn = ssl.gets)
        lineIn = lineIn.chomp
        $stdout.puts "=> " + lineIn
        lineOut = "You said: " + lineIn
        $stdout.puts "<= " + lineOut
        ssl.puts lineOut
      end
    rescue
      $stderr.puts $!
    end
  end
end

server = Server.new(listeningPort)
server.start
server.join
Run Code Online (Sandbox Code Playgroud)

客户端代码类似:

#!/usr/bin/ruby

require "socket"
require "thread" …
Run Code Online (Sandbox Code Playgroud)

ruby openssl client-server

14
推荐指数
1
解决办法
9544
查看次数

如何将FTP服务器上的文件复制到Java中同一服务器上的目录?

我正在使用Apache Commons FTP上传文件.在上传之前,我想检查服务器上是否已存在该文件,并从该服务器备份到同一服务器上的备份目录.

有谁知道如何将文件从FTP服务器复制到同一台服务器上的备份目录?

public static void uploadWithCommonsFTP(File fileToBeUpload){
    FTPClient f = new FTPClient();
    FTPFile backupDirectory;
    try {
        f.connect(server.getServer());
        f.login(server.getUsername(), server.getPassword());
        FTPFile[] directories = f.listDirectories();
        FTPFile[] files = f.listFiles();
        for(FTPFile file:directories){
            if (!file.getName().equalsIgnoreCase("backup")) {
                backupDirectory=file;
            } else {
               f.makeDirectory("backup");
            }
        }
        for(FTPFile file: files){
            if(file.getName().equals(fileToBeUpload.getName())){
                //copy file to backupDirectory
            }
        }

    } catch (IOException e) {
        e.printStackTrace();
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑过的代码:仍有问题,当我备份zip文件时,备份文件已损坏.

有没有人知道它的原因?

 public static void backupUploadWithCommonsFTP(File fileToBeUpload) {
    FTPClient f = new FTPClient();
    boolean backupDirectoryExist = false;
    boolean fileToBeUploadExist = …
Run Code Online (Sandbox Code Playgroud)

java ftp ftp-client client-server apache-commons-net

14
推荐指数
1
解决办法
4万
查看次数

将部分数据库模型从服务器同步到客户端

这更像是一个概念问题,不一定与任何特定技术相关.假设您在服务器上有一些数据库,一些REST/JSON API用于访问该数据库中的内容,一些移动客户端显示通过API检索的数据.

在客户端上有一些缓存机制并且只要客户端只读取就能够启用对数据的脱机访问会很好(在我的情况下,拒绝对脱机客户端的写访问以避免必须管理所有可能发生的令人讨厌的冲突).

似乎解决这个问题的一个好方法是在客户端上提供服务器数据库模型的子集,并将数据从服务器同步到客户端.然后,访问本地数据库可能会立即返回结果,但也会触发对服务器的更新请求.如果服务器返回修改后的数据,则客户端模型会同步其本地数据库并通知显示数据更改.

最终的目标当然是用户可以浏览信息而不管他的互联网连接的稳定性,并且只要他不修改任何数据,就不会受到连接对话或类似的烦恼.

现在从实现的角度来看......一方面将服务器数据库直接耦合到客户端数据库似乎是一个坏主意,因为它们可能来自不同的供应商.我想至少在数据库实现之上需要一个独立于供应商的模型.另一方面,将数据从服务器数据库转换为某种传输格式,而不是将其放回客户端数据库,这似乎是一个很大的开销.

有任何建议如何以优雅和可维护的方式解决这个问题?

database android client-server offline-caching

14
推荐指数
2
解决办法
1805
查看次数

Android客户端使用线程与服务器通信的最佳实践

我正在构建一个Android应用程序,只要应用程序正在运行,它就会定期与服务器通信.

我通过在应用程序启动时启动与服务器的连接来执行此操作,然后我有一个单独的thread用于接收调用的消息ReceiverThread,这thread将从中读取消息socket,对其进行分析,并将其转发到应用程序的相应部分.

thread在循环中运行,读取它必须读取的内容,然后阻止read()命令直到新数据到达,因此它将大部分时间用于阻止.

我处理通过另一个线程发送消息,称为SenderThread.我想知道的是:我应该SenderThread以类似的方式构建吗?我应该为这个线程维护一些形式的队列,让它发送队列中的所有消息,然后阻塞,直到新消息进入队列,或者每次需要发送消息时我应该只启动线程的新实例,让它发送消息,然后"死"?我倾向于第一种方法,但我不知道在性能方面(在内存中保持阻塞线程与初始化新线程)以及代码正确性方面实际上更好.

此外,由于我的所有活动都需要能够发送和接收消息,我持有对我Application班级中两个线程的引用,这是一种可接受的方法还是我应该以不同的方式实现它?

我遇到的一个问题是,有时如果我关闭我的应用程序并再次运行它实际上有两个ReceiverThread实例,所以我得到一些消息两次.

我猜这是因为我的应用程序实际上没有关闭,前一个线程仍处于活动状态(在read()操作上被阻止),当我再次打开应用程序时,新线程被初始化,但两者都连接到服务器,所以服务器将消息发送给两者.有关如何解决此问题的任何提示,或者如何完全重新组织它以便它是正确的?

我试着查看这些问题,但发现了我的第一个问题的一些相互矛盾的例子,没有什么是有用的,适用于我的第二个问题......

java android client-server

14
推荐指数
1
解决办法
3万
查看次数

如何使用netty客户端获取服务器响应

我想写一个基于netty的客户端.它应该有方法public String send(String msg); 哪个应该从服务器或某个未来返回响应 - doesen't不重要.它也应该是多线程的.像这样:

public class Client {
public static void main(String[] args) throws InterruptedException {
    Client client = new Client();

}

private Channel channel;

public Client() throws InterruptedException {
    EventLoopGroup loopGroup = new NioEventLoopGroup();

    Bootstrap b = new Bootstrap();
    b.group(loopGroup).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {
        @Override
        protected void initChannel(SocketChannel ch) throws Exception {
            ch.pipeline().addLast(new StringDecoder()).
                    addLast(new StringEncoder()).
                    addLast(new ClientHandler());
        }
    });
    channel = b.connect("localhost", 9091).sync().channel();
}

public String sendMessage(String msg) {
    channel.writeAndFlush(msg);
    return ??????????;
}
Run Code Online (Sandbox Code Playgroud)

}

我不知道如何在调用writeAndFlush()之后从服务器检索响应; 我该怎么办? …

java client-server netty

14
推荐指数
2
解决办法
9480
查看次数