Path: csiph.com!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!usenet.ukfsn.org!not-for-mail From: Martin Gregorie Newsgroups: comp.lang.java.programmer Subject: Re: Socket problem: read & write to same socket Date: Tue, 13 Mar 2012 21:33:01 +0000 (UTC) Organization: UK Free Software Network Lines: 65 Message-ID: References: <13556496.472.1331654504832.JavaMail.geo-discussion-forums@ynhs12> NNTP-Posting-Host: 84.45.235.129 Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: localhost.localdomain 1331674381 30598 84.45.235.129 (13 Mar 2012 21:33:01 GMT) X-Complaints-To: usenet@localhost.localdomain NNTP-Posting-Date: Tue, 13 Mar 2012 21:33:01 +0000 (UTC) User-Agent: Pan/0.135 (Tomorrow I'll Wake Up and Scald Myself with Tea; GIT 30dc37b master) Xref: csiph.com comp.lang.java.programmer:12986 On Tue, 13 Mar 2012 09:01:44 -0700, liyaohua.bupt wrote: > I want to establish connection to a server(written by myself in Go > language), read from socket, and then write into socket. > > The connection can be established, and it reads correctly. But after > that and when I want to write to socket, it closes the connection. I > used wireshark to listen to the packets. I saw my program sent a FIN to > the server side. So the server receives nothing. > > Note that the server side only sends one line into socket. > > I later wrote a server in Java and a client in Go. They work fine in > both read and write. > Your code may accept one connection, read from and write to it, and close it, but its not a server because: (a) it doesn't listen for connections (b) it hasn't the right logical structure for accepting more than one connection either serially or in parallel with an existing connection (c) it stops itself without receiving a 'stop' command If your GO server uses similar logic, frankly I'm not surprised it isn't doing anything useful. The logic you've written might function as a service under the Unix superserver xinetd, but in that case it would not be using a Socket: it would be using System.in and System.out to handle messages passed to it via xinetd. Anything claims to be a freestanding Java server should be listening for connections on a ServerSocket instead of a Socket and, whenever it accepts an incoming connection it should do this: on connect: if connection limit reached send a connection rejected message else spawn a worker thread and pass it the connection while connected accept input validate input do work send response close the socket terminate the thread The server should keep on listening for and acception connections until it is stopped by a command: it should never terminate itself until it receives a positive request to do so. There are a variety of ways of telling a server to stop, including clock watching or monitoring a database, but I normally use a special control client that can stop the server, query its status, etc. because this reuses the same mechanism as its other clients and so is easy to implement. -- martin@ | Martin Gregorie gregorie. | Essex, UK org |