I know your meaning.But I still can't get the result I want. 
this is the server program:
package main

import (
"fmt"
"net"
"os"
"strings"
)

func main() {

listener, err := net.Listen("tcp", "0.0.0.0:400")
checkError(err)
for i := 0; i < 10; i++ {
conn, err := listener.Accept()
if err != nil {
continue
}
handleClient(conn)
conn.Close()
}
}
func handleClient(conn net.Conn) {
var buf [512]byte
for {
n, err := conn.Read(buf[0:])
if err != nil {
return
}
rAddr := conn.RemoteAddr()
fmt.Println("receive from client:", rAddr.String(), string(buf[0:n]))
aa := string("nice to meet you")
_, err2 := conn.Write([]byte("welcome client!"))
if strings.Contains(string(buf[0:n]), aa) {
_, err2 = conn.Write([]byte("nice to meet you too"))
}
checkError(err2)
n, err = conn.Read(buf[0:])
if err != nil {
return
}
}
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "fatal error: %s", err.Error())
os.Exit(1)
}
}


this is the client program:
package main

import (
"fmt"
"net"
"os"
)

func main() {
var buf [512]byte
if len(os.Args) != 2 {
fmt.Fprintf(os.Stderr, "usage:%s host:port\n", os.Args[0])
}
_, err := net.ResolveTCPAddr("tcp", "127.0.0.1:400")
checkError(err)
conn, err := net.Dial("tcp", "127.0.0.1:400")
checkError(err)
rAddr := conn.RemoteAddr()
for {
n, err := conn.Write([]byte("hello server!"))
n, err = conn.Write([]byte(" nice to meet you"))
checkError(err)
n, err = conn.Read(buf[0:])
if err != nil {
return
}
fmt.Println("reply from server:", rAddr.String(), string(buf[0:n]))
n, err = conn.Read(buf[0:])
if err != nil {
return
}
conn.Close()
os.Exit(0)
}
}
func checkError(err error) {
if err != nil {
fmt.Fprintf(os.Stderr, "fatal error: %s", err.Error())
os.Exit(1)
}
}


The program still don't print "nice to meet you too". Can you help me 
modifying and writing down for me??



在 2017年11月13日星期一 UTC+8上午2:32:47,Justin Israel写道:
>
>
>
> On Sun, Nov 12, 2017, 10:11 PM <28911...@gmail.com <javascript:>> wrote:
>
>> So how to modify my program correctly??I try to add read in different 
>> place but it still can't get the result I want.
>>
>
> Make sure your server is doing:
>  read, write, read, write
>
> And your client is doing:
>  write, read, write, read 
>
> But honestly it becomes hard to keep track and line up the two when you 
> are complicating the server handler loop. Why not just simplify the server 
> so that it always just reads, checks the value and writes something back, 
> then loops again? And the client would make sure to always write and then 
> read. 
> You have a conditional write on the server so that means if a client 
> doesn't say the correct phrase, it won't know if reading afterwards is 
> going to block forever. 
>
>
>> 在 2017年11月12日星期日 UTC+8上午5:05:49,Justin Israel写道:
>>>
>>>
>>>
>>> On Sun, Nov 12, 2017, 10:03 AM Justin Israel <justin...@gmail.com> 
>>> wrote:
>>>
>>
>>>>
>>>> On Sat, Nov 11, 2017, 9:55 PM <28911...@gmail.com> wrote:
>>>>
>>>>>  this is the server program: 
>>>>>
>>>>>> package main
>>>>>>
>>>>>> import (
>>>>>> "fmt"
>>>>>> "net"
>>>>>> "os"
>>>>>>
>>>>> "strings"
>>>>>> )
>>>>>>
>>>>>> func main() {
>>>>>>
>>>>>> listener, err := net.Listen("tcp", "0.0.0.0:400")
>>>>>>
>>>>> checkError(err)
>>>>>> for i := 0; i < 10; i++ {
>>>>>> conn, err := listener.Accept()
>>>>>> if err != nil {
>>>>>> continue
>>>>>> }
>>>>>> handleClient(conn)
>>>>>> conn.Close()
>>>>>> }
>>>>>> }
>>>>>> func handleClient(conn net.Conn) {
>>>>>> var buf [512]byte
>>>>>> for {
>>>>>> n, err := conn.Read(buf[0:])
>>>>>> if err != nil {
>>>>>> return
>>>>>> }
>>>>>> rAddr := conn.RemoteAddr()
>>>>>> fmt.Println("receive from client", rAddr.String(), string(buf[0:n]))
>>>>>>
>>>>> n, err2 := conn.Write([]byte("welcome client!"))
>>>>>>
>>>>> if err2 != nil {
>>>>>> return
>>>>>> }
>>>>>>
>>>>> aa := string("nice to meet you")
>>>>>> if strings.Contains(string(buf[0:n]), aa) {
>>>>>> n, err2 = conn.Write([]byte("nice to meet you too"))
>>>>>>
>>>>> if err2 != nil {
>>>>>> return
>>>>>> }
>>>>>> }
>>>>>> }
>>>>>> }
>>>>>> func checkError(err error) {
>>>>>> if err != nil {
>>>>>> fmt.Fprintf(os.Stderr, "fatal error: %s", err.Error())
>>>>>> os.Exit(1)
>>>>>> }
>>>>>> }
>>>>>>
>>>>>
>>>>>>
>>>>> this is the client program:
>>>>>  package main
>>>>>
>>>>> import (
>>>>> "fmt"
>>>>> "net"
>>>>> "os"
>>>>> )
>>>>>
>>>>> func main() {
>>>>> var buf [512]byte
>>>>> if len(os.Args) != 2 {
>>>>> fmt.Fprintf(os.Stderr, "usage:%s host:port\n", os.Args[0])
>>>>> }
>>>>> _, err := net.ResolveTCPAddr("tcp", "127.0.0.1:400")
>>>>> checkError(err)
>>>>> conn, err := net.Dial("tcp", "127.0.0.1:400")
>>>>> checkError(err)
>>>>> rAddr := conn.RemoteAddr()
>>>>> n, err := conn.Write([]byte("hello server!"))
>>>>> checkError(err)
>>>>> n, err = conn.Write([]byte(" nice to meet you"))
>>>>> checkError(err)
>>>>> n, err = conn.Read(buf[0:])
>>>>> if err != nil {
>>>>> return
>>>>> }
>>>>> checkError(err)
>>>>> fmt.Println("reply from server", rAddr.String(), string(buf[0:n]))
>>>>> conn.Close()
>>>>> os.Exit(0)
>>>>> }
>>>>> func checkError(err error) {
>>>>> if err != nil {
>>>>> fmt.Fprintf(os.Stderr, "fatal error: %s", err.Error())
>>>>> os.Exit(1)
>>>>> }
>>>>> }
>>>>>
>>>>>
>>>>> Just a little change and I run it successfully.But I am doubt why it 
>>>>> can't print "nice to meet you too"??And how to solve it??
>>>>>
>>>>
>>>> Your server does the following on a new connection 
>>>>
>>>> n, err := conn.Read(buf[0:])
>>>> ... 
>>>> n, err2 := conn.Write([]byte("welcome client!"))
>>>>
>>>> Then your client is doing the following on the start of the connection 
>>>>
>>>> n, err := conn.Write([]byte("hello server!"))
>>>> ... 
>>>>
>>>> n, err = conn.Write([]byte(" nice to meet you"))
>>>>
>>>> Both the client and server are blocking on writing and no one is doing 
>>>> any reading. Make sure your client does a read after elderly 
>>>>
>>>
>>> Thanks autocorrect. I have no problem with the elderly, but it has no 
>>> business here in this response. 
>>>
>>> successful write, if you are choosing to do a request/reply pattern. 
>>>>
>>> -- 
>>>>> You received this message because you are subscribed to the Google 
>>>>> Groups "golang-nuts" group.
>>>>>
>>>> To unsubscribe from this group and stop receiving emails from it, send 
>>>>> an email to golang-nuts...@googlegroups.com.
>>>>
>>>>
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "golang-nuts" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to golang-nuts...@googlegroups.com <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to