这篇文章我们来用tcp演示两个示例,让我们更深入的了解一下Tcp编程 示例一示例一我们演示一下TCP的简单使用 服务端代码importjava.net.*;importjava.io.*;publicclassTCPEchoServer{privatestaticfinalintBUFSIZE=32;publicstaticvoidmain(String[]args)throwsIOException{intservPort=;ServerSocketservSock=newServerSocket(servPort);intrecvMsgSize;byte[]receiveBuf=newbyte[BUFSIZE];while(true){SocketclntSock=servSock.accept();SocketAddressclientAddress=clntSock.getRemoteSocketAddress();System.out.println("Handlingclientat"+clientAddress);InputStreamin=clntSock.getInputStream();OutputStreamout=clntSock.getOutputStream();while((recvMsgSize=in.read(receiveBuf))!=-1){out.write(receiveBuf,0,recvMsgSize);}clntSock.close();}}}客户端代码 importjava.net.*;importjava.io.*;publicclassTCPEchoClient{publicstaticvoidmain(String[]args)throwsIOException{Stringserver=".0.0.1";intservPort=;byte[]data="Hi,World".getBytes();Socketsocket=newSocket(server,servPort);System.out.println("Connectedtoserver...sendingechostring");InputStreamin=socket.getInputStream();OutputStreamout=socket.getOutputStream();out.write(data);inttotalBytesRcvd=0;intbytesRcvd;while(totalBytesRcvddata.length){if((bytesRcvd=in.read(data,totalBytesRcvd,data.length-totalBytesRcvd))==-1)thrownewSocketException("Connectionclosedprematurely");totalBytesRcvd+=bytesRcvd;}System.out.println("Received:"+newString(data));socket.close();}} 上述代码的TCP服务端是单线程,一次只能服务一个客户端 TCP服务端线程池服务端回传服务类importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;importjava.util.logging.Level;importjava.util.logging.Logger;publicclassEchoProtocolimplementsRunnable{privatestaticfinalintBUFSIZE=32;privateSocketclientSocket;privateLoggerlogger;publicEchoProtocol(SocketclientSocket,Loggerlogger){this.clientSocket=clientSocket;this.logger=logger;}publicstaticvoidhandleEchoClient(SocketclientSocket,Loggerlogger){try{InputStreamin=clientSocket.getInputStream();OutputStreamout=clientSocket.getOutputStream();intrecvMsgSize;inttotalBytesEchoed=0;byte[]echoBuffer=newbyte[BUFSIZE];while((recvMsgSize=in.read(echoBuffer))!=-1){out.write(echoBuffer,0,recvMsgSize);totalBytesEchoed+=recvMsgSize;}}catch(IOExceptionex){logger.log(Level.WARNING,"Exceptioninechoprotocol",ex);}finally{try{clientSocket.close();}catch(IOExceptione){}}}publicvoidrun(){handleEchoClient(this.clientSocket,this.logger);}}每个客户端请求都新启一个线程的Tcp服务端 importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.logging.Logger;publicclassTCPEchoServerThread{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketservSock=newServerSocket();Loggerlogger=Logger.getLogger("practical");while(true){SocketclntSock=servSock.accept();Threadthread=newThread(newEchoProtocol(clntSock,logger));thread.start();logger.info("CreatedandstartedThread"+thread.getName());}}}固定线程数的Tcp服务端 importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.logging.Level;importjava.util.logging.Logger;publicclassTCPEchoServerPool{publicstaticvoidmain(String[]args)throwsIOException{intthreadPoolSize=3;finalServerSocketservSock=newServerSocket();finalLoggerlogger=Logger.getLogger("practical");for(inti=0;ithreadPoolSize;i++){Threadthread=newThread(){publicvoidrun(){while(true){try{SocketclntSock=servSock.accept()EchoProtocol.handleEchoClient(clntSock,logger);}catch(IOExceptionex){logger.log(Level.WARNING,"Clientacceptfailed",ex);}}}};thread.start();logger.info("CreatedandstartedThread="+thread.getName());}}}线程池工具类: importjava.util.concurrent.*;/***任务执行者** authorWatsonXu*since1.0.0p-6-8上午10:33:09/p*/publicclassThreadPoolTaskExecutor{privateThreadPoolTaskExecutor(){}privatestaticExecutorServiceexecutor=Executors.newCachedThreadPool(newThreadFactory(){intcount;/*执行器会在需要自行任务而线程池中没有线程的时候来调用该程序。对于callable类型的调用通过封装以后转化为runnable*/publicThreadnewThread(Runnabler){count++;ThreadinvokeThread=newThread(r);invokeThread.setName("CourserThread-"+count);invokeThread.setDaemon(false);//returninvokeThread;}});publicstaticvoidinvoke(Runnabletask,TimeUnitunit,longtimeout)throwsTimeoutException,RuntimeException{invoke(task,null,unit,timeout);}publicstaticTTinvoke(Runnabletask,Tresult,TimeUnitunit,longtimeout)throwsTimeoutException,RuntimeException{FutureTfuture=executor.submit(task,result);Tt=null;try{t=future.get(timeout,unit);}catch(TimeoutExceptione){thrownewTimeoutException("Threadinvoketimeout...");}catch(Exceptione){thrownewRuntimeException(e);}returnt;}publicstaticTTinvoke(CallableTtask,TimeUnitunit,longtimeout)throwsTimeoutException,RuntimeException{//这里将任务提交给执行器,任务已经启动,这里是异步的。FutureTfuture=executor.submit(task);//System.out.println("Taskareadyinthread");Tt=null;try{/**这里的操作是确认任务是否已经完成,有了这个操作以后*1)对invoke()的调用线程变成了等待任务完成状态*2)主线程可以接收子线程的处理结果*/t=future.get(timeout,unit);}catch(TimeoutExceptione){thrownewTimeoutException("Threadinvoketimeout...");}catch(Exceptione){thrownewRuntimeException(e);}returnt;}}具有伸缩性的Tcp服务端importjava.io.IOException;importjava.net.ServerSocket;importjava.net.Socket;importjava.util.concurrent.TimeUnit;importjava.util.logging.Logger;importdemo.callable.ThreadPoolTaskExecutor;publicclassTCPEchoServerExecutor{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketservSock=newServerSocket();Loggerlogger=Logger.getLogger("practical");while(true){SocketclntSock=servSock.accept();//executorService.submit(newEchoProtocol(clntSock,logger));try{ThreadPoolTaskExecutor.invoke(newEchoProtocol(clntSock,logger),TimeUnit.SECONDS,3);}catch(Exceptione){}//service.execute(newTimelimitEchoProtocol(clntSock,logger));}}} 在阅读过程中遇到问题,可以发送信息给北京那个治疗白癜风医院比较好北京哪个白癜风医院比较好
|