网络编程

网络通信的介绍

  • 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据
  • 两台电脑连在一起就组成了一个计算机网络。我们通过光纤连接到电信的网关,中国电信通过海底光缆和美国电信网关连接,你就是和全世界的在线用户连着

如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数?

TCP/IP 协议

1.三次握手
#mermaid-svg-GTgOB7lLTe5aALD4 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 .error-icon{fill:#552222;}#mermaid-svg-GTgOB7lLTe5aALD4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GTgOB7lLTe5aALD4 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-GTgOB7lLTe5aALD4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GTgOB7lLTe5aALD4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GTgOB7lLTe5aALD4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GTgOB7lLTe5aALD4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GTgOB7lLTe5aALD4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GTgOB7lLTe5aALD4 .marker.cross{stroke:#333333;}#mermaid-svg-GTgOB7lLTe5aALD4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GTgOB7lLTe5aALD4 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GTgOB7lLTe5aALD4 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-GTgOB7lLTe5aALD4 .actor-line{stroke:grey;}#mermaid-svg-GTgOB7lLTe5aALD4 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 .sequenceNumber{fill:white;}#mermaid-svg-GTgOB7lLTe5aALD4 #sequencenumber{fill:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 .messageText{fill:#333;stroke:#333;}#mermaid-svg-GTgOB7lLTe5aALD4 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GTgOB7lLTe5aALD4 .labelText,#mermaid-svg-GTgOB7lLTe5aALD4 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-GTgOB7lLTe5aALD4 .loopText,#mermaid-svg-GTgOB7lLTe5aALD4 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-GTgOB7lLTe5aALD4 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-GTgOB7lLTe5aALD4 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-GTgOB7lLTe5aALD4 .noteText,#mermaid-svg-GTgOB7lLTe5aALD4 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-GTgOB7lLTe5aALD4 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GTgOB7lLTe5aALD4 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GTgOB7lLTe5aALD4 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-GTgOB7lLTe5aALD4 .actorPopupMenu{position:absolute;}#mermaid-svg-GTgOB7lLTe5aALD4 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-GTgOB7lLTe5aALD4 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-GTgOB7lLTe5aALD4 .actor-man circle,#mermaid-svg-GTgOB7lLTe5aALD4 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-GTgOB7lLTe5aALD4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}客户端服务器发送SYN请求报文序列号:X收到SYN请求报文发送SYN/ACK报文,序列号:Y ;确认号:X+1收到SYN/ACK请求报文发送ACK报文,确认号:Y + 1收到ACK请求报文客户端服务器
2.TCP/IP协议
  • TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送。
  • TCP可以保证从一端数据传至连接的另一端时,数据能够确实送达。
  • TCP协议适合可靠性比较高的场合,就像拨打电话。

接下来我们用简单的例子来介绍从服务器段下载文件;通信流程如下:

  1. 客户端创建Socket
  2. 服务端创建ServerSocket
  3. 客户端绑定服务器ip地址和Socket端口
  4. 服务端绑定服务器端口
  5. 客户端请求服务器链接
  6. 服务端阻塞监听客户端请求
  7. 客户端连接
  8. 服务端连接成功返回Socket
  9. 客户端输入输出流通信
  10. 服务端通过输入输出流通信
  11. 客户端关闭流
  12. 服务端关闭流
  13. 客户端关闭Socket
  14. 服务端关闭Socket和ServerSocket

首先我们建立服务端

package server;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Smain {public static void main(String[] args) {try {//1.服务端创建ServerSocketServerSocket ssk = new ServerSocket(9090);while (true) {//2.服务端阻塞监听客户端请求Socket ck = ssk.accept();//3.创建输入输出流DataInputStream din = new DataInputStream(ck.getInputStream());DataOutputStream dout = new DataOutputStream(ck.getOutputStream());//读取客户端发送的信息int key = din.readInt();String fname = "03.mp4";switch (key) {case 1:fname = "01.mp4";break;case 2:fname = "02.mp4";break;}//读取服务器上对应的mp4文件并用输出流发送给客户端FileInputStream fin = new FileInputStream(fname);byte[] data = new byte[1024*5];while (true) {int len = fin.read(data);if(len == -1) {break;}dout.write(data, 0, len);}dout.close();fin.close();din.close();ck.close();}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

建立客户端

package client;import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import java.util.Scanner;public class Cmain {public static void main(String[] args) {try {Scanner input = new Scanner(System.in);//1.建立客户端SocketSocket ck = new Socket("192.168.31.13", 9090);//让客户端选择服务器对应的MP4文件编号System.out.println("请输入对应的MP4文件编号:1) 01.mp4;2) 02.mp4; 3)03.mp4;");int key = input.nextInt();//让客户输入下载地址和保存的文件名System.out.println("请输入保存地址以及文件名:");String path = input.next();String name = input.next();DataOutputStream dout = new DataOutputStream(ck.getOutputStream());DataInputStream din = new DataInputStream(ck.getInputStream());//选择的MP4文件编号发送给服务端dout.writeInt(key);//建立文件输入流保存在本地FileOutputStream fout = new FileOutputStream(path+"/"+name);byte[] data = new byte[1024*5];while(true) {int len = din.read(data);if(len == -1) {break;}System.out.println("len:"+len);fout.write(data, 0, len);}fout.close();din.close();dout.close();ck.close();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

这样我们可以实现简单的从服务器上下载文件的操作

Java实现服务端和客户端的通信(文件下载)相关推荐

  1. Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信

    本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...

  2. Java中利用socket实现简单的服务端与客户端的通信(基础级)

    在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...

  3. java sslsocket程序_JAVA与C++进行sslsocket通信,JAVA做服务端或客户端

    前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软 ...

  4. Java中利用socket实现简单的服务端与客户端的通信(入门级)

    Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍.首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特 ...

  5. socket.io服务端是java_SpringBoot(23) 集成socket.io服务端和客户端实现通信

    @Slf4j @Service(value = "socketIOService") public class SocketIOServiceImpl implements ISo ...

  6. SpringBoot(23) 集成socket.io服务端和客户端实现通信

    一.前言 websocket和socket.io区别? websocket 一种让客户端和服务器之间能进行双向实时通信的技术 使用时,虽然主流浏览器都已经支持,但仍然可能有不兼容的情况 适合用于cli ...

  7. java mina 服务端_Mina客户端和服务端代码编写

    1.客户端 package com.boonya.protocol; import java.net.InetSocketAddress; import java.nio.charset.Charse ...

  8. 使用WebSocket实现服务端和客户端的通信

    开发中经常会有这样的使用场景.如某个用户在一个数据上做了xx操作, 与该数据相关的用户在线上的话,需要实时接收到一条信息. 这种可以使用WebSocket来实现. 另外,对于消息,可以定义一个类进行固 ...

  9. 简单的c++服务端与客户端的通信

    本篇博客是本人没有深入学习网络通信,对其浅浅的了解了一下,只知道怎么连接以及发送内容,若内容有什么错误的地方还麻烦各位大佬可以指出来大家一起讨论一下.   服务端代码如下: #include < ...

最新文章

  1. 数据结构,堆和栈和队列的概念
  2. 下一跳网关和转发接口的使用情况
  3. linux文件明明存在却无法vim打开_教你几招,让你vim编辑器变得友善起来(特别水,不要点进来)...
  4. Pool多进程的加速
  5. 在cds学到的(非技术)
  6. php python插件,Python:开发Sublime插件,方便PHP开发
  7. linux之ls只显示文件或者文件夹
  8. 【LeetCode-SQL每日一练】—— 620. 有趣的电影
  9. springboot日志写入mysql_springboot运用logback将日志写入数据库
  10. Java实现简单的文本编辑器
  11. 手机充当电脑摄像头:无他相机和DroidCam
  12. [杂记]注册电气工程师考试复习及考试杂谈
  13. Clouda 之我见
  14. 串口公头母头: RS232 DB9 公头 母头 串口引脚定义
  15. c语言流水灯程序 16,16个发光二极管流水灯程序
  16. 窄带高清赋能体育赛事,世界杯高清直播背后的技术变革
  17. 基本DOS命令---6.关机重启操作命令
  18. mysql 中添加和删除字段
  19. 《人人都是首席质量官》vs “人人都是产品经理” 及心得
  20. 用echart玩点好玩的--酷炫热力图

热门文章

  1. 微信小程序入门-阿里云学生版简单搭建java后台
  2. 通过rpm安装方式安装mysql
  3. visual studio基本过滤器和内容过滤器
  4. 如何显示计算机语言栏,win7电脑显示语言栏的具体操作方法
  5. 前端最全面试指南,从简历到谈薪
  6. 全球手机一哥再度回归国内市场,国产手机品牌怕了么?
  7. android 代码控件框高,Android控件_TextView(显示文本框控件)
  8. DeepDive 简介
  9. windows cmd 命令行下打开文件夹图形界面
  10. high-level vision和low-lever vision的解释