Java实现服务端和客户端的通信(文件下载)

网络编程

网络通信的介绍

  • 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据
  • 两台电脑连在一起就组成了一个计算机网络。我们通过光纤连接到电信的网关,中国电信通过海底光缆和美国电信网关连接,你就是和全世界的在线用户连着

如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数?

TCP/IP 协议

1.三次握手
客户端 服务器 发送SYN请求报文序列号:X 收到SYN请求报文 发送SYN/ACK报文,序列号:Y ;确认号:X+1 收到SYN/ACK请求报文 发送ACK报文,确认号:Y + 1 收到ACK请求报文 客户端 服务器
2.TCP/IP协议
  • TCP协议是一种以固连线为基础的协议,它提供两台计算机之间可靠的数据传送。
  • TCP可以保证从一端数据传至连接的另一端时,数据能够确实送达。
  • TCP协议适合可靠性比较高的场合,就像拨打电话。

接下来我们用简单的例子来介绍从服务器段下载文件;通信流程如下:

  1. 客户端创建Socket
  2. 服务端创建ServerSocket
  3. 客户端绑定服务器ip地址和Socket端口
  4. 服务端绑定服务器端口
  5. 客户端请求服务器链接
  6. 服务端阻塞监听客户端请求
  7. 客户端连接
  8. 服务端连接成功返回Socket
  9. 客户端输入输出流通信
  10. 服务端通过输入输出流通信
  11. 客户端关闭流
  12. 服务端关闭流
  13. 客户端关闭Socket
  14. 服务端关闭Socket和ServerSocket

首先我们建立服务端

package server;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Smain {

	public static void main(String[] args) {
		try {
			//1.服务端创建ServerSocket
			ServerSocket ssk = new ServerSocket(9090);
			while (true) {
				//2.服务端阻塞监听客户端请求
				Socket ck = ssk.accept();
				//3.创建输入输出流
				DataInputStream din = new DataInputStream(ck.getInputStream());
				DataOutputStream dout = new DataOutputStream(ck.getOutputStream());
				//读取客户端发送的信息
				int key = din.readInt();
				String fname = "03.mp4";
				switch (key) {
				case 1:
					fname = "01.mp4";
					break;
				case 2:
					fname = "02.mp4";
					break;
				}
				//读取服务器上对应的mp4文件并用输出流发送给客户端
				FileInputStream fin = new FileInputStream(fname);
				byte[] data = new byte[1024*5];
				while (true) {
					int len = fin.read(data);
					if(len == -1) {
						break;
					}
					dout.write(data, 0, len);
				}
				dout.close();
				fin.close();
				din.close();
				ck.close();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

建立客户端

package client;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Cmain {

	public static void main(String[] args) {
		try {
			Scanner input = new Scanner(System.in);
			//1.建立客户端Socket
			Socket ck = new Socket("192.168.31.13", 9090);
			//让客户端选择服务器对应的MP4文件编号
			System.out.println("请输入对应的MP4文件编号:1) 01.mp4;2) 02.mp4; 3)03.mp4;");
			int key = input.nextInt();
			//让客户输入下载地址和保存的文件名
			System.out.println("请输入保存地址以及文件名:");
			String path = input.next();
			String name = input.next();
			DataOutputStream dout = new DataOutputStream(ck.getOutputStream());
			DataInputStream din = new DataInputStream(ck.getInputStream());
			//选择的MP4文件编号发送给服务端
			dout.writeInt(key);
			//建立文件输入流保存在本地
			FileOutputStream fout = new FileOutputStream(path+"/"+name);
			byte[] data = new byte[1024*5];
			while(true) {
				int len = din.read(data);
				if(len == -1) {
					break;
				}
				System.out.println("len:"+len);
				fout.write(data, 0, len);
			}
			fout.close();
			din.close();
			dout.close();
			ck.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

这样我们可以实现简单的从服务器上下载文件的操作

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端连接服务端 Java 可以使用 Java 的 Socket 类来实现。以下是一个简单的例子: 服务端代码: ```java import java.net.*; import java.io.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(9999); System.out.println("Server started"); Socket socket = serverSocket.accept(); System.out.println("Client connected"); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String message = in.readLine(); System.out.println("Received message: " + message); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello from Server"); socket.close(); serverSocket.close(); } } ``` 客户端代码: ```java import java.net.*; import java.io.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 9999); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println("Hello from Client"); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String message = in.readLine(); System.out.println("Received message: " + message); socket.close(); } } ``` 在代码中,服务端使用 ServerSocket 类监听端口 9999,等待客户端连接。客户端使用 Socket 类连接到服务端的 IP 地址和端口号。连接成功后,客户端服务端发送一条消息,服务端接收到消息后打印出来并向客户端发送一条回复消息。最后关闭连接。 注意:以上示例代码只是演示了基本的客户端服务端通信流程,实际应用中还需要考虑并发、异常处理等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值