dis = new DataInputStream(socket.getInputStream())什么意思?
时间: 2023-10-25 15:28:03 浏览: 273
这行代码是在Java中使用Socket建立网络连接后获取输入流的代码。具体解释如下:
- `socket`是一个已经建立好网络连接的Socket对象。
- `socket.getInputStream()`方法返回与该Socket关联的输入流,即可以从该输入流中读取从远程计算机发送过来的数据。
- `DataInputStream`是Java提供的一个数据输入流,它可以从输入流中读取不同类型的数据,如int、short、float、double等。
- `dis = new DataInputStream(socket.getInputStream())`这行代码中,通过将Socket的输入流传递给DataInputStream的构造函数,创建了一个DataInputStream对象,该对象可以从Socket的输入流中读取数据。
因此,`dis = new DataInputStream(socket.getInputStream())`这行代码的作用是创建一个能够从Socket输入流中读取数据的DataInputStream对象,并将其赋值给变量`dis`。
相关问题
is = sc.getInputStream(); DataInputStream dis = new DataInputStream(is); int totalLength = dis.readInt(); // 创建一个256字节的数组来保存文件名的字节信息 byte[] data = new byte[256]; // 把字节数组 解析为文件名 dis.readFully(data); // 解析出文件名,并去除末尾的空格 String filename = new String(data).trim(); // 余下的是文件内容 data = new byte[totalLength - 9 - 256]; // 读入文件的字节 dis.readFully(data); // 保存文件到当前目录下 FileOutputStream fos = new FileOutputStream(filename); fos.write(data); fos.flush(); fos.close(); System.out.println("文件下载完成");改为从服务端下载到客户端
这段代码是一个服务器向客户端传输文件的代码,需要修改为从服务端下载到客户端的代码,可以参考以下实现:
1. 客户端向服务端发送文件名请求
2. 服务端收到请求后,读取文件内容并发送给客户端
3. 客户端接收到文件内容后,保存文件到本地
以下是修改后的代码示例:
客户端:
```java
Socket socket = new Socket("localhost", 8888);
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
// 发送文件名请求
dos.writeUTF("test.txt");
// 接收文件内容
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
int totalLength = dis.readInt();
byte[] data = new byte[totalLength];
dis.readFully(data);
// 保存文件到本地
FileOutputStream fos = new FileOutputStream("test.txt");
fos.write(data);
fos.flush();
fos.close();
socket.close();
System.out.println("文件下载完成");
```
服务端:
```java
ServerSocket serverSocket = new ServerSocket(8888);
while (true) {
Socket socket = serverSocket.accept();
InputStream is = socket.getInputStream();
DataInputStream dis = new DataInputStream(is);
// 接收文件名请求
String filename = dis.readUTF();
// 读取文件内容
File file = new File(filename);
byte[] data = new byte[(int) file.length()];
FileInputStream fis = new FileInputStream(file);
fis.read(data);
// 发送文件内容
OutputStream os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(data.length);
dos.write(data);
dos.flush();
socket.close();
}
```
package socket; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class SimpleTCPServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8885); // 1、创建服务器,指定端口 while(true) { Socket socket = server.accept();// 2、接收客户端连接 阻塞式 Handler handler = new Handler(socket); handler.start(); } } } class Handler extends Thread{ private Socket socket; public Handler(Socket socket) { this.socket = socket; } public void run() { InputStream dis = null; OutputStream dos = null; System.out.println("线程名称:" + Thread.currentThread().getName()); try { dis = socket.getInputStream(); dos = socket.getOutputStream(); byte[] buf = new byte[1024]; int len = dis.read(buf); String msg = new String(buf,0,len); System.out.println("服务端从客户端接收到: " + msg); String echo = "欢迎"; dos.write(echo.getBytes()); // 3、发送数据 dos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { dos.close(); dis.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }
这是一个简单的TCP服务器端的Java代码,可以监听客户端连接并接收消息,然后发送欢迎消息。代码流程如下:
1. 创建ServerSocket对象,并指定端口号为8885;
2. 通过ServerSocket对象的accept()方法阻塞式地等待客户端连接,一旦有客户端连接则创建一个Handler对象处理该连接;
3. Handler类继承了Thread类,重写了run()方法,其中获取到了与客户端通信的InputStream和OutputStream对象,通过read()方法读取客户端发送来的数据,并将读取到的字节数据转换为字符串类型后输出到控制台;
4. 将欢迎消息转换为字节数组后通过write()方法发送给客户端,并调用flush()方法刷新输出流;
5. 在finally块中关闭数据输入流、数据输出流和Socket对象。
需要注意的是,这是一个单线程的服务器端程序,每次只能处理一个客户端连接,如果需要同时处理多个客户端连接,则需要使用多线程或NIO技术。
阅读全文