多线程开启, 客户端通过 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. 线状地物图斑化全流程作业(使用ArcMap软件)

    一.线状地物调整 1.添加全覆盖图斑数据 2.添加线状地物 3.添加地理图斑 4.添加村界 5.剪裁自己村界的线状地物得(地理处理/剪裁(输入要素为线状地物,剪裁要素为村界,输出要素是得到的新层位置) ...

  2. 【读书笔记】Linux内核设计与实现(第五章)

    5.1 内核通信 系统调用在用户空间和硬件设备之间添加了一个中间层. 该层主要作用: 1.为用户空间提供了一种硬件的抽象接口. 2.保证了系统的稳定和安全. 3.每个进程都运行在虚拟系统中. 在Lin ...

  3. 《Linux内核分析》 第六节 进程的描述和进程的创建

    <Linux内核分析> 第六节 进程的描述和进程的创建 20135307 张嘉琪 原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study ...

  4. 构建之法-软件测试+质量保障+稳定和发布阶段+IT行业的创新+人、绩效和职业道德

    第十三章(软件测试) 要知道为什么有软件测试,首先需要知道软件开发,软件开发者一般都很难检查出自己的错误,所以才需要另外一个人测试,所以软件测试就诞生了. 书本介绍了很多测试方法,各有各的优缺点,至于 ...

  5. beta 圆桌 7

    031602111 傅海涛 1.今天进展 主界面微调,部分地方加入用户体验设计 2.存在问题 文档转化太久 3.明天安排 完成全部接口的交互 4.心得体会 文档转化优化不了 031602115 黄家雄 ...

  6. git 生成秘钥

    Permission denied (publickey). fatal: The remote end hung up unexpectedly 应该是ssh key过期了吧 试着重新创建ssh k ...

  7. Ubuntu18.04 安装后的简单实用设置[未完成]

    1. 安装完成. 2. 更新 sudo apt-get update 3. 修改vi 放置键盘错位的问题 编辑文件/etc/vim/vimrc.tiny 将“compatible”改成“nocompa ...

  8. Java中String直接赋字符串和new String的区别 如String str=new String("a")和String str = "a"有什么区别?

    百度的面试官问 String A="ABC"; String B=new String("ABC"); 这两个值,A,B 是否相等,如果都往HashSet里面放 ...

  9. FileReader & Blob & File

    FileReader & Blob & File https://developer.mozilla.org/en-US/docs/Web/API/FileReader https:/ ...

  10. delphi Form属性设置 设置可实现窗体无最大化,并且不能拖大拖小

    以下设置可实现窗体无最大化,并且不能拖大拖小BorderIcon 设为---biMax[False] biHelp [False]BorderStyle 设为---bsSingle 参考------- ...