Socket简单实现数据交互及上传
声明:本文为原创,如需转载请说明出处:http://www.cnblogs.com/gudu1/p/7669175.html
首先为什么要写这个呢?因为在几个月之前我还使用Socket做一个小项目,而在今天我回想起Socket的操作细节,在我脑海里使劲挖掘Socket的痕迹,竟然丝毫没有找到,所以立即写了一个小Demo来记录一下,有些东西长时间不用肯定要忘的,人的脑容量有限,跟电脑缓存一样,不够用的时候会把那些不用的占内存的给释放掉, 就到这吧,说正题。
Socket 和 ServerSocket 的官方API解释:
Socket : 此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
ServerSocket:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
套接字的实际工作由 SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
在这个Demo中我使用了java.net包下的两个类:Socket 和 ServerSocket ,使用到的自定义类有3个:Service 、 Client 、ServiceThread,下面配合代码来解释一下
ServiceThread.java ,就把它当做一个服务器处理程序就好了
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.*;
public class ServiceThread implements Runnable {
Socket s = null; public ServiceThread(Socket socket) { // ①
super();
this.s = socket;
} @Override
public void run() {
String ip = s.getInetAddress().getHostName(); // ②
System.out.println("ip:"+ip);
try{
InputStream is = s.getInputStream(); // ③
byte[] buf = new byte[1024];
int len = 0;
File file = new File("D:/heheCopy.java"); // ④
OutputStream os = new FileOutputStream(file);
System.out.println("开始上传");
while((len = is.read(buf)) != -1){ // ⑤
os.write(buf,0,len); // ⑥
}
System.out.println("上传完毕");
is.close();
os.close();
} catch (Exception e){
e.printStackTrace();
} }
}
① :类只有一个构造函数,参数是Socket对象(即一个用户),因为在服务器和客户端是通过 I/O 流来交互,所以服务器端要获取客户端的IO对象(即输入输出流)。
②: 获取客户端的IP地址
③: 获取客户端的输入流,
④: 创建一个File对象,并指定客户端传输过来的数据存放的位置,如果不存在该文件就自动创建
⑤: 开始从流中读取数据,并存放在byte数组缓冲区中,在客户端的输出流未写入之前此方法一直处于阻塞状态(即等待状态)
⑥: 开始写入服务器本地文件
Client.java ,当做一个客户端
public class Client {
public static void main(String[] args) throws Exception {
Socket s = new Socket("127.0.0.1", 10001); // ①
InputStream is = new FileInputStream("D:/hehe.java"); // ②
byte[] buf = new byte[1024];
int len = 0;
while((len = is.read(buf))!=-1){
s.getOutputStream().write(buf,0,len); // ③
}
s.shutdownOutput(); // ④
System.out.println("读取完毕");
is.close();
}
}
①: 创建 Socket 对象,传入要连接服务器的 IP 和 端口
②: 创建一个输入流对象读取要上传的文件路径
③: 获取 Socket 输出流对象并将读取到的数据写入输出流中
④: 任何以前写入的数据都将被发送,如果不调用这个方法,那么在服务器端就不会知道数据已经传输完毕,将继续调用此 Socket 输入流的 read 方法,那么此时客户端只是一个Java程序,已经执行完毕,虚拟机将释放资源,这时,此Socket已经被 close掉,程序将抛出 SocketException 异常。
Serivce.java ,服务器
public class Service{
public static void main(String[] args)throws Exception{
ServerSocket ss = new ServerSocket(10001); // ①
while(true){
Socket s = ss.accept(); // ②
new Thread(new ServiceThread(s)).start(); // ③
}
}
}
①: 创建服务器对象,指定该服务器的端口号
②: 获得请求连接到该服务器的客户端对象Socket
③: 启动服务器处理程序线程,因为程序是无限循环,所以每当一个客户端连接进来都会创建一个新的线程
The End。。。。。
Socket简单实现数据交互及上传的更多相关文章
- 【ASP.NET Web API教程】5.3 发送HTML表单数据:文件上传与多部分MIME
原文:[ASP.NET Web API教程]5.3 发送HTML表单数据:文件上传与多部分MIME 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面 ...
- ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64)
ASP.NET Core 简单实现七牛图片上传(FormData 和 Base64) 七牛图片上传 SDK(.NET 版本):https://developer.qiniu.com/kodo/sdk/ ...
- Burp Post、Get数据包转为上传multipart/form-data格式数据包
方法一: 新建一个网页进行上传,代码代码如下: <html> <head></head> <body> <form method="po ...
- 使用FormData数据做图片上传: new FormData() canvas实现图片压缩
使用FormData数据做图片上传: new FormData() canvas实现图片压缩 ps: 千万要使用append不要用set 苹果ios有兼容问题导致数据获取不到,需要后台 ...
- java免费空间!最简单的openshift免费空间上传代码教程!和FTP一样简单!
史上最简单的openshift免费空间上传代码教程!没有之一! 最近因为想弄一个免费的空间,而且最好是Java的空间,找了一大片,jsp的空间少不说,免费的更是寥寥无几. 找了一大推垃圾空间,终于让我 ...
- 详细解读XMLHttpRequest(二)响应属性、二进制数据、监测上传下载进度
本文主要参考:MDN 分析并操作 responseXML属性 如果你使用 XMLHttpRequest 来获得一个远程的 XML 文档的内容,responseXML 属性将会是一个由 XML 文档解析 ...
- Android和FTP服务器交互,上传下载文件(实例demo)
今天同学说他备份了联系人的数据放在一个文件里,想把它存到服务器上,以便之后可以进行下载恢复..于是帮他写了个上传,下载文件的demo 主要是 跟FTP服务器打交道-因为这个东东有免费的可以身亲哈 1. ...
- 【jQuery插件】使用cropper实现简单的头像裁剪并上传
插件介绍 这是一个我在写以前的项目的途中发现的一个国人写的jQuery图像裁剪插件,当时想实现用户资料的头像上传功能,并且能够预览图片,和对图片进行简单的裁剪.旋转,花了不少时间才看到了这个插件,感觉 ...
- 一个简单的安卓+Servlet图片上传例子
例子比较 简单,服务端为Java Web Servlet,doPost方法中接收图片并保存,然后将保存的图片名返回给客户端,关键代码: @SuppressWarnings("deprecat ...
随机推荐
- vmware 遇到 “无法打开内核设备 \\.\Global\vmx86” 解决
问题描述:vmware没有正常关闭,再次打开使用时蓝屏,在安全模式下再次打开不会蓝屏,但提示"无法打开内核设备 \.\Global\vmx86: 系统找不到指定的文件,你想要安装VMware ...
- 使用 LVS 实现负载均衡原理及安装配置详解
负载均衡集群是 load balance 集群的简写,翻译成中文就是负载均衡集群.常用的负载均衡开源软件有nginx.lvs.haproxy,商业的硬件负载均衡设备F5.Netscale.这里主要是学 ...
- 201521123004《Java程序设计》第4周学习总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 本周主要内容为: 继承:extends 抽取共同特征(行为与属性) 复用代码 继承时子类将获 ...
- Java课程设计——猜数游戏(201521123111 陈伟泽)
Java课程设计--猜数游戏(201521123111 陈伟泽) 1.团队课程设计博客链接 博客作业--猜数游戏 2.个人负责模块或任务说明 Answer:一些基础界面的构造,排行榜的构造,用文件录入 ...
- 201521123011 《java程序设计》 第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- 201521123106 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123012 《Java程序设计》第十二周学习总结
作业参考文件 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int ag ...
- 201521123027 <java程序设计>第13周学习总结
1.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2.书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.e ...
- Linux系统下用户与组的管理
Linux系统下用户与组的管理 一.用户及组基本概述 Linux 系统上,用户管理是基于用户名和密码的方式进行资源的分配. 1.uid(用户身份标识) (1)root用户 uid为0 (2)普通用户: ...
- Java-判断一个数是不是素数
import java.util.Scanner; /** * @author 薛定谔的猫 * java判断一个数是不是素数 * * 素数又称质数,是指在一个大于1的自然数中,除了1和本身之外,不能被 ...