程序实现的是一个读取照片(可改为其文件类型)的服务端,可同时接受多个客户端连接,并且同时接受多张图片的数据。主要是通过多线程控制,每次检测到有请求连接,则开辟一个新线程,新线程的作用是接受图片, 通过不同线程同时运行达到可同时接收多张图片。
1. 这是服务端的源代码:
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.
}