多线程开启, 客户端通过 Socket 流 上传文件到服务端的一个小程序练习.
1. 抓住阻塞式方法,去调试
2. 获取对应流对象操作对应的对象 这时候自己不能懵,一定要清晰,最好命名就能区别,一搞混了就乱了
import java.io.*;
import java.net.*;
class UpLoadDemo{
public static void main(String [] args) throws Exception{
int port=10085;
String ipAddr="192.168.20.1";
String srcFilePath="C:\\Users\\Ghc\\Desktop\\psb.jpg";
String destFilePath="C:\\Users\\Ghc\\Desktop\\test\\psb2.jpg";
new Thread(new UploadServer(new ServerSocket(port),destFilePath)).start();
new Thread(new UploadClient(new Socket(ipAddr,port),srcFilePath)).start();
}
} class UploadClient implements Runnable{
private Socket socket;
private BufferedInputStream socketBufIn,fileBufIn;
private BufferedOutputStream socketBufOut;
private String filePath; private int len=-1;
private byte [] buf=new byte[1024]; UploadClient(Socket socket,String filePath){
this.socket=socket;
this.filePath=filePath;
}
public void run(){
try{ fileBufIn=new BufferedInputStream(new FileInputStream(filePath));
socketBufIn=new BufferedInputStream(socket.getInputStream());
socketBufOut=new BufferedOutputStream(socket.getOutputStream()); while((len=fileBufIn.read(buf))!=-1){
socketBufOut.write(buf,0,len);
socketBufOut.flush();
}
socket.shutdownOutput(); len=socketBufIn.read(buf);
System.out.println("server: "+new String(buf,0,len)); }
catch(Exception e){
e.printStackTrace();
}
finally{
if(fileBufIn!=null)
try{
fileBufIn.close();
fileBufIn=null;
} catch(Exception e){
e.printStackTrace();
}
if(socket!=null)
try{
socket.close();
socket=null;
} catch(Exception e){
e.printStackTrace();
}
}
}
} class UploadServer implements Runnable{
private ServerSocket serverSocket;
private Socket socket;
private String destFilePath;
private BufferedInputStream socketBufIn;
private BufferedOutputStream socketBufOut;
private BufferedOutputStream fileBufOut;
private int len=-1;
private byte[] buf=new byte[1024]; UploadServer(ServerSocket serverSocket,String destFilePath){
this.serverSocket=serverSocket;
this.destFilePath=destFilePath;
} public void run(){
try{
fileBufOut=new BufferedOutputStream(new FileOutputStream(destFilePath));
socket=serverSocket.accept();
socketBufIn=new BufferedInputStream(socket.getInputStream());
socketBufOut=new BufferedOutputStream(socket.getOutputStream());
System.out.println("ip: "+socket.getInetAddress().getHostAddress()+"connected!");
while((len=socketBufIn.read(buf))!=-1){
fileBufOut.write(buf,0,len);
fileBufOut.flush();
}
socketBufOut.write("File uploaded Successfully! ".getBytes());
socketBufOut.flush();
//socket.shutdownInput();
}
catch(Exception e){
e.printStackTrace();
}
finally{
if(fileBufOut!=null)
try{
fileBufOut.close();
fileBufOut=null;
}
catch(Exception e){
e.printStackTrace();
}
if(serverSocket!=null)
try{
serverSocket.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
}

效果图:

那些年的 网络通信之 TCP/IP 传输控制协议 ip 加 端口 客户端上传文件到服务器端服务器端返回上传成功消息的更多相关文章

  1. 那些年的 网络通信之 TCP/IP 传输控制协议 ip 加 端口 ---

    /* 一个文本小写转换为大写的小程序,当客户端从键盘录入一串字符串发送到服务端服务端转换为大写返回给客户端 */ import java.io.*; import java.net.*; class ...

  2. 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  3. 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(2)-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  4. TCP(传输控制协议)和三次握手和四次断开

    TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义.在简化的计算机网络OSI模型中, ...

  5. TCP (传输控制协议)

    http://baike.baidu.com/item/TCP/33012?fr=aladdin TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的.可 ...

  6. 三、 TCP(传输控制协议)

    它建立在网际层协议(IP)提供的数据包传输技术之上,.TCP使应用程序可使用连续的数据进行通信.除非由于网络故障导致连接中断或冻结,TCP都能保证数据流完好地传输.而不会发生丢包 ,重包或是乱序的问题 ...

  7. TCP(传输控制协议)

    三次握手tcp是一种面向链接的.可靠的.基于字节流的传输层通信协议,提供可靠的连接服务,采用三次握手确认建立一个连接.位码即tcp标志位,有6种标示:1.SYN(synchronous建立连接)2.A ...

  8. TCP,UDP,IP总结

    一.传输层的主要功能是什么? 分割并重新组装上层提供的数据流,为数据流提供端到端的传输服务. 二.传输层如何区分不同应用程序的数据流? 因为,对应传输层而言,它只需要知道目标主机上的哪个服务程序来响应 ...

  9. 浅谈Http、TCP、UDP和 IP 的的区别

    应用层:Http,超文本传输协议(HyperText Transfer Protocal):利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议.客户端使用Web浏览器发起HTTP请求 ...

随机推荐

  1. [ERROR] Failed to execute goal net.alchim31.maven:scala-maven-plugin:3.2.2:compile (scala-compile-first) on project spark-tags_2.11: Execution scala-compile-first of goal net.alchim31.maven:scala-mave

    build/mvn -Pkubernetes -Phadoop-2.7 -Dhadoop.version=2.7.3 -Phive -Phive-thriftserver -DskipTests cl ...

  2. 浅谈SVG(可缩放的矢量图形)

    前一段项目中用到了svg图片就和其他的元素一样 直接引用就可以展示在页面上,因为项目紧张没有仔细的研究,最近在扩展自己的基础知识,偶然看到了这个东西,于是总结了一些博客园中关于这个svg的基础知识,只 ...

  3. 普通程序员看k8s的账户管理

    一.知识准备 ● 账户管理分为:userAccount与serviceAccount ● userAccount:通常是给人设计使用的,并且userAccount不在k8s集群内管理 ● servic ...

  4. webpack4-用之初体验,一起敲它十一遍

    众所周知,webpack进入第4个大版本已经有2个月的时间了,而且webpack团队升级更新的速度也是非常的惊人 在写下如下内容的时候webpack已经出到了4.6的版本了,剑指5.0应该是指日可待了 ...

  5. 《Linux 内核分析》第五周

    [李行之原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] <Linux内 ...

  6. 个人作业3——个人总结AlPha阶段

    一.Alpha版本的总结 1.感受 Alpha版本已经结束了,回顾整个过程,我最大的遗憾就是项目完成得不是很理想,同时觉得自己做得不够多.不够好. 2.我做了哪些工作 数据库的连接,部分团队博客:部分 ...

  7. linux下php环境的装配以及php storm的链接

    linux下php环境的装配以及php storm的链接 本次安装在deepin系统下完成 一.安装LAMP组合 Linux+Apache+Mysql+php 直接命令 sudo apt-get in ...

  8. beta圆桌 SUM UP

    分工 黄家雄:基础页面 意见反馈 牛康文:基础页面 关于我们 姚志辉:登录注册页面修缮 魏璐炜:多界面修缮,用户使用调查,ppt制作 许斌:自动化测试 傅海涛:文件转换及列表,语音字幕,列表更新 徐明 ...

  9. K8S 使用简单的NFS 作为 持久存储的 StorageClass 的简单测试.

    Study From https://jimmysong.io/kubernetes-handbook/practice/using-nfs-for-persistent-storage.html 1 ...

  10. java之常量折叠

    为什么会写着篇博客,因为昨天看了关于final关键字的解析.但是有个问题始终没有得到解决,于是请教了我qq上之前添加的知乎大神.他给我回复的第一条消息:常量折叠.身为渣渣猿的我立马查询了这个概念.这是 ...