程序实现的是一个读取照片(可改为其文件类型)的服务端,可同时接受多个客户端连接,并且同时接受多张图片的数据。主要是通过多线程控制,每次检测到有请求连接,则开辟一个新线程,新线程的作用是接受图片, 通过不同线程同时运行达到可同时接收多张图片。
1. 这是服务端的源代码:
01.
import java.io.*;
02.
import java.net.*;
03.
public class LoadPicServer {
04.
public static void main(String[] args) throws IOException {
05.
int listen_port = 10005; //监听的端口号
06.
long filecount = 1;
07.
ServerSocket ss = new ServerSocket(listen_port); //监听listen_port端口
08.
if(ss.isBound())
09.
System.out.println("The Server is listenning the port " + listen_port);
10.
while(true) {
11.
Socket s = ss.accept(); //检查是否有连接,该语句是阻塞语句,如果没有则会停在这。
12.
if(s.isConnected()) { //如果有连接则返回true,执行下面语句
13.
String filename = new String("ServerPic" + filecount++ + ".jpg");
14.
System.out.println(s.getInetAddress().getHostAddress()
15.
+ " is connected!"); //获取已连接的客户端的IP
16.
new Thread(new LoadPic(s,filename)).start(); //开启新线程接收图片,主线程继续回去while最开始检查有无连接。
17.
}
18.
}
19.
}
20.
}
21.
/*
22.
* 该类实现Runnable接口,用于实现多线程复制图片。
23.
* 该类的作用就是与主线程传入的Socket连接进行通信,从网络流获取对方的传送的文件数据。
24.
* */
25.
class LoadPic implements Runnable {
26.
Socket s = null;
27.
String filename = null;
28.
BufferedInputStream bufin = null;
29.
BufferedOutputStream bufout = null;
30.
PrintWriter return_txt = null;
31.
32.
public LoadPic(Socket s,String filename) {
33.
this.s = s;
34.
this.filename = filename;
35.
}
36.
37.
public void run() {
38.
try {
39.
bufin = new BufferedInputStream(s.getInputStream()); //获取传入Socket的输入流,用于读取图片数据
40.
bufout = new BufferedOutputStream(new FileOutputStream(filename)); //在当前文件夹创建名为filename的文件,作为输出流的目的。
41.
return_txt = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true); //该流用来向客户端发送确认信息。
42.
byte[] bufdata = new byte[1024];
43.
int len;
44.
while((len = bufin.read(bufdata)) != -1) { //从输入流读取数据,不为-1,即文件结束则继续读。
45.
bufout.write(bufdata,0,len); //往文件里写数据
46.
bufout.flush();
47.
}
48.
49.
return_txt.println("服务器接收成功!");
50.
51.
} catch (IOException e) {
52.
e.printStackTrace();
53.
} finally {
54.
try {
55.
s.close();
56.
bufin.close();
57.
bufout.close();
58.
return_txt.close();
59.
} catch (IOException e) {
60.
e.printStackTrace();
61.
}
62.
}
63.
}
64.
}
2. 这是客户端源代码,可同时开启多个客户端,做图片并行传输测试。因为多个客户端代码基本一样,所以只需看下面代码即可:
01.
import java.net.*;
02.
import java.io.*;
03.
//该类是客户端类,向服务器段发送请求连接,连接后就可以发送图片数据。
04.
class UpPicClient {
05.
public static void main(String[] args) throws IOException,InterruptedException {
06.
Socket s = new Socket("192.168.1.7",10005);
07.
if(s.isBound()) {
08.
System.out.println("Connect successful!");
09.
BufferedInputStream bufin = new BufferedInputStream(new FileInputStream("1.jpg"));
10.
BufferedOutputStream bufout = new BufferedOutputStream(s.getOutputStream());
11.
BufferedInputStream confirm_txt = new BufferedInputStream(s.getInputStream());
12.
byte[] bufdata = new byte[1024];
13.
int len;
14.
while((len = bufin.read(bufdata)) != -1) {
15.
bufout.write(bufdata,0,len);
16.
bufout.flush();
17.
}
18.
s.shutdownOutput();
19.
System.out.println("发送结束!");
20.
len = confirm_txt.read(bufdata,0,bufdata.length);
21.
String str = new String(bufdata,0,len);
22.
System.out.println(str);
23.
s.close();
24.
bufin.close();
25.
bufout.close();
26.
confirm_txt.close();
27.
}
28.
}
29.
}