F#TcpListener/客户端类不写入?
我正在尝试设置服务器/客户机,目前我正在做一个echo服务器,以确保与侦听器和客户机的连接正常 但是我遇到了一个问题,当试图从一个简单的客户端向我的服务器发送数据时,它没有得到发送,或者在我强制关闭终端中的客户端后它得到发送 我以前用C写过一个服务器/客户端应用程序,但现在我正在用F#尝试 客户端代码:F#TcpListener/客户端类不写入?,f#,tcpclient,tcplistener,F#,Tcpclient,Tcplistener,我正在尝试设置服务器/客户机,目前我正在做一个echo服务器,以确保与侦听器和客户机的连接正常 但是我遇到了一个问题,当试图从一个简单的客户端向我的服务器发送数据时,它没有得到发送,或者在我强制关闭终端中的客户端后它得到发送 我以前用C写过一个服务器/客户端应用程序,但现在我正在用F#尝试 客户端代码: let Client (ip :IPAddress, port) = use client = new TcpClient(ip.ToString(), port) use read
let Client (ip :IPAddress, port) =
use client = new TcpClient(ip.ToString(), port)
use reader = new StreamReader (client.GetStream())
use writer = new StreamWriter (client.GetStream())
writer.AutoFlush <- true
let mutable run = true
while run do
let input = Console.ReadLine()
if input = "Exit"
then run <- false
else
writer.Write input
reader.ReadToEnd()
|> printfn "got : %s"
let客户端(ip:IPAddress,端口)=
使用客户端=新的TcpClient(ip.ToString(),端口)
使用reader=newstreamreader(client.GetStream())
使用writer=newstreamwriter(client.GetStream())
writer.AutoFlush我在评论中看到您发现了主要问题(缺少文件结尾字符)。然而,我认为服务器代码中有一个潜在的问题值得解决(即使它现在没有引起任何问题)
潜在的问题是,您使用use
绑定client
值,但随后在后台启动的异步块中使用它
while true do
use client = connlst.AcceptTcpClient()
async {
// #1 use 'client' here
} |> Async.Start
// #2 do some more work here
如果循环(#2)的迭代在异步块(#1)完成之前完成,那么它将在客户端可能仍在异步块中使用时处置客户端。避免此问题的一个简单技巧是在async
内部使用use
:
while true do
let client = connlst.AcceptTcpClient()
async {
use client = client
// #1 use 'client' here
} |> Async.Start
// #2 do some more work here
您尝试过刷新流吗?请检查此选项是的,它都设置为自动刷新,我尝试过在功能结束时手动刷新流,并且尝试过使用和不使用自动刷新来刷新流。我发现了问题。我使用了reader.ReadToEnd(),这意味着我必须用文件结尾字符对消息进行后缀。。我想我还是不能让它重复一次
while true do
let client = connlst.AcceptTcpClient()
async {
use client = client
// #1 use 'client' here
} |> Async.Start
// #2 do some more work here