答えて
ここには、std::net
を使用した非常に簡単な例があります。これは現在のRustのRust氏と対比して開発されたもので、1. *でも動作するはずです。
この例には注意してください。それは単純化されます。バインディング、リスン、またはアクセプトでエラーが発生した場合、パニックになることは望ましくありません。
use std::io::Write;
use std::net::TcpListener;
use std::thread;
fn main() {
let listener = TcpListener::bind("127.0.0.1:9123").unwrap();
println!("listening started, ready to accept");
for stream in listener.incoming() {
thread::spawn(|| {
let mut stream = stream.unwrap();
stream.write(b"Hello World\r\n").unwrap();
});
}
}
受け入れに関するパラダイムに注意してください。 accept()
リクエストを自分で開始する必要があります(この例では、毎回accept()
という呼び出しを行うincoming()
イテレータを使用しています)。のタスクを制御します。
実際、ストリーム処理コードは別のスレッドに入れていますが、非常に短い要求である必要はありません(2番目の要求を処理することができないことを意味します)。最初);それらの2行についてthread::spawn(|| { ... })
を削除することもできます。追加のスレッドを使用すると、ある程度の分離も得られます。スレッドが巻き戻された場合、サーバー全体が死ぬことはありません(ただし、メモリが不足している、またはデストラクタがパニックしていると解凍するとサーバー全体が停止することに注意してください)。
このコードはもうコンパイルされません。更新できますか? (私はしかし、私はどのようにタスクを生成するか分からない) –
@ JeroenBollen:更新されました。 –
もう一度マスターでコンパイルされません。私はTcpListenerがstd :: netに移動したと考えましたが、プロセスの生成とストリームの書き込みが変更されたように見えます。 – wump
単純なTCPエコーサーバhttps://gist.github.com/seriyps/fd6d29442e16c44ba400
#![feature(phase)]
#[phase(plugin, link)] extern crate log;
extern crate green;
extern crate rustuv;
use std::io;
use std::os;
use std::io::{Listener,Acceptor,TcpStream};
// This is for green threads. If removed, will spawn 1 OS thread per client.
#[start]
fn start(argc: int, argv: *const *const u8) -> int {
green::start(argc, argv, rustuv::event_loop, main)
}
fn main() {
let host = "127.0.0.1";
let port = 8080;
let sock = io::TcpListener::bind(host, port).unwrap();
let mut acceptor = sock.listen();
for stream in acceptor.incoming() {
match stream {
Err(e) => warn!("Accept err {}", e),
Ok(stream) => {
spawn(proc() {
debug!("{}", handle_client(stream));
})
}
}
}
}
fn handle_client(mut stream: io::TcpStream) -> io::IoResult<()> {
info!("New client {}", stream.peer_name());
let mut buf = [0u8, ..4096];
loop {
let got = try!(stream.read(buf));
if got == 0 {
// Is it possible? Or IoError will be raised anyway?
break
}
try!(stream.write(buf.slice(0, got)));
}
Ok(())
}
これはもう機能しません。理由については、[ここ](https://gist.github.com/seriyps/fd6d29442e16c44ba400#gistcomment-1562789)のコメントを参照してください。 – ferrouswheel
- 1. Pythonで書かれたPOP3サーバまたはIMAPサーバの例が必要
- 2. バネ統合TCPサーバとマルチスレッドの例
- 3. tcpリスナとtcpサーバはC#で同じですか?
- 4. PyPy + Cpython拡張機能はRust(rust-cpython)で書かれています
- 5. バネ統合tcpサーバ
- 6. LinuxのTCPクライアント/サーバ
- 7. POCO C++ライブラリを備えたマルチスレッドTCPサーバ
- 8. ローカルTCPサーバに使用するアドレスはどれですか?
- 9. 実行中のTCPサーバから新しいTCPサーバを起動できますか?
- 10. Pythonで書かれた最新のCometサーバは何ですか?
- 11. STM32 LwiP複数のTCPサーバ
- 12. TCPサーバのみ1クライアント
- 13. バネ統合tcpサーバのシャットダウン
- 14. 春の統合で先読みTCPサーバ
- 15. Java - TCPサーバがTCPクライアントから読み取ることができません
- 16. TCP/IPソケット例外
- 17. C++で書かれたApache ThriftサーバはTTransportExceptionをスローする
- 18. カスタムシンプルなPythonのHTTPサーバ私はPythonで書かれていた
- 19. Javaで書かれたテスト用埋め込みKerberosサーバ
- 20. Javaで書かれたブラウザとサーバ間の通信
- 21. 私のモバイルアプリケーション(luaで書かれた)と私のサーバ(node.jsで書かれた)を接続するには?
- 22. Golangサーバで永続的なtcp接続を受け入れる
- 23. C言語で書かれたLinux TCP/IPサーバーでのCtrl-Cの処理
- 24. TCPクライアントの強制終了C#のTCPサーバのスレッド
- 25. Swift用のTCPクライアントとTCPサーバと同等のもの
- 26. GrailsがTcpクライアントとTcpサーバを扱う問題
- 27. Rust&Serde JSON逆シリアル化の例?
- 28. あるデバイスから別のデバイスのTcpサーバにTcpクライアントを接続する
- 29. WSH TCPサーバは使用できますか?
- 30. TCPクライアント/サーバを使用するプロデューサ/コンシューマ
https://gist.github.com/thomaslee/4753338 – rags
@rags:あなたはその –
@ragsの答えを作る必要があります:実際に、私は修正することにしましたそれは錆0.7のためにそれ自身を投稿してください。あなたが熱望しているなら、あなた自身でそれに答えることが自由であり、私はそれを削除します。あなたの要点は更新されることもできます。 –