import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
//客户端代码
public class Client_home {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("我自己的IP:"+InetAddress.getLocalHost());
InetAddress localHost = InetAddress.getLocalHost();
Socket socket = new Socket(InetAddress.getLocalHost(),19999);
//该线程用于发出图片文件
new Thread(){
@Override
public void run() {
OutputStream os=null;
FileInputStream fis=null;
try {
os = socket.getOutputStream();
fis = new FileInputStream("C:\\Users\\17767\\Desktop\\屏幕截图 170946.png");
BufferedInputStream bis = new BufferedInputStream(fis);
byte[] b = new byte[1024];
int len;
while((len=bis.read(b))!=-1){
os.write(b,0,len);
}
//该处应该给服务器提示文件已经传输完毕,否则服务器一直在等待文件传输的循环中!!!
} catch (Exception e) {
e.printStackTrace();
}
finally{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
//该线程用于读取数据
new Thread(){
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
while(true){
byte[] b = new byte[100];
int len = is.read(b);
System.out.println(new String(b,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上述代码是实现客户端向服务器端发送文件的,但是有一处注释我有写到文件传输完毕,没有任何提示,导致服务器能一直处于接收文件的状态下,下面我将会用服务器端进行测试
//服务器代码如下:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("服务器开启");
ServerSocket ss = new ServerSocket(19999);
try {
while (true) {
System.out.println("-1");
Socket s = ss.accept();
//该线程用于接收用户上传的图片文件
System.out.println("0");
new Thread() {
@Override
public void run() {
FileOutputStream fos=null;
BufferedOutputStream bos=null;
try {
byte[] b = new byte[1024];
fos = new FileOutputStream("C:\\Users\\17767\\Desktop\\屏幕截图170946_copy.png");
bos = new BufferedOutputStream(fos);
InputStream is = s.getInputStream();
int len;
System.out.println("1");
while ((len = is.read(b)) != -1) {
System.out.println("100");
bos.write(b, 0, len);
}
System.out.println("2");
OutputStream os = s.getOutputStream();
System.out.println("3");
os.write("文件接收成功!".getBytes());
System.out.println("4");
os.flush();
System.out.println("5");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
bos.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
因为运行的时候我发现,服务器无法回复客户端文件接收成功这句话,所以我添加了输出语句来判断到底是哪里代码没有走到,结果控制台只输出了如下代码:
?我们发现输出语句的"2","3","4","5" 迟迟没有走到,只有"100"在文件传输途中不停的出现,并且处于阻塞状态,所以我们得知文件在接收完毕后没有走出该循环.
于是我查询了1.6的API发现TCP的客户端还有一个方法可以结束输出语句,即:shutdownOutput
?我尝试将该方法增加到客户端上是,发现服务器能够正常输出"2","3","4","5",即接收代码块能正常运行到底了,不会出现阻塞状态了!(方法添加位置为客户端处,如下图)
?最终我成功的发现客户端的控制台上成功接收到,服务器发过来的语句:
?所以,在客户端代码上添加该方法成功解决该问题!!!
感谢您的观看!
?
?
?
?
?
?
?
|