java Socket 网络编程

来源:互联网 发布:c 网络编程教程 编辑:程序博客网 时间:2024/06/05 06:05

一个简单最古老的Socket 通信例子:

应用程序通常通过Socket 向网络发出请求或者应答网络请求

Socket 和ServerSocket  ServerSocket是服务器端,Socket是客户端建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个Socket实例

(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是出于等待连接的状态,实时监控网络状态

(2)客户端请求:是指由客户端套接字提出连接请求,要链接的目标是服务端的套接字,指出服务器的地址端口号,然后向服务器端套接字提出连接请求。

(3)服务器端连接确认:服务器端监听到客户端的连接请求,它就响应给客户端,建立一个新的线程,把服务器端的描述发送给客户端

(4)客户端连接确认:一旦客户端确认了此描述,连接就建立好了,双方开始通信,而服务器继续处于监听状态,继续接受其他客户端的连接请求

public class Server {final static int PROT = 8765;public static void main(String[] args) {ServerSocket server = null;try {//绑定端口server = new ServerSocket(PROT);System.out.println(" server start .. ");//进行阻塞Socket socket = server.accept();//新建一个线程执行客户端的任务new Thread(new ServerHandler(socket)).start();} catch (Exception e) {e.printStackTrace();} finally {if(server != null){try {server.close();} catch (IOException e) {e.printStackTrace();}}server = null;}}
public class Client {final static String ADDRESS = "127.0.0.1";final static int PORT = 8765;public static void main(String[] args) {Socket socket = null;BufferedReader in = null;PrintWriter out = null;try {//绑定服务器地址socket = new Socket(ADDRESS, PORT);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(), true);//向服务器端发送数据out.println("接收到客户端的请求数据...");out.println("接收到客户端的请求数据1111...");String response = in.readLine();System.out.println("Client: " + response);} catch (Exception e) {e.printStackTrace();} finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}if(out != null){try {out.close();} catch (Exception e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}socket = null;}}}

public class ServerHandler implements Runnable{private Socket socket ;public ServerHandler(Socket socket){this.socket = socket;}@Overridepublic void run() {BufferedReader in = null;PrintWriter out = null;try {in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));out = new PrintWriter(this.socket.getOutputStream(), true);String body = null;while(true){body = in.readLine();if(body == null) break;System.out.println("Server :" + body);out.println("服务器端回送响的应数据.");}} catch (Exception e) {e.printStackTrace();} finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}if(out != null){try {out.close();} catch (Exception e) {e.printStackTrace();}}if(socket != null){try {socket.close();} catch (IOException e) {e.printStackTrace();}}socket = null;}}}


以上代码 都是每一个客户端连接 会启动一个线程去处理 通信,如果100个客户端,会启动100个线程,如果客户端不断增大时,古老的Socket 无法满足需求。

在JDK1.5之前 通过使用线程池的方式 去降低服务器端的压力:

public class Server {final static int PORT = 8765;public static void main(String[] args) {ServerSocket server = null;BufferedReader in = null;PrintWriter out = null;try {server = new ServerSocket(PORT);System.out.println("server start");Socket socket = null;HandlerExecutorPool executorPool = new HandlerExecutorPool(50, 1000);while(true){socket = server.accept();executorPool.execute(new ServerHandler(socket));}} catch (Exception e) {e.printStackTrace();} finally {if(in != null){try {in.close();} catch (Exception e1) {e1.printStackTrace();}}if(out != null){try {out.close();} catch (Exception e2) {e2.printStackTrace();}}if(server != null){try {server.close();} catch (Exception e3) {e3.printStackTrace();}}server = null;}}}

public class HandlerExecutorPool {private ExecutorService executor;public HandlerExecutorPool(int maxPoolSize, int queueSize){this.executor = new ThreadPoolExecutor( //系统最大线程数Runtime.getRuntime().availableProcessors(),maxPoolSize, 120L, TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(queueSize));}cpublic void execute(Runnable task){this.executor.execute(task);}}



0 0
原创粉丝点击