工作需要,在客户端利用Socket发送文件到服务端,要求:
1将单一文件发送,扩展为循环文件发送.
2.发送失败则重新发送,最多重发3次,若不成功,则记录该文件
3.循环发送时,每一个发送完毕都需要完整性验证。谁能给个完整的事例,先谢过了!
1将单一文件发送,扩展为循环文件发送.
2.发送失败则重新发送,最多重发3次,若不成功,则记录该文件
3.循环发送时,每一个发送完毕都需要完整性验证。谁能给个完整的事例,先谢过了!
解决方案 »
- spring怎么用注解从request中取出值直接赋到一个类的属性里??
- 应该使用什么技术去实现呢?
- JavaScript中能用JSP重定向吗?
- Axis2 和XFire 到底哪个工具更好?
- 求JAVA的Socket写的类FTP命令原码,
- 请问如何在linux+resin,做图片验证码?
- 再累,再难,再忙也挺! 因为有我们java 家庭
- 使用JBuilder7问题
- java.lang.NoSuchMethodError when run j2ee -verbose
- spring mvc中上传图片,想有一个功能可以删除上传的图片,应该怎么实现
- 如何在myeclipse7.0中布置struts框架!学习中很着急!十万火急!!!!
- 来看看这个Struts2的异常
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public class Handler implements Runnable { // 负责与单个客户通信的任务
private Socket socket; public Handler(Socket socket) {
this.socket = socket;
} private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut=socket.getOutputStream();
return new PrintWriter(socketOut,true);
} private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn=socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
} public String echo(String msg) {
return "echo:"+msg;
} public void run() {
try {
System.out.println("New connection accepted "+ socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);
PrintWriter pw = getWriter(socket);
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":" + socket.getLocalPort();
System.out.println("A client come in!IP:" + RemoteIP+ RemotePort);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("服务端 请输入...");
String line = in.readLine();
line+=line;
System.out.println("client send is :" + line);
// setValue(line);
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Handler Your Message Received!");
out.close();
in.close();
socket.close();
// String msg = null;
// while ((msg = br.readLine()) != null) { // 接收和发送数据,直到通信结束
// System.out.println(msg);
// pw.println(echo(msg));
// if (msg.equals("bye"))
// break;
// }
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close(); // 断开连接
} catch (IOException e) {
e.printStackTrace();
}
}
}
}package cn.com.hgeagle.thread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class MultiThreadClient {
public static void main(String[] args) {
new MultiThreadClient().response();
}
public void response() {
System.out.println("客户端启动...");
int numTasks = 2;
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < numTasks; i++) {
exec.execute(createTask(i));
} } // 定义一个简单的任务
private static Runnable createTask(final int taskID) { // ,String sIp,final int iPort
return new Runnable() {
private Socket socket = null;
private int port=8821; public void run() {
System.out.println("客户端 请输入...");
System.out.println("Task " + taskID + ":start");
try {
socket = new Socket("localhost", port);
// 发送关闭命令
OutputStream socketOut = socket.getOutputStream();
System.out.println("try 客户端 请输入...");
socketOut.write("shutdown\r\n".getBytes()); // 接收服务器的反馈
BufferedReader br = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String msg = null;
while ((msg = br.readLine()) != null)
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
} };
}
}
package cn.com.hgeagle.thread;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.*;public class MultiThreadServer {
private int port=8821;
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=10;//单个CPU线程池大小
public MultiThreadServer() throws IOException{
serverSocket=new ServerSocket(port);
//Runtime的availableProcessor()方法返回当前系统的CPU数目.
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);
System.out.println("服务器启动");
}
public void service(){
while(true){
Socket socket=null;
try {
//接收客户连接,只要客户进行了连接,就会触发accept();从而建立连接
socket=serverSocket.accept();
executorService.execute(new Handler(socket));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
new MultiThreadServer().service();
}}
text2.txt text3.txt text4.txt text5.txt楼上的大哥,不好意思啊,让你写了那么代码
字段
,发送时间
,发送人ID
,接收人ID
,数据,必须可序列化2,编写用户数据堆栈,可以用数组实现。
,实现数据保存
,push(Data data)方法加数据
,Data pop()方法取数据3,编写服务类.
,有当前所有在线用户
,数据处理集,Map<Class,Object>propercess;//跟根要处理的数据Class存进去,当客户端发来数据时,只要拿到Data里面的数据class去Map里面找,在去执行接口的方法,这样要加功能的话,只要加一个相应的数据处理类了,不要大多改变代码
,有所有用户的消息
,非静态块实现所有用户消息的读取
, close()关闭服务,并把所有用户数据写入硬盘
,start()开始服务监听1219端口,接收用户登录,成功后把当前用户的所有数据发给用户,在创建一个用户数据接收线程,接收用户发来的数据进行处理,线程类会详细说明---,失败就关闭连接
3,编写用户数据处理类
--一个对象对应一个用户
--如果当前用户在线,就循环猛读数据并把数据丢给相应的方法进行处理,如果用户下线了,就把用户从服务类里面的当前在线用户中删除。
,accptData(Data data)方法用来处理用户发送的数据,先根据数据接收人号码去服务类的当前在线用户中拿到接收用户的通信流如果接收方在线,就直接把数据发给接收方,否则把数据存到服务类所有用户数据里面。
4,编写数据处理类
,propercess(Object obj)根据特定的数据进行处理
-----------------------服务端功能不多,重点在客服端,如果对功能增加或修改服务端不要改,子要到客服端增加相应的数据处理类就行了------------------------------------------