最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java如何利用Socket傳輸信息或文件

 更新時間:2024年08月12日 08:41:09   作者:清歌寒  
這篇文章主要介紹了Java如何利用Socket傳輸信息或文件問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

本文中的是使用TCP協議進行文件傳輸

Socket

套接字(socket)是一個抽象層,應用程序可以通過它發(fā)送或接收數據,可對其進行像對文件一樣的打開、讀寫和關閉等操作。

套接字允許應用程序將I/O插入到網絡中,并與網絡中的其他應用程序進行通信。網絡套接字是IP地址與端口的組合。

信息與文件傳輸使用C/S(Client/Server)。

步驟

  • 1、啟動服務端,等待客戶端連接。
  • 2、啟動客戶端連接服務端。
  • 3、傳輸數據。
  • 4、關閉客戶端。
  • 5、關閉服務端。

代碼

首先啟動服務端

package priv.zb.socket;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {
	
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		ServerSocket server = null;
		Socket socket = null;
		//向外界暴露一個端口9999的服務,默認IP為本機IP:127.0.0.1
		server = new ServerSocket(9999);
		//返回一個Socket對象
		socket = server.accept();
		/**
		 *
		 * 啟動服務端之后,會在 server.accept(); 方法處等待客戶端的
		 * 連接,當啟動客戶端連接上服務端之后走過此方法運行后面的代碼。
		 */
		System.out.println("接收到客戶端的連接");
		//服務端向客戶端發(fā)送消息	通過OutputStream
		//發(fā)出信息使用輸出流OutputStream,接收信息使用輸入咯InputStream
		OutputStream output = socket.getOutputStream();
		
		//傳輸字符串
//		byte[] bs = new byte[100];
//		output.write("Hello".getBytes());
		
		//傳輸文件
		String filePath = "存放文件路徑";
		File file = new File(filePath );
		byte[] fileBytes = new byte[100];		//定義文件每次發(fā)送大小
		//讀入到內存中,new 一個inputStream即可
		//文件較大,不能一次性發(fā)送完畢,因此需要循環(huán)操作
		InputStream fileIn = new FileInputStream(file);
		int len = -1;
		while((len = fileIn.read(fileBytes)) != -1) {
			output.write(fileBytes, 0, len);
		}
		//接受客戶端消息
//		InputStream in = socket.getInputStream();
//		in.read(bs);
//		System.out.println("Server接收到信息:" + new String(bs));
		System.out.println("發(fā)送成功");
		output.close();
		fileIn.close();
	}
}

之后啟動客戶端

package priv.zb.socket;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class FileClient {
	
	@SuppressWarnings("resource")
	public static void main(String[] args) throws UnknownHostException, IOException {
		//建立連接
		//客戶端訪問服務端發(fā)布的服務
		Socket socket = new Socket("192.168.0.108",9999);
		//通過InputStream接收信息
		InputStream input = socket.getInputStream();
		byte[] fileBytes = new byte[100];
		File file = new File("E:\\JAVA\\Java SE\\srcCopy.zip");
		OutputStream output = new FileOutputStream(file);
		int len = -1;
		while( (len = input.read(fileBytes)) != -1) {
			output.write(fileBytes, 0, len);
		}
		
		//客戶端接收到信息返回一個標識
//		byte[] bs = new byte[100];
//		input.read(bs);
//		System.out.println("Client 接收到消息:" + new String(bs));
		
		//客戶端向服務端發(fā)送一個消息
//		OutputStream output = socket.getOutputStream();
//		output.write("World".getBytes());
		System.out.println("接收成功!!");
		output.close();
		input.close();
	}
}

這個代碼在客戶端連接一次之后,服務端便會主動關閉。

但是在實際的使用中一般不會只使用一次服務端,將會不斷地重復連接服務端這一過程。

因此使用while(true)死循環(huán)來保持服務端的始終開啟,利用多線程來解決這一問題。

優(yōu)化

使用多線程是在服務端

服務端

package priv.zb.socket.runable;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {
	
	@SuppressWarnings("resource")
	public static void main(String[] args) throws IOException {
		//向外界暴露一個端口9999的服務,默認IP為本機IP:127.0.0.1
		ServerSocket server = new ServerSocket(9999);
		while(true) {
			Socket socket = server.accept();
			//使用構造方法傳入一個Socket對象與下載線程保持關聯
			new Thread(new MyDownload(socket)).start();
			//下載線程
			/*
			 * MyDownload download = new MyDownload(socket);
			 * //Runnable變?yōu)門hered對象 
			 * new Thread(download).start();
			 */
		}
	}
}

下載線程:MyDownload.java

package priv.zb.socket.runable;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class MyDownload implements Runnable {

	//Mydownload.java與Server之間使用Socket對象聯系
	private Socket socket;
	public MyDownload(Socket socket) {
		this.socket = socket;
	}
	@Override
	public void run() {
		//返回一個Socket對象
		OutputStream output =null;
		InputStream fileIn = null;
		try {
			System.out.println("接收到客戶端的連接");
			//服務端向客戶端發(fā)送消息	通過OutputStream
			File file = new File("E:\\JAVA\\Java SE\\src.zip");
			byte[] fileBytes = new byte[100];		//定義文件每次發(fā)送大小
			//讀入到內存中,new 一個inputStream即可
			//文件較大,不能一次性發(fā)送完畢,因此需要循環(huán)操作
			fileIn = new FileInputStream(file);
			int len = -1;
			output = socket.getOutputStream();
			while((len = fileIn.read(fileBytes)) != -1) {
				output.write(fileBytes, 0, len);
			}
			System.out.println("發(fā)送成功");
		} catch (IOException e1) {
			e1.printStackTrace();
		} finally {
			try {
				if(output != null) output.close();
				if(fileIn != null) fileIn.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

之后即可多次傳輸信息不關閉服務端。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot如何解決Mysql斷連問題

    Spring Boot如何解決Mysql斷連問題

    本篇文章主要介紹了Spring Boot如何解決Mysql斷連問題,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java實現注冊登錄與郵箱發(fā)送賬號驗證激活功能

    Java實現注冊登錄與郵箱發(fā)送賬號驗證激活功能

    這篇文章主要介紹了Java實現注冊登錄與郵箱發(fā)送賬號驗證激活功能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • springboot項目連接不上nacos配置,報‘url‘異常問題

    springboot項目連接不上nacos配置,報‘url‘異常問題

    這篇文章主要介紹了springboot項目連接不上nacos配置,報‘url‘異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • 將SpringBoot的Jar注冊成Windows服務的實現方法

    將SpringBoot的Jar注冊成Windows服務的實現方法

    當前項目有個地圖編輯器,后端用的是SpringBoot框架,外網剛好有一臺空閑的Windows服務器就直接拿來用了,將Java程序部署成Windows服務可以用WinSW (Windows Service Wrapper)來實現,文中有詳細的操作步驟,需要的朋友可以參考下
    2023-11-11
  • 使用spring+maven不同環(huán)境讀取配置方式

    使用spring+maven不同環(huán)境讀取配置方式

    這篇文章主要介紹了使用spring+maven不同環(huán)境讀取配置方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring框架的JdbcTemplate使用

    Spring框架的JdbcTemplate使用

    它是 Spring 框架中提供的一個對象,是對原始 Jdbc API 對象的簡單封裝。本文就來介紹一下Spring框架的JdbcTemplate使用,感興趣的可以了解一下
    2021-09-09
  • java實現釘釘機器人消息推送的示例代碼

    java實現釘釘機器人消息推送的示例代碼

    這篇文章主要介紹了java實現釘釘機器人消息推送的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 淺談mac下maven的安裝配置與使用

    淺談mac下maven的安裝配置與使用

    這篇文章主要介紹了淺談mac下maven的安裝配置與使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java使用Filter實現登錄驗證

    Java使用Filter實現登錄驗證

    本文主要介紹了Java使用Filter實現登錄驗證,Filter類似于門衛(wèi),你在進入之前門衛(wèi)需要盤查你,身份合法進入,身份不合法攔截,感興趣的可以了解一下
    2023-11-11
  • Java內存模型final的內存語義

    Java內存模型final的內存語義

    這篇文章主要介紹了Java內存模型final的內存語義,上篇介紹volatile的內存語義,本文講述的是final的內存語義,相比之下,final域的讀和寫更像是普通變量的訪問。下面我們一起來看看文章學校內容吧,需要的朋友可以參考一下
    2021-11-11

最新評論

资源县| 上虞市| 阳江市| 襄樊市| 蒲江县| 兰坪| 西城区| 太康县| 若尔盖县| 建德市| 武穴市| 沾化县| 浦城县| 龙口市| 鄄城县| 廊坊市| 涿鹿县| 长治市| 类乌齐县| 烟台市| 永修县| 长子县| 资阳市| 洛宁县| 图木舒克市| 泽库县| 武义县| 那曲县| 崇仁县| 会泽县| 运城市| 星子县| 库车县| 自贡市| 女性| 西林县| 花莲县| 铅山县| 兴海县| 榆树市| 聊城市|