数据传输
通过获取到对应的I/O
流进行网络数据传输
//服务端
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(8080)) {
System.out.println("服务端启动成功!!!");
Socket socket = server.accept();
System.out.println("客户端已连接,IP地址为:"+socket.getInetAddress().getHostAddress());
System.out.println("读取的客户端数据:");
InputStream stream = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));//InputStreamReader的作用是将字节流转换为字符流,然后BufferedReader在这个字符流的基础上提供了缓冲功能,使得字符读取操作更加高效。
System.out.println(reader.readLine());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
//客户端
public static void main(String[] args) {
try(Socket socket = new Socket("localhost",8080)) {
System.out.println("成功连接到服务端!!!");
// OutputStream outputStream = socket.getOutputStream();
// Scanner sc = new Scanner(System.in);
// String ss = sc.nextLine();
// outputStream.write(ss.getBytes());
// outputStream.flush();
/*上面的方法是获取输出流,然后将输入的数据传到输出流中,并更新*/
OutputStreamWriter osw = new OutputStreamWriter(socket.getOutputStream());
//OutputStreamWriter对象,用于将字符数据转换为字节数据并发送到指定的Socket输出流中。
Scanner sc = new Scanner(System.in);
osw.write(sc.nextLine()+"\n");
//readLine方法会一直读取字符,直到遇到换行符,然后将换行符之前的字符作为一个字符串返回。例如,如果输入是“Hello\nWorld”,第一次调用readLine会返回“Hello”,并且会忽略换行符。所以要加上换行符
osw.flush();
System.out.println("数据已发送.....");
} catch (IOException e) {
System.out.println("服务端连接失败!!!");
throw new RuntimeException(e);
}
}
文件传输
使用try-with-resources
语句可以在括号内声明ServerSocket
或Socket
,会在try
块结束时自动关闭资源,无需显式调用close
方法。这是因为ServerSocket
类实现了AutoCloseable
接口,该接口允许资源在try
块结束时自动关闭。
//服务端
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(7878)) {
System.out.println("服务器启动成功!!!");
Socket socket = server.accept();/*server.accept()是一个阻塞方法,它会等待客户端的连接请求,并在有客户端连接时返回一个新的Socket对象,该对象代表了与客户端的连接。这个新的Socket对象可以用来与客户端进行通信,例如发送和接收数据。*/
InputStream stream = socket.getInputStream();//获取输入流
FileOutputStream fileOutputStream = new FileOutputStream("net/data.txt");//获取文件输出流,指定输出目录
byte[] bytes = new byte[1024];
int len;
while ((len = stream.read(bytes)) != -1) {
fileOutputStream.write(bytes, 0, len);
}
fileOutputStream.flush();
fileOutputStream.close();
} catch (IOException e) {
System.out.println("服务器启动失败!!!");
e.printStackTrace();
}
}
//客户端
public static void main(String[] args) {
try(Socket socket = new Socket("localhost",7878)) {
System.out.println("成功连接服务端!!!");
FileInputStream fileInputStream = new FileInputStream("test.txt");//获取文件输入流,客户端要发送的文件
OutputStream outputStream = socket.getOutputStream();
byte[] bytes = new byte[1024];
int len;
while ((len = fileInputStream.read(bytes)) != -1) {
outputStream.write(bytes,0,len);//读取文件输入流的数据并写入输出流
}
fileInputStream.close();
outputStream.flush();
} catch (IOException e) {
System.out.println("服务端连接失败!!!");
e.printStackTrace();
}
}
浏览器访问服务端
//服务端
public static void main(String[] args) {
try(ServerSocket server = new ServerSocket(8080)) {
System.out.println("服务端启动成功.....");
Socket socket = server.accept();
System.out.println("客户端已连接,IP为:" + socket.getInetAddress().getHostAddress());
InputStream stream = socket.getInputStream();
System.out.println("接收到的客户端数据为:");
while(true) {
int data = stream.read();
if(data == -1) {break;}
System.out.print((char)data);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
通过浏览器访问,在地址栏输入http://localhost:8080/,localhost
代表本地地址,8080是服务端的端口号,浏览器访问后会向服务端发送请求,但是因为服务端没写响应的部分,所以浏览器收不到响应会显示错误。