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
- Java网络编程--Socket
- java 网络编程socket
- Java网络编程-Socket
- Java Socket网络编程
- Java Socket网络编程
- Java Socket网络编程
- java网络编程socket
- java网络编程socket
- Java Socket网络编程
- java Socket网络编程
- java Socket网络编程
- java socket网络编程
- Java Socket网络编程
- java Socket网络编程
- Socket--java网络编程
- java socket网络编程
- java网络socket编程
- java socket网络编程
- 从浏览器访问一个地址的过程
- C#操作xml
- Linux 调度器发展简述
- Android-Universal-Image-Loader的简单使用
- 使用node-inspector进行调试
- java Socket 网络编程
- 二叉树按层遍历(每层一行)
- 搭建一个简单、易用的 Android 项目框架之BaseActivity(一)
- how to manage swift3 i-- loop
- source insight4.08破解方法
- 最简单的RxJava上手指南(一)
- 欧拉函数-洛谷P2303 [SDOi2012]Longge的问题
- 异或运算交换两个数
- Android Animation 动画(一)--Tween动画