关于socket发送数据需要注意的问题
作者:Soulic
这篇文章主要介绍了关于socket发送数据需要注意的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
socket发送数据需要注意的问题
这两天在写socket通信的时候遇到一个问题,在服务器端使用BufferedWriter.write()和BufferedWriter.flush()向客户端发送信息后,客户端使用BufferedReader.readLine()怎么也读不到数据。
后来发现是因为没有在write之后创建新的行,所以客户端的readLine()不能判断行结束,一直在等待服务器发送行结束符,就出现客户端接收不到数据的现象。
解决的方法
是在write()后newLine(),再flush()客户端就可以了。
ServerSocket server = null; try { server = new ServerSocket(AppProvider.PORT, 0); BufferedReader in; BufferedWriter out; while (true) { Socket client = server.accept(); in = new BufferedReader(new InputStreamReader(client.getInputStream())); out = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); out.flush(); try { String request = in.readLine(); String response = processMessage(request); if (response != null) { out.write(response); out.newLine(); out.flush(); } } catch (Exception e) { e.printStackTrace(); } in.close(); out.close(); client.close(); } } catch (IOException e) { e.printStackTrace(); } finally { if (server != null && !server.isClosed()) { try { server.close(); } catch (IOException e) { e.printStackTrace(); } } }
Java-socket上传 / 接收文件
Socket上传文件
//测试示例 public void upSocket(){ //Java中使用Socket进行文件上传的基本流程如下所示: //创建客户端Socket对象并连接到服务器。可以通过指定IP地址和端口号来完成连接操作。 String serverIp = "服务器IP"; // 设置服务器IP地址 int port = 8080; // 设置服务器监听的端口号 Socket clientSocket = null; InputStream inputStream = null; OutputStream outputStream = null; try { clientSocket = new Socket(serverIp, port); //获取输入/输出流对象,分别用于读取要发送的文件内容和写入从服务器返回的数据。 String filePath = "要上传的文件路径"; File fileToSend = new File(filePath); if (!fileToSend.exists()) { throw new IllegalArgumentException("指定的文件不存在!"); } inputStream = new FileInputStream(filePath); // 设置要上传的文件路径 outputStream = clientSocket.getOutputStream(); //将文件内容逐段读取后写入输出流,直到文件结尾。 byte[] buffer = new byte[4096]; // 设置每次读取的字节大小 int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.flush(); // 确保数据被全部写入输出流 } catch (IOException e) { e.printStackTrace(); }finally { //关闭输入/输出流和Socket连接。 try { inputStream.close(); outputStream.close(); clientSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
Socket接收文件
public static void main(String[] args) throws IOException { int portNumber = 8080; ServerSocket serverSocket = null; InputStream inputStream = null; FileOutputStream fileOutputStream = null; try { serverSocket = new ServerSocket(portNumber); System.out.println("正在监听端口" + portNumber + "..."); Socket clientSocket = serverSocket.accept(); System.out.println("客户端已连接!"); inputStream = clientSocket.getInputStream(); fileOutputStream = new FileOutputStream("D:\\test\\received_file.txt"); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, bytesRead); } } catch (IOException e) { e.printStackTrace(); }finally { fileOutputStream.close(); inputStream.close(); serverSocket.close(); serverSocket.close(); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。