一、前言
关于网络编程,这一章一般用NIO编程,但是我们得一步步,免得扯着蛋蛋。我们先温习一下,socket的服务器---客户端;我们适用服务端用线程池,线程池没有懂得小火炮,看以前的,或者直接问群里就ok。
二、socket服务端多线程
友情提示:可以用spring或者注解线程池,在实际运用的时候;
2.1 socket线程池实现客户端
package pattern.nio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by ycy on 16/1/18. */ public class MultiThreadEchoserver { private static ExecutorService tp = Executors.newCachedThreadPool(); static class HandleMsg implements Runnable { Socket clientSocket; public HandleMsg(Socket clientSocket) { this.clientSocket = clientSocket; } public void run() { BufferedReader is = null; PrintWriter os = null; try { is = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); os=new PrintWriter(clientSocket.getOutputStream(),true); //从inputstream 中读取客户端发送的数据 String inputString =null; long b = System.currentTimeMillis(); while ((inputString = is.readLine()) != null) { System.out.println("搜到客户端数据"+inputString); os.println(inputString+"--来自服务端"); } long e = System.currentTimeMillis(); System.out.println("spend:" + (e - b) + "ms"); } catch (IOException e) { e.printStackTrace(); } finally { try { if (is != null) { is.close(); } if (os != null) { os.close(); } clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { ServerSocket serverSocke = null; Socket clientSocket = null; try { serverSocke = new ServerSocket(65500); } catch (IOException e) { e.printStackTrace(); } while (true) { try { clientSocket = serverSocke.accept(); System.out.println(clientSocket.getRemoteSocketAddress() + " conect"); tp.execute(new HandleMsg(clientSocket)); } catch (IOException e) { e.printStackTrace(); } } } }
2.2 socke客户端
注意里面注解:巨坑package pattern.nio; import java.io.*; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; /** * Created by ycy on 16/1/18. */ public class Client { public static void main(String[] args) throws IOException { Socket client=null; PrintWriter writer=null; BufferedReader reader=null; try { client=new Socket(); client.connect(new InetSocketAddress("127.0.0.1",65500)); writer=new PrintWriter(client.getOutputStream(),true); OutputStream os=client.getOutputStream(); String secondeString="这个是通过os传送得---"; os.write(secondeString.getBytes()); //巨坑:如果你服务端口用readline来读取,客户端用print 来写入数据,那么客户端就一直不能关闭.不信你试一试 writer.printf("hello"); writer.flush(); reader=new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("from serverL:"+reader.readLine()); }catch (UnknownHostException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); }finally { if (writer!=null){ writer.close(); } if (reader!=null){ reader.close(); } if (client!=null){ client.close(); } } } }
2.3 高io的客户端
package pattern.nio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.LockSupport; /** * Created by ycy on 16/1/19. * 这个适用LockSupport阻塞当前线程模拟 * io耗时的情况,服务器响应就慢了; * 在其他语言里面,所以不要这么用,这么用就显得逼格不高了.就像生产者-消费者一样,高逼格都是用队列服务器了 * */ public class HeavySocketClient { private static ExecutorService tp = Executors.newCachedThreadPool(); private static final int sleep_time = 1000 * 1000 * 1000; public static class EchoClient implements Runnable { public void run() { Socket client = null; PrintWriter writer = null; BufferedReader reader = null; try { client = new Socket(); client.connect(new InetSocketAddress("127.0.0.1", 65500)); writer = new PrintWriter(client.getOutputStream(), true); writer.print("high client"); LockSupport.parkNanos(sleep_time); writer.print("end client1"); LockSupport.parkNanos(sleep_time); writer.print("end client2"); LockSupport.parkNanos(sleep_time); writer.print("end client3"); LockSupport.parkNanos(sleep_time); writer.print("end client4"); LockSupport.parkNanos(sleep_time); writer.print("end client5"); LockSupport.parkNanos(sleep_time); writer.print("end client6"); writer.println(); writer.flush(); reader = new BufferedReader(new InputStreamReader(client.getInputStream())); System.out.println("from server:" + reader.readLine()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (writer != null) { writer.close(); } if (reader != null) { reader.close(); } if (client != null) { client.close(); } } catch (IOException e) { e.printStackTrace(); } } } } public static void main(String[] args) { EchoClient ec=new EchoClient(); for (int i = 0; i <10 ; i++) { tp.submit(ec); } } }
三、预告
本身就不熟悉的socket服务,看起来还是不尽人意。你不熟悉,并不是因为你差,是因为这个市场需要这个少。呵呵。 那么未来解决io慢得情况,我们适用NIO编辑,这个才是网络编程的实用点哦