




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Socket 说 明 文 档 Socket 连接过程 根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服 务器监听,客户端请求,连接确认。 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监 控网络状态。 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客 户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向 服务器端套接字提出连接请求。 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端 套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连 接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。 Java 开发一个 Server-Client 模型的程序 开发原理 服务器,使用 ServerSocket 监听指定的端口,端口可以随意指定(由于 1024 以下的端口通常属于 保留端口,在一些操作系统中不可以随意使用,所以建议使用大于 1024 的端口),等待客户连接请求,客 户连接后,会话产生;在完成会话后,关闭连接。 客户端,使用 Socket 对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会 话;会话完成后,关闭 Socket。客户端不需要指定打开的端口,通常临时的、动态的分配一个 1024 以上 的端口。 Socket 接口是 TCP/IP 网络的 API,Socket 接口定义了许多函数或例程,程序员可以用它们来开发 TCP/IP 网络上的应用程序。要学 Internet 上的 TCP/IP 网络编程,必须理解 Socket 接口。Socket 接口设计 者最先是将接口放在 Unix 操作系统里面的。如果了解 Unix 系统的输入和输出的话,就很容易了解 Socket 了。网络的 Socket 数据传输是一种特殊的 I/O,Socket 也是一种文件描述符。 Socket 也具有一个类似于打 开文件的函数调用 Socket(),该函数返回一个整型的 Socket 描述符,随后的连接建立、数据传输等操作都 是通过该 Socket 实现的。 DEMO 程序实现功能 服务端监听 60000 端口,客户端发送信息 A,服务端返回信息 A,直到客户端发送 exit 时,服务端 断开此次连接。 目录结构及说明 Server 端程序 SocketServer.java import java.io.IOException; import .ServerSocket; import .Socket; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.upower.base.PropertyLoader; public class SocketServer private static Properties socketProp = null; private static int port = 60000;/端口号 private static int POOL_SIZE = 10;/ CPU线程池大小 private ServerSocket serverSocket; private ExecutorService servicePool; / 线程池 public static void main(String args) /loadProp();读取配置文件,不读取使用默认设置。 new SocketServer().service(); public static void loadProp() socketProp = PropertyLoader.loadProperties(“perties“); if (socketProp != null) port = Integer.valueOf(socketProp .getProperty(“SocketPort“, “60000“); POOL_SIZE = Integer.valueOf(socketProp.getProperty(“POOL_SIZE“, “10“); public SocketServer() try this.serverSocket = new ServerSocket(port); this.servicePool = Executors.newFixedThreadPool(POOL_SIZE); catch (IOException e) e.printStackTrace(); System.out.print(e.getMessage(); public void service() System.out.println(“socket服务启动成功!“); while (true) try Socket socket = this.serverSocket.accept(); this.servicePool.execute(new ServerHandler(socket); catch (IOException e) e.printStackTrace(); this.servicePool.shutdown(); ServerHandler.java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import .Socket; public class ServerHandler implements Runnable private Socket socket; public ServerHandler(Socket socket) this.socket = socket; private PrintWriter getWriter(Socket socket) throws IOException OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); private BufferedReader getReader(Socket socket) throws IOException InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn); public void run() try System.out.println(“New connection accepted “ + socket.getInetAddress() + “:“ + socket.getPort(); BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); String msg = null; /读取客户端发送信息并回传信息! while (msg = br.readLine() != null) System.out.println(“input:“ + msg); if (msg.equals(“exit“) break; pw.println(“output:“ + msg); pw.close(); br.close(); catch (IOException e) e.printStackTrace(); System.out.print(“server error!“ ); finally try /关闭socket if (socket != null) socket.close(); catch (IOException e) e.printStackTrace(); Client 端程序 SocketClient.java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import .Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class SocketClient public static void main(String args) / 创建一个线程池 ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(createTask(1); private static Runnable createTask(final int taskID) return new Runnable() private Socket socket = null; private int port = 60000; private PrintWriter getWriter(Socket socket) throws IOException OutputStream socketOut = socket.getOutputStream(); return new PrintWriter(socketOut, true); private BufferedReader getReader(Socket socket) throws IOException InputStream socketIn = socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn); public void run() System.out.println(“client start!“); try / socket连接 socket = new Socket(“localhost“, port); BufferedReader br = getReader(socket); PrintWriter pw = getWriter(socket); String msg = null; System.out.print(“input:“); BufferedReader reader = new BufferedReader( new InputStreamReader(System.in); msg = reader.readLine();/ 从控制台获取输入文本 while (true) pw.println(msg); if (msg.equ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 多点营销活动方案
- 墨香书画活动方案
- 复学课间活动方案
- 大学生表演节目活动方案
- 大米认购活动方案
- 2025-2030中国智慧农业物联网技术应用现状及市场培育周期分析报告
- 培训机构走红毯活动方案
- 2025-2030中国医疗健康产业数字化转型及投资价值评估
- 夏日种植活动方案
- 城市骑行互动活动方案
- 孕产妇健康管理培训课件
- 高校师德师风专题培训课件
- 制造业中员工的仓库管理培训
- 砼回弹强度自动计算表
- 果汁饮料加工厂可行性研究方案
- 2024年肿瘤内科护理理论考试试题
- 医务人员手卫生规范(国家)
- 主题:现代战争与军事科技课件
- 上海华东师范大学附属东昌中学南校重点中学初一语文自主招生试卷模拟试题(5套带答案)
- 化工企业适用-法律法规文件清单
- 贵州省黔东南苗族侗族自治州2022-2023学年七年级下学期期末生物试题(含答案)
评论
0/150
提交评论