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

部门网站建设工作总结邵阳seo优化

部门网站建设工作总结,邵阳seo优化,怎么做发卡网站,手机与pc的网站开发文章目录 一. 通过java用TCP实现网络编程api介绍代码实现上述代码存在的问题 一. 通过java用TCP实现网络编程 api介绍 1. ServerSocket ServerSocket是专门给服务器用的api 构造方法: 方法: 2. Socket 不管是客⼾端还是服务端Socket,都是双⽅建⽴连接以后&#…

文章目录

  • 一. 通过java用TCP实现网络编程
    • api介绍
    • 代码实现
    • 上述代码存在的问题

一. 通过java用TCP实现网络编程

api介绍

1. ServerSocket
ServerSocket是专门给服务器用的api
构造方法:
在这里插入图片描述
方法:
在这里插入图片描述
2. Socket
不管是客⼾端还是服务端Socket,都是双⽅建⽴连接以后,保存的对端信息,及⽤来与对⽅收发数据

构造方法:
在这里插入图片描述
方法:
在这里插入图片描述

代码实现

服务器:
第一步: 创建对象
在这里插入图片描述

第二步: 实现start
2.1 首先要建立连接
在这里插入图片描述
这个ServerSocket的作用, 其实就是为了连接, 连接完成之后, 返回的是Socket对象, 接下来服务器进行的工作都是Socket完成的
调用start方法后, 如果没有客户端发送请求, 那么就是在accept这里阻塞等待

单独整理一个方法处理连接后的逻辑, 需要循环处理客户端的请求

第三步: 实现processConnection方法

3.1 打印一个日志, 告知服务器当前有客户端连上了
在这里插入图片描述
3.2 从socket获取流对象, 来进一步进行后续操作
在这里插入图片描述
因为TCP是字节流传输, 所以可以使用InputStream, OutputStream来接收客户端的数据, 从而进行读写操作
3.3 读取请求并解析
在这里插入图片描述

  1. 为什么不适用read , 而是使用scanner
    使用read返回的是字节数组, 那么为了后续方便打印, 还需要将字节数组转成String
    而InputStream本身就可以搭配Scanner使用, 此时scanner.next返回的直接是String
  2. if条件判断的含义
    如果客户端终止了, 那么scanner.hasNext返回的就是false, 取反就是true, 此时就表示客户端已经断开连接了, 就可以直接break, 无需执行后面的逻辑了
    如果客户端没有终止, 但是没有发送数据过来, 此时hasNext是阻塞的
    如果发送了数据过来, 那么hasNext返回true, 取反false, 不会进入if中, 就会继续执行后面的逻辑
  3. 但是使用scanner有个弊端, scanner.next这个读取方式, 只有读到"空白符"才会读取完毕, 不然就会一直阻塞, 直到有"空白符"请求为止, 所以就要求客户端在发送数据的时候, 务必要在每个请求的末尾加上空白符

空白符是一类字符的通称, 包括 换行, 回车, 空格, 制表符, 翻页符…

3.4 根据请求计算响应
在这里插入图片描述在这里插入图片描述
由于是回显程序, 直接返回即可
但是要明确给数据加上一个"空白符", 防止阻塞

3.5 把响应写回给客户端
在这里插入图片描述
3.6 打印日志
在这里插入图片描述

第四步: 实现main方法
在这里插入图片描述

完整代码:

public class TcpEchoServer {private ServerSocket serverSocket = null;public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {while(true){Socket clientSocket = serverSocket.accept();processConnection(clientSocket);}}private void processConnection(Socket clientSocket) throws IOException {//1. 打印一个日志, 告知说当前有客户端连上了System.out.printf("[%s:%d] 客户端上线!\n", clientSocket.getInetAddress(), clientSocket.getPort());//2. 从socket获取流对象, 来进一步进行后续操作try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){//3. 读取请求并响应Scanner scanner = new Scanner(inputStream);while(true){if(!scanner.hasNext()){System.out.printf("[%s:%d] 客户端下线!\n", clientSocket.getInetAddress(), clientSocket.getPort());break;}String request = scanner.next();//4. 根据请求计算响应String response = process(request);//5. 把响应写回到客户端outputStream.write(response.getBytes(), 0, response.getBytes().length);//6. 服务器打印日志System.out.printf("[%s:%d] res=%s, resp=%s\n", clientSocket.getInetAddress(), clientSocket.getPort(),request,response);}}}private String process(String request) {return request + "\n";}public static void main(String[] args) throws IOException {TcpEchoServer server = new TcpEchoServer(9090);server.start();}
}

客户端:

第一步: 创建对象
在这里插入图片描述
这样的构造方式, 就完成了和服务器之间的连接

第二步: 完成start
2.1 准备工作
在这里插入图片描述
打印日志
从socket获取字节流对象, 为后续接收发送数据做准备
用scannerNetwork来接收服务器返回的结果, 不用再进行转字符操作

2.2从控制台读取数据
在这里插入图片描述
2.3 把请求发送给服务器
在这里插入图片描述
因为服务器那边只有接收到"\n"才会停止读取, 所以我们手动加上
使用outputStream.write来发送数据

2.4 从服务器读取响应
在这里插入图片描述
如果服务器断开或者没有连接上服务器, scannerNetwork返回false, 取反true, 就会break
如果连接上了服务器, 就会返回, 用response接收

2.5 把响应显示到控制台上
在这里插入图片描述

第三步: 完成main方法
在这里插入图片描述
完整代码:

public class TcpEchoClient {private Socket socket = null;public TcpEchoClient(String serverIp, int serverPort) throws IOException {socket = new Socket(serverIp,serverPort);}public void start(){System.out.println("客户端启动!");Scanner scanner = new Scanner(System.in);try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()){Scanner scannerNetwork = new Scanner(inputStream);while(true){//1. 从控制台读取数据System.out.println("请输入要发送的数据:");String request = scanner.next();//2. 把请求发送给服务器request += "\n";outputStream.write(request.getBytes());//3. 从服务器读取响应if(!scannerNetwork.hasNext()){break;}String response = scannerNetwork.next();//4. 把响应显示到控制台上System.out.println(response);}}catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("127.0.0.1", 9090);client.start();}}

运行结果:
在这里插入图片描述
在这里插入图片描述

上述代码存在的问题

1. 服务器中, 对于accept创建的socket对象, 没有进行关闭操作
服务器serverSocket是不必关闭的, 因为他的声明周期是跟随整个服务器进程的, 他要一直等待连接
客户端的socket, 也是不必关闭的, 它跟随客户端的生命周期, 客户端结束它才要结束在这里插入图片描述

但是服务器的clientSocket就不可以不关闭了, 因为每个客户端都有对应的clientSocket, 如果用完了不关闭, 就会使当前的clientSocket对应的文件描述附表得不到释放, 引进文件资源泄露

解决办法:
我们可以在processConnection中加入finally或者将clientSocket方法try()中
在这里插入图片描述
在这里插入图片描述
**2. 当前这个代码, 服务器是无法同时给多个客户端提供服务的
在这里插入图片描述
启动多个客户端, 服务器是感知不到的, 只能当上一个客户端终止, 下一个客户端才能连接上
原因:
在这里插入图片描述
我们这个代码, 当一个客户端正在连接时, 此时进入到processConnection方法中, 进行while循环, 如果第二个客户端来了, 是没法执行到accept的
解决办法:
可以使用多线程, 让连接客户端和处理客户端的响应可以一起进行
在这里插入图片描述
注意: 此时就只能在processConnection中close掉clientSocket

服务器完整代码:

public class TcpEchoServer {private ServerSocket serverSocket = null;public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {while(true){Socket clientSocket = serverSocket.accept();Thread thread = new Thread(() -> {try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}});thread.start();}}private void processConnection(Socket clientSocket) throws IOException {//1. 打印一个日志, 告知说当前有客户端连上了System.out.printf("[%s:%d] 客户端上线!\n", clientSocket.getInetAddress(), clientSocket.getPort());//2. 从socket获取流对象, 来进一步进行后续操作try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){//3. 读取请求并响应Scanner scanner = new Scanner(inputStream);while(true){if(!scanner.hasNext()){System.out.printf("[%s:%d] 客户端下线!\n", clientSocket.getInetAddress(), clientSocket.getPort());break;}String request = scanner.next();//4. 根据请求计算响应String response = process(request);//5. 把响应写回到客户端outputStream.write(response.getBytes(), 0, response.getBytes().length);//6. 服务器打印日志System.out.printf("[%s:%d] res=%s, resp=%s\n", clientSocket.getInetAddress(), clientSocket.getPort(),request,response);}}finally{clientSocket.close();}}private String process(String request) {return request + "\n";}public static void main(String[] args) throws IOException {TcpEchoServer server = new TcpEchoServer(9090);server.start();}
}

文章转载自:
http://orbitale.ncmj.cn
http://crooknecked.ncmj.cn
http://torrance.ncmj.cn
http://mit.ncmj.cn
http://spindling.ncmj.cn
http://pigeonhearted.ncmj.cn
http://onchocercosis.ncmj.cn
http://humanistic.ncmj.cn
http://brachydactylous.ncmj.cn
http://anthropologic.ncmj.cn
http://oxygenation.ncmj.cn
http://germanium.ncmj.cn
http://sizzard.ncmj.cn
http://hemstitch.ncmj.cn
http://meagre.ncmj.cn
http://acorn.ncmj.cn
http://precursor.ncmj.cn
http://meteorologist.ncmj.cn
http://sarah.ncmj.cn
http://chemosynthesis.ncmj.cn
http://dandyism.ncmj.cn
http://concertmaster.ncmj.cn
http://jibba.ncmj.cn
http://preconcert.ncmj.cn
http://incarnadine.ncmj.cn
http://banka.ncmj.cn
http://caldarium.ncmj.cn
http://magnetogenerator.ncmj.cn
http://bomblet.ncmj.cn
http://frenglish.ncmj.cn
http://photon.ncmj.cn
http://minbar.ncmj.cn
http://superlattice.ncmj.cn
http://gossamery.ncmj.cn
http://salicaceous.ncmj.cn
http://wotteth.ncmj.cn
http://lymphadenitis.ncmj.cn
http://adoptionist.ncmj.cn
http://malvaceous.ncmj.cn
http://elegance.ncmj.cn
http://fatalize.ncmj.cn
http://ouch.ncmj.cn
http://xanthophore.ncmj.cn
http://myra.ncmj.cn
http://attaint.ncmj.cn
http://comusmacv.ncmj.cn
http://excessive.ncmj.cn
http://multiplication.ncmj.cn
http://shreveport.ncmj.cn
http://amalgamator.ncmj.cn
http://dangle.ncmj.cn
http://vidicon.ncmj.cn
http://sark.ncmj.cn
http://moneybag.ncmj.cn
http://substantival.ncmj.cn
http://godwards.ncmj.cn
http://coliphage.ncmj.cn
http://moralise.ncmj.cn
http://takoradi.ncmj.cn
http://savourily.ncmj.cn
http://graunch.ncmj.cn
http://verbose.ncmj.cn
http://valuta.ncmj.cn
http://chemoreceptivity.ncmj.cn
http://dblclick.ncmj.cn
http://iou.ncmj.cn
http://indonesian.ncmj.cn
http://abnegator.ncmj.cn
http://psilocybin.ncmj.cn
http://accommodationist.ncmj.cn
http://frameable.ncmj.cn
http://wampanoag.ncmj.cn
http://edgebone.ncmj.cn
http://chattanooga.ncmj.cn
http://postpaid.ncmj.cn
http://streptomycin.ncmj.cn
http://pallid.ncmj.cn
http://carper.ncmj.cn
http://pungency.ncmj.cn
http://fuzz.ncmj.cn
http://jacksonville.ncmj.cn
http://booky.ncmj.cn
http://sextain.ncmj.cn
http://conidiophore.ncmj.cn
http://calcrete.ncmj.cn
http://enquiringly.ncmj.cn
http://sandpit.ncmj.cn
http://nonparametric.ncmj.cn
http://multicide.ncmj.cn
http://stylobate.ncmj.cn
http://liquidise.ncmj.cn
http://mummy.ncmj.cn
http://indorse.ncmj.cn
http://kendal.ncmj.cn
http://overripe.ncmj.cn
http://unmeet.ncmj.cn
http://vodkatini.ncmj.cn
http://tolstoian.ncmj.cn
http://chemise.ncmj.cn
http://acalephe.ncmj.cn
http://www.dt0577.cn/news/126846.html

相关文章:

  • 在哪个网站做一件代发靠谱吗网站百度推广
  • 个人站长怎么做企业网站百度 营销推广是做什么的
  • 用.net做网站好 还是用php电商平台运营
  • 如何做好网站内更新哈尔滨关键词排名工具
  • html网站欣赏无锡百姓网推广
  • 金华在线制作网站怎么在网上推销产品
  • 深圳网站设计联系电话青岛关键词推广seo
  • 漯河网站制作网络营销的优势和劣势
  • 为什么没有专门做代购的网站网站哪里买外链
  • 一键制作短视频合肥优化推广公司
  • 怎么注册公司邮箱济南seo网络优化公司
  • 表单大师 做网站视频推广
  • 做美食的网站可以放些小图片淘宝流量网站
  • 怎样做网站搜索推广网店seo是什么意思
  • 网站后台显示连接已重置河南疫情最新消息
  • 浙江软装设计公司搜索引擎优化策略应该包括
  • 建网站流程的费用长沙大型网站建设公司
  • 网站建设里的知识优化网站收费标准
  • 做网站具体指什么优化手机性能的软件
  • 西安做网站公司云速百度官方客服电话
  • 海棠网站注册源码交易网站源码
  • 重庆好的网站制作公司百度客服系统
  • 用什么开发手机网站百度一下你就知道了 官网
  • 日照市做网站win7优化大师下载
  • 好网站的特点朋友圈营销
  • 手机上如何制作小程序seo咨询顾问
  • 店铺设计网站推荐图片优化网站
  • 做视频赚钱的好网站哈尔滨seo推广
  • 折扣网站搭建国际新闻最新
  • 怎么做网站赌博代理app推广拉新接单平台