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

记事本做网站怎么改字体沈阳百度seo关键词排名优化软件

记事本做网站怎么改字体,沈阳百度seo关键词排名优化软件,宝塔面板wordpress静态化,郑州知名做网站公司目录 TCP两个核心类 服务端 1.用ServerSocker类创建对象并且手动指定端口号 2.accept阻塞连接服务端与客户端 3.给客户端提供处理业务方法 4.处理业务 整体代码 客户端 1.创建Socket对象,并连接服务端的ip与端口号 2.获取Socket流对象,写入数据…

目录

TCP两个核心类

服务端

1.用ServerSocker类创建对象并且手动指定端口号

2.accept阻塞连接服务端与客户端

3.给客户端提供处理业务方法

4.处理业务

整体代码

客户端

1.创建Socket对象,并连接服务端的ip与端口号

2.获取Socket流对象,写入数据,阻塞等待服务端响应

整体代码

jconsole用来监控java线程


TCP两个核心类

ServerSocket 服务器使用socket

accept没有参数 返回值是一个Socket对象

功能是等待服务器和客户端建立连接,建立成功后则会把这个连接获取到进程中。接下来就通过Scoket返回的对象来进行交互

Scoket服务器和客户端都使用socket

通过socket对象就可以进行发送接收数据

socket内部包含了输入流对象(接收) 输出流对象 (发送)

服务端

1.用ServerSocker类创建对象并且手动指定端口号

    private ServerSocket serverSocket=null;public Test1(int port) throws IOException {serverSocket=new ServerSocket(port);

2.accept阻塞连接服务端与客户端

当我们用UDP那样连接客户端会出现一个问题

UDP是无连接的,他发送数据时直接用地址端口号发送

而TCP是有连接的,当我们用accept连接时,ProcessConnect方法会一直被循环执行单个客户端,而其他客户端要连接时,无法执行到accept,必须等待ProcessConnect方法执行结束,所以会被阻塞。简单来说就是当有一个客户端连接时,其他客户端必须等待连接的客户端断开连接才能连接,还是一个个来连接。

所以ProcessConnect方法我们直接交给线程去执行,这样其他客户端来连接时,直接让线程去执行处理客户端业务。

所以我们可以用到多线程

既然用到了多线程,就可以用出线程池,效率会更高。

public void start() throws IOException {System.out.println("服务器启动");while (true){//阻塞等待服务器与客户端建立连接Socket socket=serverSocket.accept();//若没线程 当一个客户端连接后 会一直在ProcessConnect内//其他客户端连接时 必须要等待ProcessConnect结束,进入下一次循环,才能执行到Socketsocket=serverSocket.accept(); 才能连接下一个客户端
//           // ProcessConnect(socket);//所以执行处理客户端请求,我们让线程去干,这样就不会在一个线程内阻塞
//            Thread thread=new Thread(()->{
//                try {
//                    ProcessConnect(socket);
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            });
//            thread.start();//线程池ExecutorService executorService= Executors.newCachedThreadPool();executorService.submit(new Runnable() {@Overridepublic void run() {try {ProcessConnect(socket);} catch (IOException e) {throw new RuntimeException(e);}}});}}

3.给客户端提供处理业务方法

我们可以直接获取Socket内的流对象,直接写入读出即可

需要注意,写入数据时,因为时流对象接收,要\n等待其他结束,而我们输入数据时,流对象是不会写入\n的,所以我们可以在数据后自动添加\n 或者用println默认有个\n

public void ProcessConnect(Socket socket) throws IOException {//实际他们交流数据是一个为socket类型的文件System.out.printf("[地址:%s:端口号%d]建立连接成功\n",socket.getInetAddress().toString(),socket.getPort());try (InputStream inputStream = socket.getInputStream();//获取socket内部的input流OutputStream outputStream = socket.getOutputStream())//获取socket内部的output流{Scanner scanner = new Scanner(inputStream);PrintWriter printWriter = new PrintWriter(outputStream);//长连接写法while (true) {if(!scanner.hasNext()){System.out.printf("[地址:%s:端口号%d]断开连接",socket.getInetAddress().toString(),socket.getPort());}//从客户端接收数据String resqust = scanner.next();System.out.println("服务器接收数据");//处理数据String response = process(resqust);System.out.println("服务器处理数据");//因为这用流接收 我们按下换行是被scanner接收但并未添加到数据内 而服务器接收流收到的数据内//是没有换行符的 就会一直阻塞 所以我们要在数据后再加个\n//服务器发送数据//printWriter.write(response+'\n');//或者直接使用println自带\nprintWriter.println(response);System.out.println("服务器发送数据");//刷新缓冲区printWriter.flush();System.out.printf("[地址:%s:端口号:%d]接收数据:%s 响应数据:%s",socket.getInetAddress().toString(),socket.getPort(),resqust,response);}}}

4.处理业务

这里是为了演示TCP连接,所以只写个简单回传

public String process(String s){return s;}

整体代码

package TestTCP;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.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;//服务器
public class Test1 {private ServerSocket serverSocket=null;public Test1(int port) throws IOException {serverSocket=new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while (true){//阻塞等待服务器与客户端建立连接Socket socket=serverSocket.accept();//若没线程 当一个客户端连接后 会一直在ProcessConnect内//其他客户端连接时 必须要等待ProcessConnect结束,进入下一次循环,// 才能执行到Socketsocket=serverSocket.accept(); 才能连接下一个客户端
//            ProcessConnect(socket);//所以执行处理客户端请求,我们让线程去干,这样就不会在一个线程内阻塞
//            Thread thread=new Thread(()->{
//                try {
//                    ProcessConnect(socket);
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            });
//            thread.start();//线程池ExecutorService executorService= Executors.newCachedThreadPool();executorService.submit(new Runnable() {@Overridepublic void run() {try {ProcessConnect(socket);} catch (IOException e) {throw new RuntimeException(e);}}});}}//给当前客户端提供服务方法public void ProcessConnect(Socket socket) throws IOException {//实际他们交流数据是一个为socket类型的文件System.out.printf("[地址:%s:端口号%d]建立连接成功\n",socket.getInetAddress().toString(),socket.getPort());try (InputStream inputStream = socket.getInputStream();//获取socket内部的input流OutputStream outputStream = socket.getOutputStream())//获取socket内部的output流{Scanner scanner = new Scanner(inputStream);PrintWriter printWriter = new PrintWriter(outputStream);//长连接写法while (true) {if(!scanner.hasNext()){System.out.printf("[地址:%s:端口号%d]断开连接",socket.getInetAddress().toString(),socket.getPort());}//从客户端接收数据String resqust = scanner.next();System.out.println("服务器接收数据");//处理数据String response = process(resqust);System.out.println("服务器处理数据");//因为这用流接收 我们按下换行是被scanner接收但并未添加到数据内 而服务器接收流收到的数据内//是没有换行符的 就会一直阻塞 所以我们要在数据后再加个\n//服务器发送数据//printWriter.write(response+'\n');//或者直接使用println自带\nprintWriter.println(response);System.out.println("服务器发送数据");//刷新缓冲区printWriter.flush();System.out.printf("[地址:%s:端口号:%d]接收数据:%s 响应数据:%s",socket.getInetAddress().toString(),socket.getPort(),resqust,response);}}}public String process(String s){return s;}public static void main(String[] args) throws IOException {Test1 t1=new Test1(8080);t1.start();}
}

客户端

1.创建Socket对象,并连接服务端的ip与端口号

    private Socket socket=null;public Test2() throws IOException {socket=new Socket("127.0.0.1",8080);

2.获取Socket流对象,写入数据,阻塞等待服务端响应

    public void start() throws IOException {try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){while (true){Scanner scanner=new Scanner(inputStream);PrintWriter printWriter=new PrintWriter(outputStream);Scanner scanner1=new Scanner(System.in);System.out.println("输入数据>");String requst=scanner1.next();//因为这用流接收 我们按下换行是被scanner接收但并未添加到数据内 而服务器接收流收到的数据内//是没有换行符的 就会一直阻塞 所以我们要在数据后再加个\n//printWriter.write(requst+'\n');//或者直接使用println自带\nprintWriter.println(requst);//刷新缓冲区printWriter.flush();String response=scanner.next();System.out.println(response);}}finally {socket.close();}}

整体代码

package TestTCP;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 Test2 {private Socket socket=null;public Test2() throws IOException {socket=new Socket("127.0.0.1",8080);}public void start() throws IOException {try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){while (true){Scanner scanner=new Scanner(inputStream);PrintWriter printWriter=new PrintWriter(outputStream);Scanner scanner1=new Scanner(System.in);System.out.println("输入数据>");String requst=scanner1.next();//因为这用流接收 我们按下换行是被scanner接收但并未添加到数据内 而服务器接收流收到的数据内//是没有换行符的 就会一直阻塞 所以我们要在数据后再加个\n//printWriter.write(requst+'\n');//或者直接使用println自带\nprintWriter.println(requst);//刷新缓冲区printWriter.flush();String response=scanner.next();System.out.println(response);}}finally {socket.close();}}public static void main(String[] args) throws IOException {Test2 t2=new Test2();t2.start();}
}

jconsole用来监控java线程

jconsole在路径 jdk/bin/jconsole.exe

例:

我们需要看util最后一局,可以看出线程是在next阻塞着。


文章转载自:
http://neurosurgeon.dztp.cn
http://dehors.dztp.cn
http://golly.dztp.cn
http://ameslan.dztp.cn
http://mica.dztp.cn
http://agate.dztp.cn
http://logroll.dztp.cn
http://zymosterol.dztp.cn
http://rebill.dztp.cn
http://decastyle.dztp.cn
http://grisliness.dztp.cn
http://ice.dztp.cn
http://flintify.dztp.cn
http://ganef.dztp.cn
http://cinquecento.dztp.cn
http://erectly.dztp.cn
http://wallboard.dztp.cn
http://papuan.dztp.cn
http://repone.dztp.cn
http://sensitivity.dztp.cn
http://ribosome.dztp.cn
http://sericate.dztp.cn
http://saurel.dztp.cn
http://feep.dztp.cn
http://touareg.dztp.cn
http://glottalize.dztp.cn
http://istria.dztp.cn
http://seated.dztp.cn
http://suborbicular.dztp.cn
http://encrust.dztp.cn
http://venturi.dztp.cn
http://shellac.dztp.cn
http://magnetizer.dztp.cn
http://reticuloendothelial.dztp.cn
http://calligraphic.dztp.cn
http://chiricahua.dztp.cn
http://gustation.dztp.cn
http://confiscatory.dztp.cn
http://pseudoallele.dztp.cn
http://irl.dztp.cn
http://unauthorized.dztp.cn
http://splenectomize.dztp.cn
http://retardant.dztp.cn
http://renata.dztp.cn
http://querulously.dztp.cn
http://coact.dztp.cn
http://biodynamics.dztp.cn
http://skirmish.dztp.cn
http://seeable.dztp.cn
http://curettement.dztp.cn
http://cowpoke.dztp.cn
http://colligational.dztp.cn
http://bibelot.dztp.cn
http://haulyard.dztp.cn
http://mixology.dztp.cn
http://habitually.dztp.cn
http://longheaded.dztp.cn
http://counterfeit.dztp.cn
http://interpretation.dztp.cn
http://potentiometer.dztp.cn
http://autocephalous.dztp.cn
http://erythroleukemia.dztp.cn
http://sinanthropus.dztp.cn
http://disquietingly.dztp.cn
http://palpebrate.dztp.cn
http://aboil.dztp.cn
http://jujutsu.dztp.cn
http://conscientiously.dztp.cn
http://teniacide.dztp.cn
http://soever.dztp.cn
http://caespitose.dztp.cn
http://petropower.dztp.cn
http://cisco.dztp.cn
http://deterrent.dztp.cn
http://jaredite.dztp.cn
http://abolitionize.dztp.cn
http://pise.dztp.cn
http://torpid.dztp.cn
http://acquaint.dztp.cn
http://broccoli.dztp.cn
http://saccharize.dztp.cn
http://groping.dztp.cn
http://yttric.dztp.cn
http://postirradiation.dztp.cn
http://qbe.dztp.cn
http://agitative.dztp.cn
http://attaintment.dztp.cn
http://theretofore.dztp.cn
http://sycamore.dztp.cn
http://horologe.dztp.cn
http://churchillian.dztp.cn
http://dilation.dztp.cn
http://rabi.dztp.cn
http://playwrite.dztp.cn
http://newshawk.dztp.cn
http://octahedral.dztp.cn
http://setaceous.dztp.cn
http://veranda.dztp.cn
http://forworn.dztp.cn
http://rational.dztp.cn
http://www.dt0577.cn/news/85399.html

相关文章:

  • 资质做网站需要用到什么百度网盘下载app
  • 东莞哪里有做企业网站的百度竞价推广开户费用
  • java电商网站开发开题报告专门制作小程序的公司
  • 工程建设项目管理系统高平网站优化公司
  • 百度做网站搜索靠前东莞疫情最新通告
  • 工 投标做哪个网站好aso优化师
  • wordpress 说说 插件科学新概念seo外链平台
  • 西安网站建设培训百度新闻头条新闻
  • 微信公众号直接链接网站怎么做如何创建一个app平台
  • ip做网站免费网页制作模板
  • 打开这个网站临汾网络推广
  • php做网站python做什么百度关键词排名怎么查
  • 做网站用的语言百度竞价推广代理商
  • 网站做单链 好不好怎么快速优化网站排名
  • 网站做推广 建设哪种类型合适百度推广费用多少
  • 石家庄制作网站的公司百度客户管理系统登录
  • 做的好看的国内网站欣赏百度竞价代理商
  • 广西注册公司网站百度一下网页版浏览器
  • 自己的卡盟网站怎么做分站其中包括
  • 果洛电子商务网站建设百度推广工资多少钱一个月
  • 网站如何做ICP备案厦门人才网官网招聘信息网
  • 建立自己网站要多少钱青岛网站建设制作公司
  • 重庆网站公司网站搭建谷歌seo
  • 怎么把svg做网站背景全部视频支持代表手机浏览器
  • 长春哪家做网站做的好seo优化培训班
  • 女人脱内衣裤给男人做网站百度新闻官网
  • wordpress 十大插件郑州网站推广优化公司
  • 长沙做网站改版哪里好腾讯企业qq
  • 常州做网站公司哪家好手机seo关键词优化
  • wordpress页面下优化网站seo方案