热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

27网络编程19网络编程(TCP协议练习服务端多线程技术)

**前两个视频客户端上传图片给服务端的若干问题:**1.服务端开启,此时张三连进来,获取张三Socket对象,张三上传完毕&

/** 前两个视频客户端上传图片给服务端的若干问题:* * 1.服务端开启,此时张三连进来,获取张三Socket对象,张三上传完毕,关闭张三Socket,ss.close(),服务端也关闭,所以* 此时其余人无法上传文件。* * 2.为克服问题1,有如下程序:* ServerSocket ss = new ServerSocket(20000);* while(true){* Socket s = ss.accept();* 流对象的不断读写操作......* s.close();* }* 此时问题1解决,但是新问题出现,由于此时只有主线程这一个线程在工作,所以客户端1进入while循环,获取客户端1的Socket对象,* 开始读写操作,此时客户端2连进来了,那么获取不到客户端2的Socket对象,因为主线程在操作客户端1的读写,所以还是有问题。* →上传图片需要排队。(如别人登录新浪,你登录不了,同一时间只一个登录新浪)*//*** 上述问题可用多线程并发解决,思考发现while循环中的“流对象的不断读写操作......”不管哪个客户端连进来都要做这步,* 而Socket s = ss.accept()可以用一个线程单独封装操作,即客户端1用线程1,客户端2用线程2……* * 程序运行,客户端1连进来,主线程立马安排线程1给客户端1(下面由线程1带领客户端1完成读写等操作),此时主线程立马回到* 开始等待客户端2连接,客户端2一连接,主线程立马安排线程2给客户端2(下面由线程2带领客户端2完成读写操作),此时主线程* 立马回到开始等待客户端3连接……如此往复,这就是【服务器原理:客户端并发访问】,程序如下:* ServerSocket ss = new ServerSocket(20000);* while(true){* Socket s = ss.accept();主线程在这等着,有一个客户端连接* new Thread(new Task(s)).start();主线程就安排一个线程【将连接进来的客户端封装到一个线程中】* 流对象的不断读写操作......* s.close();* }*/package test;import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class TCPThreadTest {public static void main(String[] args) throws IOException {//将UploadServerOfPhoto代码修改ServerSocket ss = new ServerSocket(10006);while(true){Socket s = ss.accept();new Thread(new UploadTask(s)).start();}//ss.close();这里无需关闭,因为while无限循环}}

======================分割线====================================

package test;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class UploadTask implements Runnable {private Socket s;private int count = 0;public UploadTask(Socket s) {this.s = s;}@Overridepublic void run() {// 这里写的代码是每个客户端连接到服务端均要做的事情String ip = s.getInetAddress().getHostAddress();System.out.println(ip + "......connected");try {InputStream in = s.getInputStream();File dir = new File("c:\\pic");if (!dir.exists())dir.mkdirs();File file = new File(dir, ip + ".bmp");/** 有可能出现同一个客户端上传不止一个文件的情况,为了防止后一个文件将前一个覆盖,这里给文件名加上编号。(这就是* 为什么迅雷下载同一个文件,第一个若叫xxx.bmp,第二个叫xxx(1).bmp的原因)*/if(file.exists())file = new File(dir,ip+"("+(++count)+")"+".bmp");FileOutputStream fos = new FileOutputStream(file);byte[] bufIn = new byte[1024];int lenIn = 0;while ((lenIn = in.read(bufIn)) != -1) {fos.write(bufIn, 0, lenIn);}OutputStream out = s.getOutputStream();out.write("上传成功......".getBytes());fos.close();s.close();} catch (IOException e) {}}}






推荐阅读
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
author-avatar
weijun520
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有