qq文件上传服务器,(Socket、ServerSocket、多线程)模拟文件上传至服务器

之前整理了一篇文件上传下载的博客和线程池相关文章,这次搞一篇使用Socket和ServerSocket结合线程池创建多线程来模拟上传文件至指定服务器。

Client客户端

此篇文章在创建demo的时候不需要额外引入其他依赖,直接Next创建一个Client客户端就可以了。

b2fbf5bea919ecbe33c36e7798a8baaa.png

使用Socket套接字来创建客户端

public class UploadClient {

public static void main(String[] args) throws IOException {

//创建一个指定host和port的客户端套接字

Socket socket = new Socket("127.0.0.1", 8083);

//指定本地文件File对象

File file = new File("E:" + File.separator + "1.jpg");

//创建本地FileInputStream流对象来读取文件

FileInputStream fileInputStream = new FileInputStream(file);

//通过socket获取outputStream流

OutputStream outputStream = socket.getOutputStream();

//使用outputStream的write方法读取本地文件

byte[] bytes = new byte[(int) file.length()];

int len = 0;

while ((len = fileInputStream.read(bytes)) != -1) {

outputStream.write(bytes,0,len);

}

//使用socket的shutdownOutStream()方法禁用此套接字的输出流

socket.shutdownOutput();

//读取服务器返回的信息

InputStream inputStream = socket.getInputStream();

while ((len = inputStream.read(bytes)) != -1) {

//将读取的服务器信息打印出来

System.out.println(new String(bytes, 0, len));

}

//关闭流

fileInputStream.close();

socket.close();

}

}

Server服务器端

同样新建一个项目,在项目中使用ServerSocket套接字来创建Server服务器端:

public class UploadServer {

public static void main(String[] args) throws Exception {

//1.创建一个服务器对象

ServerSocket serverSocket = new ServerSocket(8083);

//2.监听服务器,看是否有客户端连接,这里使用while死循环,一直开启服务器端监听

while (true) {

Socket socket = serverSocket.accept();

ThreadPoolExecutor threadPoolExecutor;

threadPoolExecutor = new ThreadPoolExecutor(5, 10, 500, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(5));

threadPoolExecutor.execute(new Runnable() {

@Override

public void run() {

FileOutputStream fileOutputStream = null;

//虽然已经声明抛出了异常,但是因为run()方法没有抛异常,这里重写之后也不能抛异常,只能捕获异常

try {

//3.获取网络流inputStream对象

InputStream inputStream = socket.getInputStream();

//4.创建本地outputStream对象

File folder = new File("D:" + File.separator + "upload");

if (!folder.exists()) {

folder.mkdirs();

}

fileOutputStream = new FileOutputStream(folder + File.separator + System.currentTimeMillis() + ".jpg");

//5.将上传的文件读出来

int len = 0;

byte[] bytes = new byte[1024];

while ((len = inputStream.read(bytes)) != -1) {

//6.将读出来的数据再写到服务器本地磁盘中

fileOutputStream.write(bytes, 0, len);

}

//7.写完之后,再给客户端一个回应。

OutputStream outputStream = socket.getOutputStream();

outputStream.write("服务器响应:上传成功!".getBytes());

//8.释放资源

fileOutputStream.close();

socket.close();

} catch (IOException e) {

e.printStackTrace();

}

}

});

}

}

}

测试

先启动Server服务器端,然后再启动Client客户端,可以从客户端上面看到从服务器端返回的响应信息。再看D盘上的upload文件夹中,确实有了一张.jpg格式的图片。

40353e957253ce31365b68b0dcac9754.png

f3ea41be7972c3e64047889f666ee8d8.png

通过上面代码,就可以简单模拟多线程模拟文件上传至服务器端。这篇对于案例中的FileInputStream和InputStream之间的区分和FileOutputStream和OutputStream之间的区分,我是简单的理解为带File的就是直接对接磁盘的本地流,(栗子:比如你要从C盘中读取一个txt文件,那就先使用FileInputStream的read()方法读取出来,再使用OutputStream(不带file)的网络流对象的write()方法写到服指定服务器上去)。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实现Java模拟QQ聊天的实时刷新可以采用以下步骤: 1. 创建一个服务器端和客户端的Socket连接。服务器端监听指定的端口,等待客户端的连接请求,客户端通过指定服务器端的IP地址和端口号连接服务器。 2. 服务器端使用多线程,当有新的客户端连接进来时,创建一个新的线程处理该客户端的请求,保证能够同时处理多个客户端的请求。 3. 客户端通过输入文本框输入消息,并通过点击发送按钮将消息发送给服务器端。 4. 服务器端收到客户端发送的消息后,将该消息发送给所有连接到服务器的客户端。可以维护一个客户端列表,遍历列表将消息发送给每个客户端。 5. 客户端收到服务器端发送的消息后,将消息显示在聊天窗口中。 6. 为了实现实时刷新,可以使用Java的Swing或JavaFX编写聊天窗口界面。可以使用JTextArea或TextField来显示聊天内容,使用JButton来发送消息。 通过以上步骤,可以实现Java模拟QQ聊天的实时刷新功能。当有新的消息发送或接收时,聊天窗口会实时刷新显示最新的消息。 ### 回答2: Java模拟QQ聊天实时刷新的实现方式可以通过使用Socket编程来实现。实现步骤如下: 1. 服务端:创建一个ServerSocket对象,指定端口号,等待客户端的连接。一旦有客户端接入,创建一个Socket对象来与客户端进行通信。 2. 客户端:创建一个Socket对象,指定要连接的服务端的地址和端口号。创建输入、输出流,与服务端进行通信。 3. 服务端:在一个独立的线程中,不断地接收客户端发送的消息。将接收到的消息保存到一个集合中,该集合可以是一个List或其他适合保存消息的数据结构。 4. 客户端:在一个独立的线程中,不断地从用户输入读取消息。将读取到的消息发送给服务端。 5. 服务端:在一个独立的线程中,不断地从保存消息的集合中读取未读消息,并将这些消息发送给客户端。 6. 客户端:在一个独立的线程中,不断地从服务端读取未读消息。如果有新的消息,则将其显示在聊天界面上。 通过以上步骤,服务端和客户端可以实现实时刷新的聊天效果。当客户端发送消息时,服务端接收并保存该消息,并将该消息发送给其他客户端。其他客户端不断地从服务端读取未读消息,并将其显示在聊天界面上,从而实现实时刷新的效果。 需要注意的是,以上只是一个简单的示例,实际的实现可能涉及到更多的细节和功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值