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

在html中做网站 视频自动收录

在html中做网站 视频,自动收录,制作网页的软件h开头的,无锡网站seo外包White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🙉 内容推荐:Java网络编程(下)🙉 🐹今日诗词: 壮士当唱大风哥, 宵小之徒能几何?🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微…
White graces:个人主页

🙉专栏推荐:Java入门知识🙉

🙉 内容推荐:Java网络编程(下)🙉

🐹今日诗词: 壮士当唱大风哥, 宵小之徒能几何?🐹


⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏

⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏


目录

TCP字节流套接字编程

回显服务器

服务端(有点问题的)

空白符问题

客户端

代码问题

原因

解决办法一

服务器(没问题的代码)

解决方法二

线程池的服务端代码(没问题的代码)

美图分享


TCP字节流套接字编程

TCP也有两个类用于网络编程

SeverSocket: 用于TCP字节数据进行网络通信, 创建了TCP服务端API, 专门用于服务器的

Socket: 客户端和服务器都能够使用, 客户端使用可以建立和服务器的通信

服务器可使用可以监听客户端的连接请求

值得注意的是: TCP是字节流传输, 传输单位是字节(byte), 不需要向UDP那样专门搞出一个类来用于传输数据报

SeverSocket类

构造方法: SeverSocket(int Port)

SeverSocket函数方法

函数方法

Socket类

构造方法: Socket(String host, int port)

Socket函数方法

回显服务器

服务端(有点问题的)

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class TcpSever {private ServerSocket serverSocket = null;public TcpSever(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器!启动");while (true) {Socket clientsocket = serverSocket.accept();//这里和UDP不一样,UDP是直接接收请求, 而TCP需要先和客户端建立连接, 才能进一步处理请求processmethod(clientsocket);//客户端请求结束时应该调用close方法,释放资源, 所以在processmethod方法里调用close方法关闭}}private void processmethod(Socket clientsocket) throws IOException {System.out.printf("[%s:%d]客户端成功连接服务器\n", clientsocket.getInetAddress(), clientsocket.getPort());//打印日志, 接下来就是响应请求了try (OutputStream outputStream = clientsocket.getOutputStream();InputStream inputStream = clientsocket.getInputStream()){//从clientsocket中获取流对象, 对数据进一步处理, 把他们放到try()里,结束会自动调用close方法Scanner scanner = new Scanner(inputStream);while (true) {//客户端建立连接后, 可能会发送很多请求, 需要循环处理//inputStream.read();//读取请求,这样就得到了字符数组,接下来转成字符串, 这样写很麻烦我们可以使用Scanner一步到位if (!scanner.hasNext()) {//读取前判断有没有数据, 没有数据说明连接断开了System.out.printf("[%s:%d]客户端断开连接\n", clientsocket.getInetAddress(), clientsocket.getPort());break;}String request = scanner.next();//读取请求, next()方法读取数据是读到空白符String response = process(request);//根据请求计算响应System.out.printf("[%s:%d] request = %s response = %s",clientsocket.getInetAddress(), clientsocket.getPort(), request, response);//打印日志outputStream.write(response.getBytes());//将响应数据写回客户端}} finally {clientsocket.close();//客户端断开连接调用close方法释放资源}}private String process(String request) {//回显服务器,前面next()方法读取数据读到空白符停止,当我们把数据写回客户端是要把空白符加上return request + "\n";}public static void main(String[] args) throws IOException {TcpSever tcpSever = new TcpSever(9090);tcpSever.start();}
}

空白符问题

空白符是一类分隔符的统称, 不是一个空格, 常见空白符有很多

TCP字节流传输常见的问题就是空白符问题

发送请求和读取请求时都需要考虑分隔符

因为发送的数据带有空白符,当使用next方法读取数据时, 会忽略空白符, 因此当我们向客户端写回请求时需要把空白符加回去, 保持格式的统一性

客户端

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;public class TcpClient {private Socket socket = null;public TcpClient(String SeverIP, int SeverPort) throws IOException {socket = new Socket(SeverIP, SeverPort);}private void start() throws IOException {System.out.println("客户端, 启动!");Scanner scanner = new Scanner(System.in);try (InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()) {//获取流对象, 把数据传入流对象之后, 等待服务器响应即可, 这里和UDP不同, UDP是把数据打包发送到服务器//而TCP客户端已经和服务器建立连接了, 中间通道已经打通, 将数据传入流对象等待响应即可//流对象扮演的角色就像是中间商, 服务器和客户端的操作都要经过流对象Scanner scannerinpuStream = new Scanner(inputStream);while (true) {System.out.print("请输入你要发送的请求: ");String request = scanner.next();request += "\n";//next方法会忽略\n, 为了保持服务端next方法一致, 手动加上\noutputStream.write(request.getBytes());//将请求写到流对象中if(!scannerinpuStream.hasNext()) {//没有数据说明读取完毕了break;}String response = scannerinpuStream.next();//从服务器获取响应System.out.println(response);//将数据打印出来}}}public static void main(String[] args) throws IOException {TcpClient tcpClient = new TcpClient("127.0.0.1", 9090);tcpClient.start();}
}

运行效果

代码问题

这种写法只能对一个客户端提供服务,  当我们启动多个客户端时

原因

解决办法一

把processmethod方法放到多线程的环境下运行


服务器(没问题的代码)

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class TcpSever {private ServerSocket serverSocket = null;public TcpSever(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器!启动");while (true) {Socket clientsocket = serverSocket.accept();//这里和UDP不一样,UDP是直接接收请求, 而TCP需要先和客户端建立连接, 才能进一步处理请求Thread thread = new Thread(() -> {try {processmethod(clientsocket);//客户端请求结束时应该调用close方法,释放资源, 所以在processmethod方法里调用close方法关闭} catch (IOException e) {throw new RuntimeException(e);}});thread.start();}}private void processmethod(Socket clientsocket) throws IOException {System.out.printf("[%s:%d]客户端成功连接服务器\n", clientsocket.getInetAddress(), clientsocket.getPort());//打印日志, 接下来就是响应请求了try (OutputStream outputStream = clientsocket.getOutputStream();InputStream inputStream = clientsocket.getInputStream()){//从clientsocket中获取流对象, 对数据进一步处理, 把他们放到try()里,结束会自动调用close方法Scanner scanner = new Scanner(inputStream);while (true) {//客户端建立连接后, 可能会发送很多请求, 需要循环处理//inputStream.read();//读取请求,这样就得到了字符数组,接下来转成字符串, 这样写很麻烦我们可以使用Scanner一步到位if (!scanner.hasNext()) {//读取前判断有没有数据, 没有数据说明连接断开了System.out.printf("[%s:%d]客户端断开连接\n", clientsocket.getInetAddress(), clientsocket.getPort());break;}String request = scanner.next();//读取请求, next()方法读取数据是读到空白符String response = process(request);//根据请求计算响应System.out.printf("[%s:%d] request = %s response = %s",clientsocket.getInetAddress(), clientsocket.getPort(), request, response);//打印日志outputStream.write(response.getBytes());//将响应数据写回客户端}} finally {clientsocket.close();//客户端断开连接调用close方法释放资源}}private String process(String request) {//回显服务器,前面next()方法读取数据读到空白符停止,当我们把数据写回客户端是要把空白符加上return request + "\n";}public static void main(String[] args) throws IOException {TcpSever tcpSever = new TcpSever(9090);tcpSever.start();}
}

解决方法二

把代码放到线程池中, 这种方法更合适, 不仅解决了只能连接一个客户端, 又能减少线程创建销毁的开销

线程池的服务端代码(没问题的代码)

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;public class TcpSever {private ServerSocket serverSocket = null;public TcpSever(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器!启动");ExecutorService pool = Executors.newCachedThreadPool();//这个线程池可以自动扩容while (true) {Socket clientsocket = serverSocket.accept();//这里和UDP不一样,UDP是直接接收请求, 而TCP需要先和客户端建立连接, 才能进一步处理请求pool.submit(new Runnable() {@Overridepublic void run() {try {processmethod(clientsocket);//客户端请求结束时应该调用close方法,释放资源, 所以在processmethod方法里调用close方法关闭} catch (IOException e) {throw new RuntimeException(e);}}});}}private void processmethod(Socket clientsocket) throws IOException {System.out.printf("[%s:%d]客户端成功连接服务器\n", clientsocket.getInetAddress(), clientsocket.getPort());//打印日志, 接下来就是响应请求了try (OutputStream outputStream = clientsocket.getOutputStream();InputStream inputStream = clientsocket.getInputStream()){//从clientsocket中获取流对象, 对数据进一步处理, 把他们放到try()里,结束会自动调用close方法Scanner scanner = new Scanner(inputStream);while (true) {//客户端建立连接后, 可能会发送很多请求, 需要循环处理//inputStream.read();//读取请求,这样就得到了字符数组,接下来转成字符串, 这样写很麻烦我们可以使用Scanner一步到位if (!scanner.hasNext()) {//读取前判断有没有数据, 没有数据说明连接断开了System.out.printf("[%s:%d]客户端断开连接\n", clientsocket.getInetAddress(), clientsocket.getPort());break;}String request = scanner.next();//读取请求, next()方法读取数据是读到空白符String response = process(request);//根据请求计算响应System.out.printf("[%s:%d] request = %s response = %s",clientsocket.getInetAddress(), clientsocket.getPort(), request, response);//打印日志outputStream.write(response.getBytes());//将响应数据写回客户端}} finally {clientsocket.close();//客户端断开连接调用close方法释放资源}}private String process(String request) {//回显服务器,前面next()方法读取数据读到空白符停止,当我们把数据写回客户端是要把空白符加上return request + "\n";}public static void main(String[] args) throws IOException {TcpSever tcpSever = new TcpSever(9090);tcpSever.start();}
}


美图分享

✨🎆谢谢你的阅读和耐心!祝愿你在编程的道路上取得更多的成功与喜悦!"🎆✨🎄

⭐️点赞收藏加关注,学习知识不迷路⭐️

🎉✔️💪🎉✔️💪🎉✔️💪🎉✔️💪🎉

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

👍😏⛳️点赞☀️收藏⭐️关注😏👍

🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️🙆‍♂️

http://www.hkea.cn/news/89141/

相关文章:

  • 济南网站建设那家好网站制作公司有哪些
  • 域名和网站名不一样营销公司
  • discuz做电影网站免费网站seo
  • 惠民建设局网站明年2024年有疫情吗
  • 卫龙的网站是谁做的今日的新闻
  • 厚街找人做网站动态网站设计
  • 永春县住房和城乡规划建设局网站太原seo排名优化软件
  • 怎么上网站后台爱站小工具计算器
  • 网页编辑岗位职责seo上海优化
  • 网站做二维码吗做网站的外包公司
  • 郑州市中原区疫情最新消息上海网站营销seo方案
  • 狂人站群系统中国最权威的网站排名
  • 简单网站开发实例网站运营工作的基本内容
  • 飞机免费代理ip爱站网seo综合查询工具
  • 河南焦作有做网站开发的公司吗巩义网络推广公司
  • 邓州做网站网络广告有哪些形式
  • 爬闪数媒 网站建设网站建站流程
  • 网站建设广州白云百度统计app下载
  • 惠州短视频seoseowhy论坛
  • 肇庆网站快速排名优化温州seo排名公司
  • 北京疫情死亡人数最新消息王通seo赚钱培训
  • 北京做网站的外包公司营销策划方案案例范文
  • 专业做酒店网站关键词优化排名软件流量词
  • 做网站推广代理上海网络推广服务
  • wordpress可以做大吗搜索引擎优化的英语简称
  • 民治专业做网站公司中国企业500强排行榜
  • 潍坊 公司 网站seo点击排名器
  • 网站可以做赌博广告建站宝盒
  • 运城市做网站英文seo外链
  • 江宁网站建设如何建立网上销售平台