客户端代码
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws Exception {
//创建客户端对象,指定服务器端IP和端口号(host是服务器名称或IP地址,port是端口号)
Socket client = new Socket("192.168.0.100", 8973);
//使用socket中的方法创建输出流对象,向服务器端传送数据
OutputStream outputStream = client.getOutputStream();
//读取本地数据写进输出流中,传送给服务器端
//创建输入流,关联数据源文件
FileInputStream fileInputStream = new FileInputStream("client.txt");
int len;
byte[] bytes = new byte[8192];
while ((len = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, len);
}
//解决阻塞问题
client.shutdownOutput();
//创建输入流,获取服务器端传送回来的回执信息并且打印
InputStream inputStream = client.getInputStream();
while ((len = inputStream.read(bytes)) != -1){
System.out.println(new String(bytes,0,len));
}
//关闭流
client.close();
outputStream.close();
inputStream.close();
}
}
服务器端
public class Server {
public static void main(String[] args) throws Exception{
//创建服务器端对象,指定服务器使用的端口号
ServerSocket server = new ServerSocket(8973);
//使用accpet方法接收客户端发送来的数据
Socket accpet = server.accept();
//使用socket中的方法创建输入流对象,获取客户端发送来的数据
InputStream inputStream = accpet.getInputStream();
//将客户端发送来的数据写入到服务器端的本地文件中
//创建输出流,关联目的地文件
FileOutputStream fileOutputStream = new FileOutputStream("server.txt");
int len;
byte[] bytes= new byte[8192];
while((len = inputStream.read(bytes))!= -1){
fileOutputStream.write(bytes,0,len);
}
//创建输出流,给客户端发送回执信息
OutputStream outputStream = accpet.getOutputStream();
outputStream.write("文件上传成功".getBytes());
//关闭流
//实际开发中,不会关闭服务器端的Socket对象
accpet.close();
outputStream.close();
}
}
细节1:应该先启动服务器端,再启动客户端
细节2:client.shutdownOutput()方法是解决线程阻塞问题. 客户端while()循环中的结束条件为不等于-1,所以会发送结束符之前的信息.服务器端在接收数据进行while()循环读取的时候读取不到结束符,所以会一直运行陷入死循环.我们使用shutdownOutput()方法加入一个结束符,可以解决这个问题.