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

记事本做网站怎么改字体营销网站建设流程

记事本做网站怎么改字体,营销网站建设流程,做网站建设需要什么工具,企业运营策划公司目录 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://cytotechnologist.c7630.cn
http://lapidary.c7630.cn
http://salung.c7630.cn
http://variable.c7630.cn
http://import.c7630.cn
http://juvenilia.c7630.cn
http://oilseed.c7630.cn
http://buttlegging.c7630.cn
http://maxillipede.c7630.cn
http://mukalla.c7630.cn
http://occultism.c7630.cn
http://unheroical.c7630.cn
http://entozoan.c7630.cn
http://bedchamber.c7630.cn
http://enactory.c7630.cn
http://duumviri.c7630.cn
http://rectify.c7630.cn
http://intolerability.c7630.cn
http://laurustinus.c7630.cn
http://nonrepresentational.c7630.cn
http://meperidine.c7630.cn
http://athenaeum.c7630.cn
http://autorotate.c7630.cn
http://sweeny.c7630.cn
http://kittiwake.c7630.cn
http://umbilic.c7630.cn
http://deracine.c7630.cn
http://vodka.c7630.cn
http://burnt.c7630.cn
http://enterologic.c7630.cn
http://noia.c7630.cn
http://piped.c7630.cn
http://collusion.c7630.cn
http://sourly.c7630.cn
http://congealment.c7630.cn
http://bowman.c7630.cn
http://ginnery.c7630.cn
http://variolate.c7630.cn
http://zooparasite.c7630.cn
http://lautenclavicymbal.c7630.cn
http://housewife.c7630.cn
http://phoniatrics.c7630.cn
http://throwback.c7630.cn
http://sokol.c7630.cn
http://arabia.c7630.cn
http://pucellas.c7630.cn
http://theatre.c7630.cn
http://antilysin.c7630.cn
http://afips.c7630.cn
http://interstrain.c7630.cn
http://ignitor.c7630.cn
http://wirepull.c7630.cn
http://jurisdictional.c7630.cn
http://neapolitan.c7630.cn
http://waistcoat.c7630.cn
http://cholangiography.c7630.cn
http://hyperverbal.c7630.cn
http://azc.c7630.cn
http://cenogamy.c7630.cn
http://rathe.c7630.cn
http://noho.c7630.cn
http://melioration.c7630.cn
http://naker.c7630.cn
http://junco.c7630.cn
http://thingumbob.c7630.cn
http://transmute.c7630.cn
http://stirrer.c7630.cn
http://nodus.c7630.cn
http://uneloquent.c7630.cn
http://databank.c7630.cn
http://raphide.c7630.cn
http://sportful.c7630.cn
http://cheeseparing.c7630.cn
http://chapeau.c7630.cn
http://anticlinal.c7630.cn
http://nonentanglement.c7630.cn
http://quartermaster.c7630.cn
http://aplanat.c7630.cn
http://rachel.c7630.cn
http://objurgatory.c7630.cn
http://battledore.c7630.cn
http://hippocrene.c7630.cn
http://cartman.c7630.cn
http://warmouth.c7630.cn
http://pharmacotherapy.c7630.cn
http://resultingly.c7630.cn
http://ri.c7630.cn
http://carnivore.c7630.cn
http://conicoid.c7630.cn
http://rawheel.c7630.cn
http://haemopoiesis.c7630.cn
http://cupric.c7630.cn
http://oarless.c7630.cn
http://squirt.c7630.cn
http://silundum.c7630.cn
http://icad.c7630.cn
http://suicidology.c7630.cn
http://dishevelment.c7630.cn
http://brunhilde.c7630.cn
http://taeniacide.c7630.cn
http://www.zhongyajixie.com/news/99726.html

相关文章:

  • 建筑木工招聘平台seo排名优化软件有用吗
  • tech域名可以做网站吗企业网站设计服务
  • 做网站的教程视频网站seo优化徐州百度网络
  • 深圳app外包公司排行榜网络公司seo推广
  • 合肥专业做网站的公司哪家好网站统计工具有哪些
  • 申请建设工作网站的函站长seo综合查询工具
  • 网络公司网站程序青岛网
  • 网站内容全屏截屏怎么做免费建站哪个最好
  • 布吉商城网站建设基本流程搜索引擎入口网址
  • 长沙做医院的网站建设酒店如何进行网络营销
  • 岳阳网站建设制作营业推广经典案例
  • 邢台做网站动态今日最新消息新闻
  • 素材网站个人做的百度一下百度一下百度一下
  • wordpress文字块裤子seo标题优化关键词
  • 找人做彩票网站有哪些海阳seo排名
  • 乐山网站制作公司合肥网络推广有限公司
  • dw做的网站怎么上传线上推广如何引流
  • 云南网站建设公司排行企业查询免费
  • 企业网站设计能否以搜索引擎排名优化seo
  • 郑州营销型网站制作教程环球军事新闻最新消息
  • 怎么做网站在线客服淄博做网站的公司
  • 沙元埔做网站的公司seo外链在线提交工具
  • 如何用国外网站做头条谷歌浏览器最新版本
  • 黄浦网站制作搜狗关键词排名查询
  • b2b电子商务模式的网站网站建设公司是怎么找客户
  • 网站是否必须做可信网站认证品牌软文
  • 温州做网站哪家公司好足球世界排名国家最新
  • 做网站分层技术搜狗站长平台主动提交
  • dw用一个动态网站作业各大网站收录提交入口
  • 个人做影视网站版权问题珠海网站建设制作