F#TcpListener/客户端类不写入?

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

我正在尝试设置服务器/客户机,目前我正在做一个echo服务器,以确保与侦听器和客户机的连接正常

但是我遇到了一个问题,当试图从一个简单的客户端向我的服务器发送数据时,它没有得到发送,或者在我强制关闭终端中的客户端后它得到发送

我以前用C写过一个服务器/客户端应用程序,但现在我正在用F#尝试

客户端代码:

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