【问题标题】:How to send photos from a computer to another (non locally) using JAVA如何使用 JAVA 将照片从计算机发送到另一台(非本地)
【发布时间】:2021-12-02 17:27:02
【问题描述】:

我想制作一个 java 程序,将使用网络摄像头拍摄的照片从一台计算机发送到另一台未连接到 LAN 中的计算机。

我能够让程序拍照并将它们转换为文件,但我无法成功将它们发送到另一台计算机。

我不一定要发送照片,而是发送任何形式的数据。我是这种方法的新手,所以我可能会犯很多错误,因为我不确定它应该如何工作。

到目前为止我尝试过的代码:

客户端(我要从中发送数据的计算机,它应该截屏并将其发送到服务器):

public class GreetingClient
{
    Image newimg;
    static BufferedImage bimg;
    byte[] bytes;

    public static void main(String [] args)
    {
        String serverName = "127.0.0.1";//tried "localhost" and my actual ip adress as well.
        int port = 6066;
        try
        {
            Socket client = new Socket(serverName, port);
            Robot bot;
            bot = new Robot();
            bimg = bot.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
            ImageIO.write(bimg,"JPG",client.getOutputStream());
            client.close();
        } catch(IOException | AWTException e) {
            e.printStackTrace();
        }
    }
}

服务器代码(应该接收数据的计算机):

public class Main extends Thread
{
    private ServerSocket serverSocket;
    Socket server;

    public Main(int port) throws IOException, SQLException, ClassNotFoundException, Exception
    {
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(180000);
    }

    public void run()
    {
        while(true)
        {
            try
            {
                server = serverSocket.accept();
                JFrame frame = new JFrame();
                BufferedImage img=ImageIO.read(ImageIO.createImageInputStream(server.getInputStream()));
                frame.getContentPane().add(new JLabel(new ImageIcon(img)));
                frame.setVisible(true);
                frame.pack();

            }
            catch(SocketTimeoutException st)
            {
                System.out.println("Socket timed out!");
                break;
            }
            catch(IOException e)
            {
                e.printStackTrace();
                break;
            }
            catch(Exception ex)
            {
                ex.printStackTrace();
            }
        }
    }

    public static void main(String [] args) throws IOException, SQLException, ClassNotFoundException, Exception
    {
        Thread t = new Main(6066);
        t.start();
    }
}

当我尝试将数据从我的电脑发送到我的电脑时它可以工作(如果这有意义的话)但是当我尝试从另一台没有本地连接到我的电脑上发送数据时它不起作用。

如果可能的话,我想在不激活端口转发的情况下做到这一点。

感谢任何帮助。

【问题讨论】:

  • 定义“它不起作用”。
  • 做端口转发。严重地。您必须使用端口转发将一台家用计算机连接到另一台...如果您更愿意花钱,可以租用没有端口转发的“虚拟专用服务器”,但要花钱。
  • @user253751 谢谢你的 VPS 想法,我正在考虑买一个 VPS 但我不太确定如何用 java 编码,我想我会做一些研究哈哈跨度>
  • @user207421 by "doesn't work" 我的意思是它根本没有连接到服务器,给出的异常是:java.net.ConnectException: Connection denied: connect
  • @eddie 它是一台计算机,可能运行带有 ssh 访问权限的 linux,所以如果您能够使用 ssh 在 linux 计算机上安装 java - 这与仅使用命令提示符执行此操作几乎相同- 就是这样

标签: java sockets networking server client


【解决方案1】:

您也可以用java编写一个简单的客户端-服务器聊天应用程序,然后将转换后的JPG消息发送到例如Base64。然后,当收到解码它们。所以开始会是写聊天应用,然后写新的功能来自动将 JPG 转换为 Base64 并在窗口中显示图像:

//服务器:

import java.io.*;  
import java.net.*;  
public class MyServer {  
public static void main(String[] args){  
try{  
ServerSocket ss=new ServerSocket(3456);  
Socket s=ss.accept();//establishes connection   
DataInputStream dis=new DataInputStream(s.getInputStream());  
String  str=(String)dis.readUTF();  
System.out.println("message= "+str);  
ss.close();  
}catch(Exception e){System.out.println(e);}  
}  
}  

//客户:

import java.io.*;  
import java.net.*;  
public class MyClient {  
public static void main(String[] args) {  
try{      
Socket s=new Socket("localhost",3456);  
DataOutputStream dout=new DataOutputStream(s.getOutputStream());  
dout.writeUTF("Hello Server");  
dout.flush();  
dout.close();  
s.close();  
}catch(Exception e){System.out.println(e);}  
}  
} 

//图像显示:

import java.awt.*;  
import javax.swing.JFrame;  
  
public class MyCanvas extends Canvas{  
      
    public void paint(Graphics g) {  
  
        Toolkit t=Toolkit.getDefaultToolkit();  
        Image i=t.getImage("p3.gif");  
        g.drawImage(i, 120,100,this);  
          
    }  
        public static void main(String[] args) {  
        MyCanvas m=new MyCanvas();  
        JFrame f=new JFrame();  
        f.add(m);  
        f.setSize(400,400);  
        f.setVisible(true);  
    }  
  
}  

//转换:

public static void main(String[] args) throws Exception{
 
           File f =  new File("/opt/myImage.jpg");
             String encodstring = encodeFileToBase64Binary(f);
             System.out.println(encodstring);
       }
 
       private static String encodeFileToBase64Binary(File file) throws Exception{
            FileInputStream fileInputStreamReader = new FileInputStream(file);
            byte[] bytes = new byte[(int)file.length()];
            fileInputStreamReader.read(bytes);
            return new String(Base64.encodeBase64(bytes), "UTF-8");
        }

【讨论】:

  • 谢谢,问题是文件转换之类的对我来说不是什么大问题,我不知道如何在非本地发送文件。它适用于“localhost”,但仅适用于我的机器,当我从另一台未连接 LAN 的机器上尝试时,它不起作用。
  • 您确定防火墙等允许连接吗?我在 java 中的聊天应用程序中遇到了同样的问题,完全关闭防火墙有帮助
  • 我已经尝试过了,但没有帮助
  • 这里有一些基本的 Java I/O 编码错误。无需 base-64 编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-22
  • 2019-06-15
相关资源
最近更新 更多