多线程开启, 客户端通过 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. H5游戏接微信小游戏的支付,满满的都是坑!

    h5小游戏接微信的支付,简直是在为难我胖虎,说多了都是泪. 准备工作: 准备工作一定要做好,不然很容易出错.首先是session_key这个字段,这个session_key是登录的时候需要用到的,根据 ...

  2. 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard

    目录 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard 正文 对我的启发 机器学习英雄访谈录之 DL 自由职业者:Tuatini Godard Sanyam Bhutani 是 M ...

  3. 01-docker简介

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...

  4. twig用法

    1. GyAdminBundle::base.html.twig 必须添加Bundle名才可引用模板

  5. centos 升级python2.6 到python3.3(实测可行)

    http://blog.csdn.net/harith/article/details/17538233

  6. 《Linux内核设计与实现》第一二章读书笔记

    第一章 Linux内核简介 1.Unix简介 (一)概念:支持抢占式多任务.多进程.虚拟内存.换页.动态链接和TCP/IP网络的现代化操作系统. (二)Unix特点(层次化结构): Unix很简洁,仅 ...

  7. 重温jsp①

    Jsp就是一个servlet servlet的缺点 不适合设置html响应体,需要response.Getwriter.print(); 优点:动态资源,可以编程. Jsp:在原有的html中加入了J ...

  8. DeepID1,DeepID2

    1.DeepID1 (Deep Learning Face Representation from Predicting 10,000 Classes) Step1:构建网络框架 DeepConvNe ...

  9. DHCP全局配置文件解析

    作用 参数 ddns-update-style  类型 定义DNS服务动态更新的类型,类型包括:none(不支持动态更新), interim (互动更新模式)与ad-hoc(特殊更新模式) allow ...

  10. Gerrit 配置同步到多个仓库

    1.修改replication.config文件 [remote "xxx"] projects = Yilule.Core.Service #aliyun仓库 url = git ...