服务器端代码
1 import java.io.BufferedOutputStream;
2 import java.io.FileOutputStream;
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.net.InetAddress;
7 import java.net.ServerSocket;
8 import java.net.Socket;
9
10 import javax.servlet.http.HttpServlet;
11
12 /**
13 * 文件上传多线程版本,服务器端
14 *
15 * @author Administrator
16 *
17 */
18 public class TCPServer extends HttpServlet {
19
20 public void upload() throws Exception {
21
22 // 创建服务器,等待客户端连接
23 ServerSocket serverSocket=new ServerSocket(8880);
24 System.out.println("=====================服务器端已启动,等待客户端连接====================");
25 // 实现多个客户端连接服务器的操作
26 while (true) {
27 final Socket clientSocket=serverSocket.accept();
28 // 启动线程
29 new Thread() {
30 public void run() {
31 try {
32 // 显示哪个客户端连接上了服务器
33 // 得到ip地址对象
34 InetAddress ipAddress=clientSocket.getInetAddress();
35 // 得到ip 地址字符串
36 String ip=ipAddress.getHostAddress();
37 System.out.println("客户端IP:" + ip);
38 // 获取Socket输入流
39 InputStream in=clientSocket.getInputStream();
40 // 创建目的地的字节输出流
41 BufferedOutputStream fileOut=new BufferedOutputStream(new FileOutputStream(
42 "D:\?dTest1\" + ip + "(" + System.currentTimeMillis() + ").png"));
43 // 把Socket输入流中的数据,写入目的地的字节输出流中
44 byte[] buffer=new byte[1024];
45 int len=-1;
46 while ((len=in.read(buffer)) !=-1) {
47 // 写入目的地的字节输出流中
48 fileOut.write(buffer, 0, len);
49 }
50
51 //====================反馈信息====================52 // 获取Socket的输出流,作用:写反馈信息给客户端
53 OutputStream out=clientSocket.getOutputStream();
54 // 写反馈信息给客户端
55 out.write("图片上传成功".getBytes());
56 // 关闭流
57 out.close();
58 fileOut.close();
59 in.close();
60 clientSocket.close();
61 } catch (IOException e) {
62 // TODO Auto-generated catch block
63 e.printStackTrace();
64 }
65 }
66 }.start();
67 }
68 }
69
70 }
客户端代码
1 import java.io.BufferedInputStream;
2 import java.io.FileInputStream;
3 import java.io.InputStream;
4 import java.io.OutputStream;
5 import java.net.Socket;
6
7 /**
8 * 文件上传客户端
9 *
10 * @author Administrator
11 *
12 */
13 public class TCPClient {
14
15 public static void upload() throws Exception {
16
17 // 创建客户端Socket,链接服务器
18 Socket socket=new Socket("IP", 8880);
19 System.out.println("====================客户端已连接====================");
20 // 获取Socket流中的输出流,功能:用来把数据写到游戏转让平台服务器
21 OutputStream out=socket.getOutputStream();
22 // 创建字节输入流,功能:用来读取数据源(图片)的字节
23 BufferedInputStream fileIn=new BufferedInputStream(new FileInputStream("D:\?dTest\\img.png"));
24 // 把图片数据写到Socket的输出流中(把数据传给服务器)
25 byte[] buffer=new byte[1024];
26 int len=-1;
27 // read返回值是读入缓冲区的字节总数
28 while ((len=fileIn.read(buffer)) !=-1) {
29 // 把数据写到Socket的输出流中
30 out.write(buffer, 0, len);
31 }
32 // 客户端发送数据完毕,结束Socket输出流的写入操作,告知服务器
33 socket.shutdownOutput();
34
35 //====================反馈信息====================36 // 获取Socket的输入流,作用:读取反馈信息
37 InputStream in=socket.getInputStream();
38 // 读反馈信息
39 byte[] info=new byte[1024];
40 // 把反馈信息存储到info数组中,并记录字节个数
41 int length=in.read(info);
42 // 显示反馈结果
43 System.out.println(new String(info, 0, length));
44 // 关闭流
45 in.close();
46 fileIn.close();
47 out.close();
48 socket.close();
49 }
50
51 }
测试代码
1 public class Test {
2
3 public static void main(String[] args) throws Exception{
4
5 TCPClient.upload();
6
7 }
8
9 }
遇到的问题:
在用Tomcat启动ServerSocket时,会卡死,解决办法:
1,在 web.xml 中配置
1
2
3
4
5
6
7
8
9
2,
1 import javax.servlet.ServletException;
2 import javax.servlet.http.HttpServlet;
3
4 public class StartServer extends HttpServlet {
5
6 public void init() throws ServletException {
7
8 Thread s=new StartThread();
9 s.setDaemon(true);// 设置线程为后台线程,tomcat不会被hold,启动后依然一直监听。
10 s.start();
11
12 }
13
14 }
3,
1 public class StartThread extends Thread {
2
3 public void run() {
4
5 try {
6 TCPServer server=new TCPServer();
7 server.upload();// 启动开启服务,监听
8 } catch (Exception e) {
9 // TODO Auto-generated catch block
10 e.printStackTrace();