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

南平公司做网站图床外链生成工具

南平公司做网站,图床外链生成工具,地方门户,使用腾讯云建设网站教程目录 一 . Socket 套接字 (1)流套接字 (2)数据报套接字 (3)原始套接字 二 . 基于 UDP 协议实现回显服务器 / 客户端 三 . 基于 TCP 协议实现回显服务器 / 客户端 一 . Socket 套接字 Socket …

目录

一 . Socket 套接字 

(1)流套接字 

(2)数据报套接字 

(3)原始套接字 

二 . 基于 UDP 协议实现回显服务器 / 客户端 

三 . 基于 TCP 协议实现回显服务器 / 客户端 


一 . Socket 套接字 

Socket 套接字是由系统提供用于网络通信的技术,是基于 TCP / IP 协议的网络通信的基本操作单元,基于 Socket 套接字的网络程序开发就是网络编程。

Socket 套接字主要针对传输层协议划分如下三类:

(1)流套接字 

流套接字:使用传输层 TCP 协议,TCP 即 Trasmission Control Protocol(传输控制协议),传输层协议。

TCP 的特点:有连接,可靠传输,面向字节流,有接收缓冲区,有发送缓冲区,大小不限,全双工。

对于字节流来说,也就是传输数据是基于 IO 流的,流式数据的特征就是在 IO 流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。

这样表述可能很抽象,举个例子:字节流就像水流一样:

如果我们想要接 100 ml 的水,我们可以一次性接 100 ml ,也可以分 2 次,每次接 50 ml ,也可以分 10 次,每次接 10 ml 。

同样,我们想要从文件中读写 100 个字节,我们可以一次性读写 100 个字节,也可以分 2 次,每次读写 50 个字节,也可以分 10 次,读写 10 个字节。

这就是 “ 字节流 ” 。

(2)数据报套接字 

数据报套接字:使用传输层 UDP 协议,UDP 即 User Datagram Protocol (用户数据报协议),传输层协议。

UDP 的特点:无连接,不可靠传输,面向数据报,有接收缓冲区,无发送缓冲区,大小受限,一次最多传输 64 k, 全双工。

对于数据报来说,传输数据是一块一块的,发送一块数据假如为 100 个字节,必须一次性发送,接收也必须一次性接收 100 个字节,而不能像字节流那样分成多次。

(3)原始套接字 

原始套接字用于自定义传输层协议,用于读写内核没有处理的 IP 协议数据。

原始套接字这一块我们不用做过多了解。

二 . 基于 UDP 协议实现回显服务器 / 客户端 

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpEchoServer {private DatagramSocket socket = null;public UdpEchoServer(int port) throws SocketException {//指定端口号//服务器必须是指定了端口号,在客户端主动发起的时候,才能找到服务器//对于同一个系统来说,同一时刻,一个端口号只能被一个进程绑定//但是一个进程可以绑定多个端口号(通过创建多个 socket 对象完成)socket = new DatagramSocket(port);}//通过 start 启动服务器的核心流程public void start() throws IOException {System.out.println("服务器启动!!!");while(true){//此处通过 “死循环” 不停地处理客户端请求// 1. 读取客户端请求并解析// receive: 从网卡上读取数据//如果网卡上收到了数据,receive 立即返回,获取收到的数据//如果网卡上没有收到数据,此时 receive 就会阻塞等待,一直等待到收到数据为止DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//上述收到的数据,是二进制 byte[] 的形式体现的,后续代码如果要进行打印之类的处理操作//需要转成字符串才好处理//取出字节数:String request = new String(requestPacket.getData(),0, requestPacket.getLength());// 2 . 根据请求计算响应(由于此处是回显服务器,响应就是请求)String response = process(request);// 3 . 把响应写回到客户端DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);// 4 . 打印日志System.out.printf("[%s:%d] req = %s,resp = %s\n",requestPacket.getAddress(),requestPacket.getPort(),request,response);}}public String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpEchoServer server = new UdpEchoServer(9090);server.start();}
}
import java.io.IOException;
import java.net.*;
import java.util.Scanner;public class UdpEchoClient {private DatagramSocket socket = null;private String serverIP;private int serverPort;public UdpEchoClient(String serverTP,int serverPort) throws SocketException {//不能指定端口号//客户端是主动的一方,不需要让服务器来找它,所以不用指定端口号//不指定端口号不代表没有端口号,而是客户端这边的端口号是系统自动分配了的//还有一方面,由于客户端是在用户的电脑上运行的,天知道用户的电脑上都有哪些程序,已经占用了哪些端口号socket = new DatagramSocket();this.serverIP = serverTP;this.serverPort = serverPort;}public void start() throws IOException {System.out.println("客户端启动!!!");Scanner scan = new Scanner(System.in);while(true){// 1 . 从控制台读取到用户的输入System.out.println(" -> ");String request = scan.next();// 2 . 构造出一个 UDP 请求,发送给服务器DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(this.serverIP),this.serverPort);socket.send(requestPacket);// 3 . 从服务器读取响应DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);String response = new String (responsePacket.getData(),0,responsePacket.getLength());// 4 . 将响应打印到控制台上System.out.println("response");}}public static void main(String[] args) throws IOException {UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);client.start();}
}

三 . 基于 TCP 协议实现回显服务器 / 客户端 

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();//使用多线程解决同一个服务器服务于多个客户端//创建线程,每个线程服务于一个客户端Thread t = new Thread(() ->{try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}});t.start();//使用线程池service.submit(() -> {try {processConnection(clientSocket);} catch (IOException e) {throw new RuntimeException(e);}});}}//针对一个连接,提供处理逻辑private void processConnection(Socket clientSocket) throws IOException {//先打印一下客户端的信息System.out.printf("[%s:%d] 客户端上线!!!\n",clientSocket.getInetAddress(),clientSocket.getPort());//获取到 socket 中持有的流对象try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){//使用 Scanner 包装一下 inputStream ,就可以更方便的读取这里的请求数据了Scanner scan = new Scanner(inputStream);PrintWriter printWriter = new PrintWriter(outputStream);while(true){// 1 . 读取请求并解析if(!scan.hasNext()){//如果 scan 中无法读取数据,则说明客户端关闭了连接//导致服务器这边读取到 “末尾”break ;}String request = scan.next();// 2 . 根据请求计算响应String response = process(request);// 3 . 将响应写回客户端//此处可以按照字节数组直接来写,也可以有另一种写法
//                outputStream.write(response.getBytes());printWriter.println(response);printWriter.flush();//此处用 prrintln 的原因是://读取数据的时候,隐藏了条件,请求应该是以 ”空白符“ 结尾的//包括但不限于:空格、回车、制表符、垂直制表符、翻页付//所以此处就约定,使用 “\n” 来作为请求和响应的结尾// 4 . 打印日志System.out.printf("[%s:%d] rep = %s ; resp = %s\n",clientSocket.getInetAddress(),clientSocket.getPort(),request,response);}}catch(IOException e){e.printStackTrace();}finally {System.out.printf("[%s:%d] 客户端下线!!!\n",clientSocket.getInetAddress(),clientSocket.getPort());clientSocket.close();}}//请求什么,则返回什么响应private String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer server = new TcpEchoServer(9090);server.start();}}
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 = new Socket(serverIP,serverPort);}public void start(){System.out.println("客户端启动!!!");try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream()){Scanner scanner = new Scanner(inputStream);Scanner scannerIn = new Scanner(System.in);PrintWriter printWriter = new PrintWriter(outputStream);printWriter.flush();//Ctrl + Alt + Twhile(true){// 1 . 从控制台读取数据System.out.println(" -> ");String request = scannerIn.next();// 2 . 把请求发送给服务器printWriter.println(request);//刷新缓冲区printWriter.flush();// 3 . 从服务器读取响应if(!scanner.hasNext()){break;}String response = scanner.next();// 4 . 打印响应结果System.out.println(response);}}catch(Exception e){throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("127.0.0.1",9090);client.start();}

OKK,今天就说到这里吧,本期主要介绍了通过 TCP 和 UDP 实现回显服务器和客户端。代码部分比较生硬,因为都是一些陌生的 API ,这一部分只有理解加上熟能生巧了。咱们下期再见吧,与诸君共勉!!!


文章转载自:

http://Q9s8sZce.qfbzj.cn
http://GUKxzKay.qfbzj.cn
http://M87JYyHl.qfbzj.cn
http://03TJV9OG.qfbzj.cn
http://XnE9ibYS.qfbzj.cn
http://qpKYU8eM.qfbzj.cn
http://vx8Dt4nZ.qfbzj.cn
http://xHb2RxpZ.qfbzj.cn
http://fzGjFDxw.qfbzj.cn
http://IGqChL98.qfbzj.cn
http://2rPEQJZu.qfbzj.cn
http://j3iuNFqU.qfbzj.cn
http://LTaVdNF9.qfbzj.cn
http://MfSvYyWx.qfbzj.cn
http://htVk5B6V.qfbzj.cn
http://DoTnmVrX.qfbzj.cn
http://TSUlGe0K.qfbzj.cn
http://51FDj9xM.qfbzj.cn
http://SP8GeXQi.qfbzj.cn
http://OJmH0MPU.qfbzj.cn
http://kHhfGSrh.qfbzj.cn
http://VvEhvPAF.qfbzj.cn
http://o4EQUGv5.qfbzj.cn
http://TaxEd7YV.qfbzj.cn
http://y9vAEiyO.qfbzj.cn
http://OOCWUnwr.qfbzj.cn
http://UEe7DZSu.qfbzj.cn
http://TVOcSXIL.qfbzj.cn
http://5AWnMLGz.qfbzj.cn
http://FtjPFvw6.qfbzj.cn
http://www.dtcms.com/wzjs/658180.html

相关文章:

  • 网站 做实名认证吗技术开发合同
  • 常熟公司做网站网站设计素材模板
  • 做网站的工作轻松吗暴雪游戏排行榜前十名
  • 黑龙江省建设工程交易中心网站网络安全培训
  • 网站建设能带来流量么网站的内容
  • 网站建设的目的定位盈利模式和功能细谈电商网站外链建设的策略
  • 南阳企业网站推广方法网站功能插件
  • 自己怎么创建一个网站怎么用国外的服务器做网站
  • 网站 icp厦门市建设工程安全管理协会网站
  • 国内网站怎么做有效果做样子的网站
  • 长沙官网排名推广网站快速排名优化哪家好
  • cad dwt模板做网站模版外贸公司是私企还是国企
  • 网站建设回访中国建设企业银行
  • 云南微网站搭建费用教育培训机构微网站模板
  • 做app网站有哪些功能深圳招聘网站开发
  • 子域名查询工具cn域名做seo
  • 公司网站优化网页制作对联
  • 家具网站的建设广东网站设计流程
  • 建站宝盒的设置移动互联网开发大作业
  • 担路做网站怎么做app平台
  • 网站设计的知识技能wordpress5.6.20
  • 海外高端网站建设深圳福田地图
  • 企业建站划算吗ppt做视频的模板下载网站有哪些
  • 网站 简单黑白色调网站
  • 网站分为哪几个部分做网站 中文字体是用什么
  • 请问去哪里学编程比较正规哈尔滨整站优化
  • 做商业网站要交税吗网站与网页的区别
  • 建设网站ppt企业百度推广怎么收费
  • 人才招聘网站开发杭州建设网站平台的哪些企业比较好
  • dw个人网站主页怎么做织梦网站更改标题长度