当前位置: 首页 > 编程日记 > 正文

Java Socket编程 - 基于TCP方式的二进制文件传输【转】http://blog.csdn.net/jia20003/article/details/8248221...

此人博客挺好的,推荐一个!

一个基于Java Socket协议之上文件传输的完整示例,基于TCP通信完成。

除了基于TCP的二进制文件传输,还演示了JAVA Swing的一些编程技巧,Demo程序

实现主要功能有以下几点:

1.      基于Java Socket的二进制文件传输(包括图片,二进制文件,各种文档work,

PDF)

2.      SwingWorker集合JProgressBar显示实时传输/接受完成的百分比

3.      其它一些Swing多线程编程技巧

首先来看一下整个Dome的Class之间的关系图:


下面按照上图来详细解释各个类的功能与代码实现:

服务器端:

FileTransferServer类的功能首先是在端口9999创建一个服务器套接字并

开始监听连接。相关代码如下:

[java] view plaincopy
  1. private void startServer(int port) {
  2. try {
  3. serverSocket = new ServerSocket(port);
  4. System.out.println("Server started at port :" + port);
  5. while(true) {
  6. Socket client = serverSocket.accept(); // blocked & waiting for income socket
  7. System.out.println("Just connected to " + client.getRemoteSocketAddress());
  8. FileReceiveTask task = new FileReceiveTask(client);
  9. bar.setValue(0); // reset it now
  10. task.addPropertyChangeListener(new PropertyChangeListener() {
  11. public void propertyChange(PropertyChangeEvent evt) {
  12. if ("progress".equals(evt.getPropertyName())) {
  13. bar.setValue((Integer) evt.getNewValue());
  14. }
  15. }
  16. });
  17. task.execute();
  18. }
  19. catch (IOException e) {
  20. e.printStackTrace();
  21. }
  22. }

关于PropertyChangeListener, Java提供了一个非常有力的工具类来

监控任意Bean Model的数据改变,程序通过添加该监听器实现对

SwingWorker的progress属性值改变的事件捕获,然后更新JProgressBar

实例对象,实现了UI的刷新。FileTransferServer类的完整源代码如下:

[java] view plaincopy
  1. package com.gloomyfish.socket.tutorial.filetransfer;
  2. import java.awt.BorderLayout;
  3. import java.awt.FlowLayout;
  4. import java.awt.event.ActionEvent;
  5. import java.awt.event.ActionListener;
  6. import java.beans.PropertyChangeEvent;
  7. import java.beans.PropertyChangeListener;
  8. import java.io.IOException;
  9. import java.net.ServerSocket;
  10. import java.net.Socket;
  11. import javax.swing.BoxLayout;
  12. import javax.swing.JButton;
  13. import javax.swing.JFrame;
  14. import javax.swing.JOptionPane;
  15. import javax.swing.JPanel;
  16. import javax.swing.JProgressBar;
  17. public class FileTransferServer extends JFrame implements ActionListener {
  18. /**
  19.      * 
  20.      */
  21. public final static String START_SVR = "Start";
  22. public final static String SHUT_DOWN_SVR = "Shut Down";
  23. public final static String END_FLAG = "EOF";
  24. private static final long serialVersionUID = 1L;
  25. private ServerSocket serverSocket;
  26. private JButton startBtn;
  27. private JProgressBar bar;
  28. public FileTransferServer() {
  29. super("File Server");
  30. initComponent();
  31. setupListener();
  32. }
  33. private void setupListener() {
  34. startBtn.addActionListener(this);
  35. }
  36. private void initComponent() {
  37. startBtn = new JButton(START_SVR);
  38. JPanel progressPanel = new JPanel();
  39. progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS));
  40. bar = new JProgressBar();
  41. bar.setMinimum(0);
  42. bar.setMaximum(100);
  43. progressPanel.add(bar);
  44. getContentPane().setLayout(new BorderLayout());
  45. JPanel btnPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
  46. btnPanel.add(startBtn);
  47. getContentPane().add(btnPanel, BorderLayout.SOUTH);
  48. getContentPane().add(progressPanel, BorderLayout.CENTER);
  49. }
  50. private void startServer(int port) {
  51. try {
  52. serverSocket = new ServerSocket(port);
  53. System.out.println("Server started at port :" + port);
  54. while(true) {
  55. Socket client = serverSocket.accept(); // blocked & waiting for income socket
  56. System.out.println("Just connected to " + client.getRemoteSocketAddress());
  57. FileReceiveTask task = new FileReceiveTask(client);
  58. bar.setValue(0); // reset it now
  59. task.addPropertyChangeListener(new PropertyChangeListener() {
  60. public void propertyChange(PropertyChangeEvent evt) {
  61. if ("progress".equals(evt.getPropertyName())) {
  62. bar.setValue((Integer) evt.getNewValue());
  63. }
  64. }
  65. });
  66. task.execute();
  67. }
  68. catch (IOException e) {
  69. e.printStackTrace();
  70. }
  71. }
  72. public void showSuccess() {
  73. bar.setValue(100);
  74. JOptionPane.showMessageDialog(this"file received successfully!");
  75. }
  76. @Override
  77. public void actionPerformed(ActionEvent e) {
  78. if(START_SVR.equals(e.getActionCommand())) {
  79. Thread startThread = new Thread(new Runnable() {
  80. public void run() {
  81. startServer(9999);
  82. }
  83. });
  84. startThread.start();
  85. startBtn.setEnabled(false);
  86. else if(SHUT_DOWN_SVR.equals(e.getActionCommand())) {
  87. else {
  88. // do nothing...
  89. }
  90. }
  91. public static void main(String[] args) {
  92. FileTransferServer server = new FileTransferServer();
  93. server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  94. server.setSize(400400);
  95. server.setResizable(false);
  96. server.setVisible(true);
  97. }
  98. }

FileReceiveTask是服务器端的文件接受类:

首先从建立的TCP流中得到文件名与文件大小,然后开始接受文件内容字节

并写入创建的文件对象流中,最后验证文件大小与写入的字节流是否相等

最后发送一条消息到文件发送方,告诉对方文件传输完成,可以关闭TCP流。

该类的完整源代码如下:

[java] view plaincopy
  1. package com.gloomyfish.socket.tutorial.filetransfer;
  2. import java.io.BufferedOutputStream;
  3. import java.io.BufferedWriter;
  4. import java.io.DataInputStream;
  5. import java.io.File;
  6. import java.io.FileOutputStream;
  7. import java.io.OutputStreamWriter;
  8. import java.net.Socket;
  9. import javax.swing.SwingWorker;
  10. public class FileReceiveTask extends SwingWorker<Integer, Object> {
  11. private Socket _mSocket;
  12. public FileReceiveTask(Socket client) {
  13. this._mSocket = client;
  14. }
  15. @Override
  16. protected Integer doInBackground() throws Exception {
  17. // get file meta information
  18. DataInputStream input = new DataInputStream(_mSocket.getInputStream());
  19. String fileName = input.readUTF();
  20. int fileLength = (int)input.readLong(); // number of total bytes
  21. File file = new File("C:\\Users\\fish\\Downloads" + File.separator + fileName);
  22. BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file));
  23. System.out.println("Received File Name = " + fileName);
  24. System.out.println("Received File size = " + fileLength/1024 + "KB");
  25. // start to receive the content of the file and write them
  26. byte[] content = new byte[2048];
  27. int offset = 0;
  28. int numReadBytes = 0;
  29. while(offset < fileLength && (numReadBytes = input.read(content)) > 0) {
  30. output.write(content, 0, numReadBytes);
  31. float precent = 100.0f * ((float)offset)/((float)fileLength);
  32. setProgress((int)precent);
  33. offset += numReadBytes;
  34. }
  35. System.out.println("numReadBytes = " + numReadBytes);
  36. if(offset < fileLength) {
  37. numReadBytes = input.read(content);
  38. System.out.println("numReadBytes = " + numReadBytes);
  39. System.out.println("File content error at server side");
  40. else {
  41. System.out.println("File Receive Task has done correctly");
  42. }
  43. setProgress(100);
  44. // tell client to close the socket now, we already receive the file successfully!!
  45. BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(_mSocket.getOutputStream()));
  46. bufferedWriter.write("DONE\r\n");
  47. bufferedWriter.flush();
  48. // close the file and socket
  49. output.close();
  50. _mSocket.close();
  51. return 100;
  52. }
  53. }

客户端:

FileTransferClient是客户端UI类,用来实现到服务端的连接,然后选择

要传输的文件(图片,PDF,Word文档等各种二进制文件)。如果没有

输入服务器信息,会弹出提示要求输入。端口已经指定为:9999

【send File】按钮会打开文件选择框,用户选择要传输文件以后,创建

FileTransferTask线程,并开始执行文件传送。客户端UI代码如下:

[java] view plaincopy
  1. package com.gloomyfish.socket.tutorial.filetransfer;
  2. import java.awt.BorderLayout;
  3. import java.awt.FlowLayout;
  4. import java.awt.GridLayout;
  5. import java.awt.event.ActionEvent;
  6. import java.awt.event.ActionListener;
  7. import java.beans.PropertyChangeEvent;
  8. import java.beans.PropertyChangeListener;
  9. import java.io.File;
  10. import java.net.InetSocketAddress;
  11. import java.net.SocketAddress;
  12. import javax.swing.BorderFactory;
  13. import javax.swing.BoxLayout;
  14. import javax.swing.JButton;
  15. import javax.swing.JFileChooser;
  16. import javax.swing.JFrame;
  17. import javax.swing.JLabel;
  18. import javax.swing.JOptionPane;
  19. import javax.swing.JPanel;
  20. import javax.swing.JProgressBar;
  21. import javax.swing.JTextField;
  22. /**
  23.  * 我一般写英文注释,偶尔我也会写中文注释,只是觉得写英文
  24.  * 注释跟代码比较统一,无他。
  25.  * 
  26.  * @Date 2012-11-30
  27.  * @author fish
  28.  *
  29.  */
  30. public class FileTransferClient extends JFrame implements ActionListener {
  31. /**
  32.      * 
  33.      */
  34. private static final long serialVersionUID = 1L;
  35. public final static String SEND_CMD = "Send File";
  36. public final static int MINIMUM = 0;
  37. public final static int MAXIMUM = 100;
  38. // public final static String CONNECT_CMD = "Connect";
  39. private JButton sendFileBtn;
  40. private JTextField serverField;
  41. private JTextField portField;
  42. private JProgressBar bar;
  43. public FileTransferClient() {
  44. super("File Transfer Client");
  45. initComponents();
  46. }
  47. private void initComponents() {
  48. getContentPane().setLayout(new BorderLayout());
  49. JPanel progressPanel = new JPanel();
  50. progressPanel.setLayout(new BoxLayout(progressPanel, BoxLayout.Y_AXIS));
  51. bar = new JProgressBar();
  52. progressPanel.add(bar);
  53. bar.setMinimum(MINIMUM);
  54. bar.setMaximum(MAXIMUM);
  55. JPanel serverSettingPanel = new JPanel();
  56. serverSettingPanel.setLayout(new GridLayout(2,2,5,5));
  57. serverSettingPanel.setBorder(BorderFactory.createTitledBorder("Server Setting"));
  58. serverField = new JTextField();
  59. portField = new JTextField();
  60. serverSettingPanel.add(new JLabel("Server IP/Host:"));
  61. serverSettingPanel.add(serverField);
  62. serverSettingPanel.add(new JLabel("Server Port:"));
  63. serverSettingPanel.add(portField);
  64. sendFileBtn = new JButton(SEND_CMD);
  65. JPanel btnPanel = new JPanel();
  66. btnPanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
  67. btnPanel.add(sendFileBtn);
  68. getContentPane().add(serverSettingPanel, BorderLayout.NORTH);
  69. getContentPane().add(btnPanel, BorderLayout.SOUTH);
  70. getContentPane().add(progressPanel, BorderLayout.CENTER);
  71. sendFileBtn.addActionListener(this);
  72. }
  73. @Override
  74. public void actionPerformed(ActionEvent e) {
  75. String command = e.getActionCommand();
  76. if(command.equals(SEND_CMD)) {
  77. if(checkNull()) {
  78. JOptionPane.showMessageDialog(this"Please enter server host and port in order to set up the connection!");
  79. return;
  80. }
  81. JFileChooser chooser = new JFileChooser();
  82. int status = chooser.showOpenDialog(null);
  83. if (status == JFileChooser.APPROVE_OPTION) {
  84. File f = chooser.getSelectedFile();
  85. SocketAddress address = new InetSocketAddress(getServer(), getPort());
  86. FileTransferTask task = new FileTransferTask(f, address, this);
  87. bar.setValue(0);
  88. task.addPropertyChangeListener(new PropertyChangeListener() {
  89. public void propertyChange(PropertyChangeEvent evt) {
  90. if ("progress".equals(evt.getPropertyName())) {
  91. bar.setValue((Integer) evt.getNewValue());
  92. }
  93. }
  94. });
  95. task.execute(); // 异步task执行
  96. }
  97. else {
  98. // do nothing
  99. }
  100. }
  101. public void showSuccess() {
  102. bar.setValue(100);
  103. JOptionPane.showMessageDialog(this"file send successfully!");
  104. }
  105. public String getServer() {
  106. return serverField.getText().trim();
  107. }
  108. public int getPort() {
  109. return Integer.parseInt(portField.getText().trim());
  110. }
  111. /**
  112.      * make sure the UI already have some correct input information here!!!
  113.      * @return
  114.      */
  115. private boolean checkNull() {
  116. String serverName = serverField.getText();
  117. String port = portField.getText();
  118. if(serverName == null || serverName.length() == 0 || port == null || port.length() == 0) {
  119. return true;
  120. }
  121. try {
  122. Integer.parseInt(port); // try to parse it as server port number , validation code.
  123. catch(NumberFormatException ne) {
  124. ne.printStackTrace();
  125. return true;
  126. }
  127. return false;
  128. }
  129. public static void main(String[] args) {
  130. FileTransferClient client = new FileTransferClient();
  131. client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  132. client.setSize(400400);
  133. client.setResizable(false);
  134. // client.pack();
  135. client.setVisible(true);
  136. }
  137. }

FileTransferTask实现的功能主要有:

1. 发送文件meta信息到接受方(文件名与文件大小)

2. 读取文件内容字节写入Socket字节流中,发送到接受方

3. 从Socket字节流中读取对方接受完成通知信息,调用弹出文件传输成功信息

该类完全源代码如下:

[java] view plaincopy
  1. package com.gloomyfish.socket.tutorial.filetransfer;
  2. import java.io.BufferedInputStream;
  3. import java.io.BufferedReader;
  4. import java.io.DataInputStream;
  5. import java.io.DataOutputStream;
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8. import java.io.IOException;
  9. import java.io.InputStreamReader;
  10. import java.net.Socket;
  11. import java.net.SocketAddress;
  12. import javax.swing.SwingWorker;
  13. public class FileTransferTask extends SwingWorker<Integer, Object> {
  14. private File selectedFile;
  15. private Socket mSocket;
  16. private SocketAddress address;
  17. private FileTransferClient parent;
  18. public FileTransferTask(File file, SocketAddress address, FileTransferClient owner /*, JProgressBar progress*/) {
  19. this.address = address;
  20. this.selectedFile = file;
  21. mSocket = new Socket();
  22. this.parent = owner;
  23. }
  24. @Override
  25. protected Integer doInBackground() throws Exception {
  26. // Get the size of the file
  27. long length = selectedFile.length();
  28. if (length > Integer.MAX_VALUE) {
  29. throw new IOException("Could not completely read file " + selectedFile.getName() + " as it is too long (" + length + " bytes, max supported " + Integer.MAX_VALUE + ")");
  30. }
  31. mSocket.connect(address);
  32. // Create the byte array to hold the file data
  33. mSocket.setSoLinger(true60);
  34. DataOutputStream dout = new DataOutputStream(mSocket.getOutputStream());
  35. // now we start to send the file meta info.
  36. dout.writeUTF(selectedFile.getName());
  37. dout.writeLong(length);
  38. dout.flush();
  39. // end comment
  40. FileDataPackage pData = new FileDataPackage();
  41. DataInputStream is = new DataInputStream(new FileInputStream(selectedFile));
  42. byte[] bytes = new byte[2048];
  43. // Read in the bytes
  44. int offset = 0;
  45. int numRead = 0;
  46. int fsize = (int)length;
  47. while (offset < fsize && (numRead=is.read(bytes, 0, bytes.length)) >= 0) {
  48. pData.setData(bytes, numRead);
  49. dout.write(pData.getPackageData(), 0, pData.getPackageData().length);
  50. dout.flush();
  51. offset += numRead;
  52. float precent = 100.0f * ((float)offset)/((float)fsize);
  53. setProgress((int)precent);
  54. }
  55. System.out.println("total send bytes = " + offset);
  56. // Ensure all the bytes have been read in
  57. if (offset < fsize) {
  58. throw new IOException("Could not completely transfer file " + selectedFile.getName());
  59. }
  60. mSocket.shutdownOutput();
  61. // receive the file transfer successfully message from connection
  62. BufferedInputStream streamReader = new BufferedInputStream(mSocket.getInputStream());
  63. BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(streamReader));
  64. String doneMsg = bufferedReader.readLine();
  65. if("DONE".equals(doneMsg)) {
  66. parent.showSuccess();
  67. }
  68. // Close the file input stream 
  69. setProgress(100);
  70. // dout.close();
  71. mSocket.close();
  72. is.close();
  73. System.out.println("close it now......");
  74. return 100;
  75. }
  76. }

数据包类如下,不解释!

[java] view plaincopy
  1. package com.gloomyfish.socket.tutorial.filetransfer;
  2. /**
  3.  * this is very simple file transfer protocol over TCP socket
  4.  * @date 2012-12-01
  5.  * @author zhigang jia
  6.  *
  7.  */
  8. public class FileDataPackage {
  9. private int dataLength; // 数据包中数据长度,两个字节
  10. private byte[] databuff; // 数据包中数据,meici最大不超过2048字节
  11. public final static byte[] EOF = new byte[]{'E''O','F'};
  12. public FileDataPackage() {
  13. dataLength = 0;
  14. databuff = new byte[2048];
  15. }
  16. public byte[] getPackageData() {
  17. byte[] pData = new byte[dataLength];
  18. // end comment
  19. System.arraycopy(databuff, 0, pData, 0, dataLength);
  20. return pData;
  21. }
  22. public void setData(byte[] data, int bsize) {
  23. dataLength = bsize;
  24. for(int i=0; i<databuff.length; i++) {
  25. if(i<bsize) {
  26. databuff[i] = data[i];
  27. else {
  28. databuff[i] = ' ';
  29. }
  30. }
  31. }
  32. }

每次发送的最大字节数为2048个字节。程序最终运行效果如下(win7 + JDK6u30):



觉得不错,请顶一下啊,谢谢!

转载于:https://www.cnblogs.com/songtzu/archive/2013/02/22/2922288.html

相关文章:

SuSE下VNCVIEWER没有出现界面,只有shell窗口的问题

首先正确配置&#xff0c;打开vncserver &#xff1a;1&#xff0c;实际上有三个服务&#xff0c;vnc1&#xff0c;vnc2&#xff0c;vnc3&#xff0c;对应着三个服务&#xff0c;先打开。 可以直接在shell下输入 #vncserver :1.也可以使用界面打开Network Service (xinetd),将服…

docker容器互联

link方式 http://blog.csdn.net/halcyonbaby/article/details/42112325 通过link方式创建容器&#xff0c;然后我们可以使用被link容器的别名进行访问。从而解除应用对IP的依赖。不幸的是,link方式只能解决单机容器间的互联。多机情况下&#xff0c;容器的互联需要其他的方式。…

glib 2.0 arm linux,glib源码安装使用方法

glib库是GTK和GNOME工程的基础底层核心程序库&#xff0c;是一个综合用途的实用的轻量级的C程序库&#xff0c;它提供C语言的常用的数据结构的定义、相关的处理函数&#xff0c;有趣而实用的宏&#xff0c;可移植的封装和一些运行时机能&#xff0c;如事件循环、线程、动态调用…

iOS 用自签名证书实现 HTTPS 请求的原理实例讲解

在16年的WWDC中&#xff0c;Apple已表示将从2017年1月1日起&#xff0c;所有新提交的App必须强制性应用HTTPS协议来进行网络请求。默认情况下非HTTPS的网络访问是禁止的并且不能再通过简单粗暴的向Info.plist中添加NSAllowsArbitraryLoads设置绕过ATS(App Transport Security)的…

WordPress Editorial Calendar插件权限安全绕过漏洞

漏洞名称&#xff1a;WordPress Editorial Calendar插件权限安全绕过漏洞CNNVD编号&#xff1a;CNNVD-201302-369发布时间&#xff1a;2013-02-22更新时间&#xff1a;2013-02-22危害等级&#xff1a; 漏洞类型&#xff1a;权限许可和访问控制威胁类型&#xff1a;远程CVE编号…

文件操作(ifstream、ofstream、fstream)

原文链接&#xff1a;http://blog.csdn.net/soar_ersa/article/details/3908943 转载于:https://www.cnblogs.com/MrYuan/p/5288264.html

linux error log 换行,日志提示

日志提示线上问题&#xff0c;需要看日志。控制台可以打印Mybatis操作的SQL语句。开发流程&#xff1a;第一步&#xff1a;加入依赖image.png第二步&#xff1a;在项目的resources中加入log4j属性文件image.png第三步&#xff1a;演示image.png扩展了解一、日志概念的介绍Log4j…

本页面添加至收藏夹

经常在网站页面上需要把本页面添加至收藏夹 <script type"text/javascript">function addMe() {var url document.location.href;var wTitle document.title;if (document.all) {window.external.addFavorite(url, wTitle);} else if (window.sidebar) {wind…

javascript——Array类型

今天这节教程不仅仅是阐述ECMAScript3的部分功能&#xff0c;同时也会阐述有关EXMASctip5的很多新的功能。 一、创建 因为它是一个引用类型&#xff0c;自然就需要在使用前先构造它。 我将分成两种方式来讲述 I、构造函数 1.空的Array实例 var colors new Array(); 2.初始化存…

iOS使用自签名证书实现HTTPS请求

原文链接:http://www.jianshu.com/p/e6a26ecd84aa 由于苹果规定2017年1月1日以后&#xff0c;所有APP都要使用HTTPS进行网络请求&#xff0c;否则无法上架&#xff0c;因此研究了一下在iOS中使用HTTPS请求的实现。相信大家对HTTPS都或多或少有些了解&#xff0c;这里我就不再介…

蜜蜂实训平台c语言考试答案,北理c语言上机答案(全)

小蜜蜂的不过,麻烦大家上百度找一下~1 Hello world让我们用C语言向世界问好。 最早的程序基本是这个样子的&#xff1a; 程序一&#xff1a;#include void main() {printf("Hello world.\n"); }程序二&#xff1a;#include int main() {printf("Hello world.\n&…

ecshop目录结构

ECShop 最新程序 的结构图及各文件相应功能介绍ECShop文件结构目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ affiliate.php 生成商品列表┣ article.php 文章内容┣ article_cat.php文章分类┣ auction.php 拍卖前台文件┣ brand.php 品牌列表┣ captcha.php 生…

一劳永逸,iOS 网页视图控制器通用类封装

原文链接&#xff1a;http://www.jianshu.com/p/553424763585随着 H5 的发展&#xff0c;在 iOS 开发中&#xff0c;网页视图的使用率逐渐提升&#xff0c;为了增加代码封装度、减轻开发负担&#xff0c;因此通常会对网页视图进行通用类的封装&#xff0c;本文简单讲述网页视图…

enyo官方开发入门教程翻译一Layout之Fittables

Fittables Fittable包帮助你创建布局更合理的使用可用空间&#xff08;app都有这样的布局需求&#xff0c;但使用以前的web技术很难做到这一点&#xff09;。个人观点&#xff0c;现在移动Web开发框架中有很多都支持自适应布局&#xff0c;如senchatouch&#xff0c;但是enyo的…

c语言 栈结构存放数据类型,数据结构——栈的详解

栈和队列是两种重要的线性结构&#xff0c;从数据结构的角度看&#xff0c;栈和队列也是线性表&#xff0c;其特殊性在于栈和队列的基本操作是线性表的子集。他们是操作受限的线性表&#xff0c;因此&#xff0c;可称为限定性的数据结构。但从数据类型角度看&#xff0c;他们是…

Verlet Integration

Verlet Integration Verlet 积分法是一种用于求解牛顿运动方程的数值方法&#xff0c;被广泛运用于动力学模拟以及视频游戏中。尔莱算法的优点在于&#xff1a;数值稳定性比简单的欧拉方法高很多&#xff0c;并保持了物理系统中的时间可逆性与相空间体积元体积守恒的性质。 基本…

[译] iOS 开发之新版 APNs 搭建必备知识

原文链接&#xff1a;http://www.jianshu.com/p/d8dba6c2c07a本文的大部分内容是对苹果关于 APNs 官方文档的翻译以及整理。 —— 由 稀土君 分享本文的大部分内容是对苹果关于APNs官方文档的翻译以及整理。 一、设备token和消息的生命周期 关于设备token以及推送消息的生命周期…

使用Application.GetResourceStream从XAP安装包加载任意资源

不得不说&#xff0c;WP7开发的资料真的是太少了&#xff0c;国内有句话叫“天下文章一大抄”&#xff0c;查Application.GetResourceStream的用法&#xff0c;找遍了整个网络&#xff0c;无非就那一两篇&#xff0c;而且写得还不完整&#xff0c;包括微软官方的例子。在花了近…

c语言知道算法写不出代码,这个代码怎么写算法啊,求教,我真的不会写算法怎么办#incl...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这个代码怎么写算法啊&#xff0c;求教&#xff0c;我真的不会写算法怎么办#include "stdio.h"#define N 3 //学生数3。struct Student //建立结构体。{int num;char name[20];float score[3];float aver;};int main(){v…

猎豹MFC--列表控件ListControl

ListControl添加变量&#xff1a;关联控件变量&#xff1a;初始化&#xff1a;设置样式 添加列标题&#xff1a;添加位图资源&#xff1a;添加位图变量&#xff1a;创建图像列表&#xff1a;并把图像列表 给 列表控件使用&#xff1a;双击添加行按钮&#xff1a;添加第2列时 不…

iOS 命令行自动打包 (archive)

原文链接&#xff1a;http://www.jianshu.com/p/2247f76404ebiOS 开发工程师在测试修复 bug 的过程中&#xff0c;一般会存在频繁打包的情况&#xff0c;如果一步步在 xcode 中点击 archive&#xff0c;下一步&#xff0c;下一步。。。这样太浪费我们的时间了。下面我们来介绍在…

看看现在大型网站都是用什么语言写的 ?

看看现在大型网站都是用什么语言写的 &#xff1f; 不排除一个网站用多种技术&#xff01;如淘宝是Java php&#xff0c;底层是java&#xff0c;表现层是php。新浪&#xff0c;网易&#xff0c;腾讯应该也是用了多种技术。 据说是这样的&#xff1a;php&#xff0c;新浪&#…

数据结构 算法与应用C 语言描述第六章,数据结构算法与应用-C语言描述002.pdf

下载下载第2 章 程 序 性 能以下是本章中所介绍的有关程序性能分析与测量的概念&#xff1a;• 确定一个程序对内存及时间的需求。• 使用操作数和执行步数来测量一个程序的时间需求。• 采用渐进符号描述复杂性&#xff0c;如 O、 、 、o 。• 利用计时函数测量一个程序的实际…

GCD 容易让人迷惑的几个小问题

来源&#xff1a;涂耀辉 链接&#xff1a;http://www.jianshu.com/p/ff444d664e51 写在开头&#xff1a; 本文旨在阐述一些大家容易产生迷惑的GCD相关内容&#xff0c;如果是需要了解一些GCD概念或者基础用法&#xff0c;可以看看这两篇文章&#xff1a;GCD 扫盲篇、巧谈GCD 。…

【贪心】【codevs】1214 线段覆盖

http://codevs.cn/problem/1214/ 我去这个题。。。wa的我都没脾气了。。。 我写while&#xff08;~scanf&#xff08;“%d”&#xff0c; &n&#xff09;&#xff09;竟然是不对的。。。 这个程序你妹多次输入是不能结束的&#xff1f;&#xff1f;&#xff1f;&#xff1f…

虚函数表剖析,网上转的,呵呵

http://www.cppblog.com/xczhang/archive/2008/01/20/41508.html C虚函数表解析(转)C中的虚函数的作用主要是实现了多态的机制。关于多态&#xff0c;简而言之就是用父类型别的指针指向其子类的实例&#xff0c;然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的…

c++语言文件流,C++ IO类、文件输入输出、string流详细讲解

新的C标准中有三分之二的内容都是描述标准库。接下来重点学习其中几种核心库设施&#xff0c;这些是应该熟练掌握的。标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围内的元素上或其他类型的序列上进行操作)。该篇主要学习IO库。…

iOS 走近商城 APP(三 WKWebView 商品规格选择框架封装)

原文链接&#xff1a;http://www.jianshu.com/p/293ee1bfe104商城 —— 由 3033 分享开篇 忽然发现最近也只有值班才能写东西了&#xff0c;中间更新了两篇其他的断了下商城相关的文章&#xff0c;仔细看了看之前觉得干货太少&#xff0c;今天写点实际的吧&#xff0c;闲说少说…

c语言如何不产生僵尸进程,第三章 九析带你处理 zombie(defunct) 进程

目录1 前言2 僵尸进程2.1 进程简介2.2 僵尸进程例子2.3 僵尸进程危害3 处理僵尸进程3.1 kill 命令3.2 kill 父进程3.3 reboot3.4 magic sysrq key 方法1 前言在 centos7 跑 Docker 和 k8s 时&#xff0c;偶尔会出现 systemctl 失效的情况&#xff0c;现象如下&#xff1a;Faile…

音视频开发学习笔记

http://www.jianshu.com/notebooks/6409162/top