[心得] java socket短连接实现客户端和服务器的文件发送与存储

 一、java socket短连接的基本概念

1.socket套接字

TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。

即TCP/IP实现的套接字,是应用层调用下层服务的接口。

备注:若接口被占用,打开cmd窗口,输入netstat -ano,查找端口号对应的PID;打开任务管理器,详细信息,结束对应PID的进程,即可。

 

2.短连接:连接->传输数据->关闭连接

短连接(short connnection)是相对于长连接而言的概念,指的是在数据传送过程中,只在需要发送数据时,才去建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。

优点:不需要长期占用通道,对于业务频率不高的场合,能节省通道的使用。

缺点:需要在每次发送业务时,都要建立一次连接,连接建立的过程开销大。

最常见的短连接例子就是HTTP协议。


长连接 :连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接 
长连接指建立socket连接后不管是否使用都保持连接,但安全性较差。 

 

JAVA如何实现短连接:(我理解为socket相当于一个快递点或可以说是中转站)

①发送的方法:直接获得socket的OutputStream流,然后用write方法,flush方法即可。

②接收的方法:常用的两个类是InputStream和BufferedInputStream。

 

二、实现文件发送与存储的步骤

1.要求: 传输文件:即将客户端的文件传输到服务器 

2.步骤: 

客户端

①创建客户端Socket对象,指定服务器地址和端口;

②创建socket输出流(方便往socket写数据): 

    os = socket.getOutputStream(); 

③读取文件读到byte[]数组中:byte[] bs = new byte[1024];

    is = new  FileInputStream(new File("D:\\新建文本文档1.txt"));

    再将数组中的数据通过os写入socket:

    os.write(bs,0,num);

服务器端

①创建服务器端ServerSocket对象,指定端口:

    serverSocket = new ServerSocket(9999);

②调用accept()监听(即等待客户端的连接)来接收一个socket:

    socket = serverSocket.accept();

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是Java实现socket连接连接服务端、客户端的代码实现及详解: ## 长连接 ### 服务端代码实现 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8888); System.out.println("服务端已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户端" + socket.getInetAddress().getHostAddress() + "已连接"); new Thread(new ServerThread(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } static class ServerThread implements Runnable { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); while (true) { String message = br.readLine(); if (message == null) { break; } System.out.println("客户端" + socket.getInetAddress().getHostAddress() + ": " + message); pw.println("服务端已收到消息:" + message); } } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } } ``` 在服务端中,我们首先创建一个ServerSocket对象,指定端口号为8888,然后通过accept()方法来等待客户端连接请求。当客户端连接成功后,我们创建一个新的线程来处理客户端的请求。在线程中,我们通过BufferedReader和PrintWriter来进行数据的读写操作。当客户端发送消息后,服务端会进行回复,直到收到客户端的断开连接请求。 ### 客户端代码实现 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args) { Socket socket = null; BufferedReader br = null; PrintWriter pw = null; Scanner scanner = new Scanner(System.in); try { socket = new Socket("127.0.0.1", 8888); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(socket.getOutputStream(), true); while (true) { String message = scanner.nextLine(); pw.println(message); String response = br.readLine(); System.out.println("服务端回复:" + response); } } catch (IOException e) { e.printStackTrace(); } finally { if (pw != null) { pw.close(); } if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在客户端中,我们首先创建一个Socket对象,指定IP地址和端口号为服务端的IP地址和端口号,然后通过BufferedReader和PrintWriter来进行数据的读写操作。当客户端发送消息后,服务端会进行回复,直到客户端输入exit后,客户端发送断开连接请求,服务端会关闭连接。 ## 连接 ### 服务端代码实现 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(8888); System.out.println("服务端已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户端" + socket.getInetAddress().getHostAddress() + "已连接"); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter pw = new PrintWriter(socket.getOutputStream(), true); String message = br.readLine(); System.out.println("客户端" + socket.getInetAddress().getHostAddress() + ": " + message); pw.println("服务端已收到消息:" + message); pw.close(); br.close(); socket.close(); } } catch (IOException e) { e.printStackTrace(); } finally { if (serverSocket != null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在服务端中,我们依然是创建一个ServerSocket对象,指定端口号为8888,然后通过accept()方法来等待客户端连接请求。当客户端连接成功后,服务端会通过BufferedReader来读取客户端发送的消息,然后通过PrintWriter来回复客户端。由于是连接,所以服务端会在处理完客户端请求后立即关闭连接。 ### 客户端代码实现 ```java import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; public class Client { public static void main(String[] args) { Socket socket = null; BufferedReader br = null; PrintWriter pw = null; Scanner scanner = new Scanner(System.in); try { socket = new Socket("127.0.0.1", 8888); br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(socket.getOutputStream(), true); System.out.println("请输入消息:"); String message = scanner.nextLine(); pw.println(message); String response = br.readLine(); System.out.println("服务端回复:" + response); } catch (IOException e) { e.printStackTrace(); } finally { if (pw != null) { pw.close(); } if (br != null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } } ``` 在客户端中,我们首先创建一个Socket对象,指定IP地址和端口号为服务端的IP地址和端口号,然后通过BufferedReader和PrintWriter来进行数据的读写操作。当客户端发送消息后,服务端会进行回复,客户端会读取服务端的回复,然后关闭连接

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值