当前位置: 首页 > news >正文

陕西营销型手机网站建设短链接

陕西营销型手机网站建设,短链接,iis6 网站无法访问,培训机构怎么做线上推广1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大#xff0c;但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类#xff1a; 1、ServerSocket#xff1a;给服务器使用的类#xff0c;使用这个类来绑定端口号 2、Socket#xf…1. 关于TCP 1.1 TCP 的socket api tcp的socket api和U大片的socket api差异很大但是和前面所讲的文件操作很密切的联系 下面主要讲解两个关键的类 1、ServerSocket给服务器使用的类使用这个类来绑定端口号 2、Socket即会给服务器使用又会给客户端使用 TCP是字节流的传输的基本单位是Byte 所谓连接通信双方是否会记录保存对端的信息        对于UDP来说每一次发送数据报都要手动在send方法中指定目标的地址UDP自身没有存储这个信息        对于TCP来说则不需要前提是需要先把连接建立起来连接如何建立不需要我们通过代码进行干预是系统内核自动负责完成的        对于应用程序来说客户端这边主要是发起“建立连接”动作         服务器这边主要是把建立好的连接从内核中拿到应用程序        如果有客户端和服务器建立连接买这个时候服务器的应用程序是不需要做出任何操作也没有任何感知内核直接完成了连接建立的流程三次握手完成流程之后就会在内核的队列中排队这个队列是每一个serverSocket都有这样一个队列应用程序要想和这个客户端进行通信就需要通过一个accept方法把内核队列中已经建立好的连接对象拿到应用程序中 2 基于TCP实现通信  2.1 代码实现    服务器代码 package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;public class TcpEchoServer {private ServerSocket serverSocket null;public TcpEchoServer(int port) throws IOException {serverSocket new ServerSocket(port);}public void start() throws IOException {System.out.println(服务器启动!);ExecutorService service Executors.newCachedThreadPool();while (true) {// 通过 accept 方法, 把内核中已经建立好的连接拿到应用程序中.// 建立连接的细节流程都是内核自动完成的. 应用程序只需要 捡现成 的.Socket clientSocket serverSocket.accept();// 此处不应该直接调用 processConnection, 会导致服务器不能处理多个客户端.// 创建新的线程来调用更合理的做法.// 这种做法可行, 不够好 // Thread t new Thread(() - { // processConnection(clientSocket); // }); // t.start();// 更好一点的办法, 是使用线程池.service.submit(new Runnable() {Overridepublic void run() {processConnection(clientSocket);}});}}// 通过这个方法, 来处理当前的连接.public void processConnection(Socket clientSocket) {// 进入方法, 先打印一个日志, 表示当前有客户端连上了.System.out.printf([%s:%d] 客户端上线!\n, clientSocket.getInetAddress(),clientSocket.getPort());// 接下来进行数据的交互.try (InputStream inputStream clientSocket.getInputStream();OutputStream outputStream clientSocket.getOutputStream()) {// 使用 try ( ) 方式, 避免后续用完了流对象, 忘记关闭.// 由于客户端发来的数据, 可能是 多条数据, 针对多条数据, 就循环的处理.while (true) {Scanner scanner new Scanner(inputStream);if (!scanner.hasNext()) {// 连接断开了. 此时循环就应该结束System.out.printf([%s:%d] 客户端下线!\n, clientSocket.getInetAddress(), clientSocket.getPort());break;}// 1. 读取请求并解析. 此处就以 next 来作为读取请求的方式.// next 的规则是, 读到 空白符 就返回.String request scanner.next();// 2. 根据请求, 计算响应.String response process(request);// 3. 把响应写回到客户端.// 可以把 String 转成字节数组, 写入到 OutputStream// 也可以使用 PrintWriter 把 OutputStream 包裹一下, 来写入字符串.PrintWriter printWriter new PrintWriter(outputStream);// 此处的 println 不是打印到控制台了, 而是写入到 outputStream 对应的流对象中, 也就是写入到 clientSocket 里面.// 自然这个数据也就通过网络发送出去了. (发给当前这个连接的另外一端)// 此处使用 println 带有 \n 也是为了后续 客户端这边 可以使用 scanner.next 来读取数据.printWriter.println(response);// 此处还要记得有个操作, 刷新缓冲区. 如果没有刷新操作, 可能数据仍然是在内存中, 没有被写入网卡.printWriter.flush();// 4. 打印一下这次请求交互过程的内容System.out.printf([%s:%d] req%s, resp%s\n, clientSocket.getInetAddress(), clientSocket.getPort(),request, response);}} catch (IOException e) {e.printStackTrace();} finally {try {// 在这个地方, 进行 clientSocket 的关闭.// processConnection 就是在处理一个连接. 这个方法执行完毕, 这个连接也就处理完了.clientSocket.close();} catch (IOException e) {e.printStackTrace();}}}public String process(String request) {// 此处也是写的回显服务器. 响应和请求是一样的.return request;}public static void main(String[] args) throws IOException {TcpEchoServer server new TcpEchoServer(9090);server.start();} }客户端代码 package network;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner;public class TcpEchoClient {private Socket socket null;public TcpEchoClient(String serverIp, int serverPort) throws IOException {// 需要在创建 Socket 的同时, 和服务器 建立连接, 此时就得告诉 Socket 服务器在哪里~~// 具体建立连接的细节, 不需要咱们代码手动干预. 是内核自动负责的.// 当我们 new 这个对象的时候, 操作系统内核, 就开始进行 三次握手 具体细节, 完成建立连接的过程了.socket new Socket(serverIp, serverPort);}public void start() {// tcp 的客户端行为和 udp 的客户端差不多.// 都是:// 3. 从服务器读取响应.// 4. 把响应显示到界面上.Scanner scanner new Scanner(System.in);try (InputStream inputStream socket.getInputStream();OutputStream outputStream socket.getOutputStream()) {PrintWriter writer new PrintWriter(outputStream);Scanner scannerNetwork new Scanner(inputStream);while (true) {// 1. 从控制台读取用户输入的内容System.out.print(- );String request scanner.next();// 2. 把字符串作为请求, 发送给服务器// 这里使用 println, 是为了让请求后面带上换行.// 也就是和服务器读取请求, scanner.next 呼应writer.println(request);writer.flush();// 3. 读取服务器返回的响应.String response scannerNetwork.next();// 4. 在界面上显示内容了.System.out.println(response);}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException {TcpEchoClient client new TcpEchoClient(127.0.0.1, 9090);client.start();} }2.2 代码分析  1、基础内容         所谓的空白符是一类特殊的字符类似于换行回车符空格制表符翻页付垂直制表符后续客户端发起的请求会议空白符作为结束标记此处就约定使用\n         TCP 是字节流通信方式,每次传输多少个字节,每次读取多少个字节我们往往会手动约定出,从哪里到哪里是一个完整的数据报.上述这里就是约定了使用 \n 作为数据报的结束标记. 就正好可以搭配scanner.next 来完成请求的读取过程,         ClientSocket 则是在循环中,每次有一个新的客户端来建立连接,都会创建出新的 clientSocket         每一次执行到clientSocket语句时,都会创建新的 clientsockete并且这个 socket 最多使用到该客户端退出 (断开连接此时,如果有很多客户端都来建立连接此时,就意味着每个连接都会创建 clientSocket.当连接断开后clientsocket 就失去作用了,但是如果没有手动 close此时这个 socket 对象就会占据着文件描述符表的位置         这里的关闭, 只是关闭了 clientsocket 上自带的流对象,并没有关闭 socket 本身.在这个代码中,需要在方法末尾通过 finally 加上 close,保证当前这里的 socket 能够被正确关闭掉 2、关于多线程 当前启动两个客户端,同时连接服务器.其中一个客户端(先启动的客户端)一切正常另一个客户端 (后启动的客户端)则没法和服务器进行任何交豆.(服务器不会提示建立连接”,也不会针对 请求 做出任何响应这就是关于多线程的一个很明显的问题         第一个客户端过来之后,accept 就返回了,得到一个 clientSocket.进入processConnection 又进入一个 while 循环,这个循环中, 就需要反复处理客户端发来的请求数据.如果客户端这会没发请求,服务器的代码就会阻塞在scanner.hasNext 这里         此时此刻,第二个客户端也过来建立连接了,此时连接是可以建立成功(内核负责的)建立成功之后,连接对象就会在内核的队列里等待代码通过 accept 把连接给取出来,在代码中处理 当前的代码,其实无法第一时间执行到第二次的 accept          为了让一个服务器可以同时接待多个客户端上述问题解决的关键就是引入多线程让每一个客户端都能进行入到accept方法进入第二次循环 3、关于引入线程池         此时这个服务器,每个客户端都要创建一个线程,如果有很多客户端.频繁的来进行建立连接/断开连接这个时候就会导致服务器频繁的 创建/销毁 线程,(开销就很大了)所以可以使用线程池,来进一步的优化关于线程开销的问题 2.3 代码运行分析 tcp 程序, 客户端启动,就会和服务器建立连接服务器这边就能感受到(accept 方法就会返回,进一步的进入到 processConnection 中如果启动多个客户端,即多个客户端同时和服务器建立连接默认情况下,IDEA 只允许一个代码只能创建一个进程.通过下图所示操作,勾选了 Allow multiple instances,此时就可以运行多个进程了.         最后通过使用多线程和线程池的相关内容完成tcp通信如下图所示 ps本篇文章主要讲解了关于tcp实现通信连接的相关的知识点如果大家感兴趣的话就请一键三连哦
http://www.zqtcl.cn/news/536663/

相关文章:

  • 可以做pos机的网站app网站建设制作
  • 手机移动端网站影视摄影传媒公司
  • 做化工资讯的网站湖南省做网站的
  • 廊坊哪些公司做网站做网站域名是什么意思
  • 印刷网络商城网站建设上海那家公司做响应式网站建设
  • 四川省建设厅职称查询网站购物网站页面设计
  • 网站开发导航可以进不良网站的浏览器
  • 一个中介平台网站的建设费wordpress 文章列表只显示标题
  • 网站建设包括两个方面聊城建设路小学网站
  • 怎么样做一个自己的网站遵义软件制作平台
  • 推广网站实例建设厅的证在哪里查询
  • 分类网站建设方案做学校教务处网站
  • 如何做链接淘宝客的网站只做画册的网站
  • docker可以做网站吗专业的营销型网站
  • 重庆市建设工程安全网站上海制造网站公司
  • 咨询网站公司建设计划书安卓软件开发软件
  • 手机网站建设文章直播平台开发多少钱
  • 站长综合查询工具常用的网站开发语言有哪些
  • 免费网站看v片在线第一次做乌市seo网络营销流程
  • 社交网站模板下载柬埔寨网赌网站开发
  • 网站开发合同是否要交印花税杭州集团网站建设
  • 企业网站建设排名资讯一个公司做两个网站可以吗
  • 简单门户网站开发灰色行业seo大神
  • 网站开发学那种语言外贸推广网站建设
  • 公司网站建设及推广中国优秀企业网站欣赏
  • 个人代做网站建设京东类的网站需要什么流程
  • 建设一个地方门户网站厦门网站开发排名
  • 网站建设公司广告标题语网站设计主题有哪些
  • 网站推广方式主要通过做网站所需的知识技能
  • 我想在阿里巴巴网站开店_怎么做app建设网站公司