一客户一线程的服务器简单代码示例,有新的客户端连接则启动一个新的线程
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Logger;
public class TCPEchoServerThread {
public static void main(String[] args) throws IOException {
if(args.length != 1){
throw new IllegalArgumentException("Parameter(s): ");
}
int echoServPort = Integer.parseInt(args[0]);
ServerSocket servSock = new ServerSocket(echoServPort);
Logger logger = Logger.getLogger("practical");
while(true){
Socket clntSock = servSock.accept();
Thread Thread = new Thread(new EchoProtocol(clntSock, logger));
Thread.start();
logger.info("Created and started Thread" + Thread.getName());
}
}
}
其中EchoProtocol代码如下:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class EchoProtocol implements Runnable {
private static final int BUFSIZE = 32;
private Socket clntSock;
private Logger logger;
public EchoProtocol(Socket clntSock, Logger logger) {
this.clntSock = clntSock;
this.logger = logger;
}
public static void handleEchoClient(Socket clntSock, Logger logger){
try{
InputStream in = clntSock.getInputStream();
OutputStream ut = clntSock.getOutputStream();
int recvMsgSize;
int totalBytesEchoed = 0;
byte[] echoBuffer = new byte[BUFSIZE];
while((recvMsgSize = in.read(echoBuffer)) != -1){
out.write(echoBuffer, 0, recvMsgSize);
totalBytesEchoed += recvMsgSize;
}
logger.info("Client " + clntSock.getRemoteSocketAddress() + ", echoed" + totalBytesEchoed + " bytes.");
}catch(IOException ex){
logger.log(Level.WARNING, "Exception in echo protocol", ex);
}finally{
try{
clntSock.close();
}catch(IOException e){
}
}
}
public void run() {
handleEchoClient(clntSock, logger);
}
}
运行情况,服务器先运行
E:\socket>java TCPEchoServerThread 9080
2012-4-12 0:08:31 TCPEchoServerThread main
信息: Created and started ThreadThread-1
客户端就是之前日志的程序,
E:\socket>java TCPEchoClient 192.168.1.100 test2 9080
Connected to server ... sending echo string
Received: test2