我想制作一個 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();
}
}
當我嘗試將資料從我的電腦發送到我的電腦時它有效(如果這有意義)但是當我嘗試從另一臺未本地連接到我的電腦發送資料時它不起作用。
如果可能的話,我想在不必激活埠轉發的情況下進行此操作。
任何幫助表示贊賞。
uj5u.com熱心網友回復:
您可以通過簡單地讀取構成它們的位元組并通過網路傳輸它們來發送任何型別的資訊/媒體-> 以同樣的方式,您將文本檔案讀入輸入流,然后通過套接字通過網路傳輸。
使用此方法,您可以更好地控制資料,從而能夠執行資料壓縮、加密等操作。
發送影像 -> 代碼示例:
import java.io.File;
import java.io.FileInputStream;
import java.net.Socket;
public class Main {
// Example sizes (Do not use this as an actual size - Choose your own)
private static final int CHUNK_SIZE = 60_000;
public static void main(String[] args) throws Exception {
Socket socket = new Socket("127.0.0.1", 21);
// Buffers the file bytes
byte[] buffer = new byte[CHUNK_SIZE];
int currentChunk = 0;
// The image file
File file = new File("bloodhound.png");
FileInputStream inStream = new FileInputStream(file);
int currentlyRead = 0;
// Use this methods wisely (Or use others)! This is just a quick example without any checks.
while (currentlyRead < inStream.available()) {
currentlyRead = inStream.readNBytes(buffer, CHUNK_SIZE * currentChunk , CHUNK_SIZE);
socket.getOutputStream().write(buffer, 0, CHUNK_SIZE);
}
inStream.close();
socket.close();
}
}
這段代碼只是一個例子,在現實生活中,這個系統真的很糟糕。
注意:您還可以使用 Java 或其他工具提供的類來操作和處理影像檔案。
uj5u.com熱心網友回復:
您也可以用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");
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/314074.html
