开发者

关于socket发送数据需要注意的问题

开发者 https://www.devze.com 2024-08-12 12:24 出处:网络 作者: Soulic
目录socket发送数据需要注意的问题解决的方法Java-socket上传 / 接收文件Socket上传文件Sohttp://www.devze.comcket接收文件总结socket发送数据需要注意的问题
目录
  • socket发送数据需要注意的问题
    • 解决的方法
  • Java-socket上传 / 接收文件
    • Socket上传文件
    • Sohttp://www.devze.comcket接收文件
  • 总结

    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();
    	} finalljavascripty {
    		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);
      javascript      }
            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.clospythone();
            inputStream.close();
            serverSocket.close();
            serverSocket.close();
        }
    }
    

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消