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

java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例

 更新時(shí)間:2018年01月18日 08:53:15   作者:駿馬金龍  
下面小編就為大家分享一篇java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

TCP通信需要明確的幾點(diǎn):

tcp通信是面向連接的,需要先啟動(dòng)服務(wù)端,再啟動(dòng)客戶端。

客戶端和服務(wù)端都要?jiǎng)?chuàng)建套接字對(duì)象,客戶端需要指定服務(wù)端套接字(ip+port),而服務(wù)端必須指定服務(wù)端口。

Socket client_socket = new Socket("192.168.100.17",8888); //客戶端套接字(Socket類的套接字為已連接套接字)
ServerSocket listen_socket = new ServerSocket(8888);  //服務(wù)端套接字,此時(shí)為監(jiān)聽套接字(已經(jīng)bind()地址和端口了)

服務(wù)端需要使用accept()方法將監(jiān)聽套接字轉(zhuǎn)變?yōu)橐堰B接套接字。這個(gè)監(jiān)聽套接字可以生成多個(gè)已連接套接字,這樣連接后還能監(jiān)聽其他客戶端的請(qǐng)求。因此,這里應(yīng)該使用多線程實(shí)現(xiàn)并發(fā)訪問。獲得了已連接套接字,就可以獲取很多客戶端的信息,例如客戶端的ip地址,發(fā)送請(qǐng)求的端口等。

Socket server_scoket = socket.accept();
Socket server_scoket2 = socket.accept();
Socket server_scoket3 = socket.accept();

服務(wù)端要實(shí)現(xiàn)并發(fā)連接,大致使用如下代碼:其中ThreadTask是線程任務(wù)對(duì)象。

public static void main(String[] args) throws IOException {
 ServerSocket listen_sock = new ServerSocket(8888); //監(jiān)聽套接字只需創(chuàng)建一個(gè),因此在任務(wù)之外
 while (true) { //每建立一個(gè)連接,就開啟一個(gè)線程
  Socket conn_sock = listen_sock.accept(); //沒有新連接進(jìn)來時(shí),main主線程阻塞在此
  new Thread(new ThreadTask(conn_sock)).start();
 }
}

客戶端需要根據(jù)已連接套接字獲取輸出流,服務(wù)端需要根據(jù)套接字獲取輸入流。當(dāng)然,既然有了已連接套接字,那么獲取無論哪一端都可以獲取到輸入流、輸出流。

OutputStream send_stream = client_socket.getOutputStream(); //客戶端獲取輸出流
InputStream recv_stream = server_socket.getInputStream();

服務(wù)端應(yīng)主動(dòng)關(guān)閉已連接套接字,至于監(jiān)聽套接字則在合適的地方關(guān)閉。

服務(wù)端應(yīng)該循環(huán)不斷地負(fù)責(zé)接收。

簡(jiǎn)單的Client端:

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
 public static void main(String[] args) {
 // 1.創(chuàng)建客戶端套接字
 Socket c_sock = null;
 OutputStream client_outstream = null;
 try {
  c_sock = new Socket("192.168.0.124",8888);
  // 2.獲取輸出流
  client_outstream = c_sock.getOutputStream();
  // 3.輸出數(shù)據(jù)
  client_outstream.write("Hello,i'm coming".getBytes());
 } catch (IOException e) {
  e.printStackTrace();
 } finally {
  if(c_sock != null){
  try{
   c_sock.close();
  } catch(IOException e) {
   e.printStackTrace();
  }
  }
 }
 }
}

簡(jiǎn)單的Server端:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
 public static void main(String[] args) {
 // 1.創(chuàng)建監(jiān)聽套接字
 ServerSocket listen_sock = null;
 try {
  listen_sock = new ServerSocket(8888);
 } catch(IOException i) {
  i.printStackTrace();
 }
 Socket server_sock = null;
 InputStream in_sock = null;
 while (true) {
  try {
  // 2.和客戶端建立連接,生成已連接套接字,并獲取客戶端ip地址
  server_sock = listen_sock.accept();
  String client_ip = server_sock.getInetAddress().getHostAddress();
  System.out.println("Client: " + client_ip + " connected");
  // 3.根據(jù)已連接套接字,獲取輸入流,讀取客戶端發(fā)送的數(shù)據(jù)
  in_sock = server_sock.getInputStream();
  BufferedReader bufr = new BufferedReader(new InputStreamReader(in_sock));
  String line = null;
  while ((line = bufr.readLine()) != null) {
   System.out.println(line);
  }
  // 4.關(guān)閉已連接套接字
  server_sock.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
 }
 }
}

以下是tcp實(shí)現(xiàn)文件上傳功能:

客戶端除了套接字的輸出流,還有讀取本地文件的輸入流,還有套接字的輸入流來讀取來自服務(wù)端的反饋信息。

服務(wù)端也同樣有三流:套接字的輸入、輸出流,寫入上傳目標(biāo)文件的輸出流。

客戶端讀取本地文件的所有數(shù)據(jù)后,需要使用套接字的shutdownOutput()來通知服務(wù)端套接字的輸出流已到末尾。

服務(wù)端為了能為多人提供上傳功能,需要使用多線程實(shí)現(xiàn)并發(fā)連接。

Client端:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
public class UploadClient {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String server_addr = "192.168.0.124";
  int server_port = 8888;
  Socket send_sock = null;
  FileInputStream local_read = null;
  try {
   // 1.客戶端套接字
   send_sock = new Socket(server_addr, server_port);
   // 2.獲取連接管道的輸出流
   OutputStream send_stream = send_sock.getOutputStream();
   // 3.字節(jié)輸入流讀取本地文件數(shù)據(jù),并使用套接字的輸出流發(fā)送出去
   local_read = new FileInputStream("d:/myjava/net/SQL.docx");
   byte[] buf = new byte[1024];
   int len = 0;
   while ((len = local_read.read(buf)) != -1) {
    send_stream.write(buf, 0, len);
   }
   // 4.標(biāo)記輸出流到結(jié)尾
   send_sock.shutdownOutput();
   // 5.接收服務(wù)端的反饋數(shù)據(jù),如上傳成功,上傳失敗等
   InputStream recv_stream = send_sock.getInputStream();
   BufferedReader ack_recv = new BufferedReader(new InputStreamReader(recv_stream));
   String line = null;
   while ((line = ack_recv.readLine()) != null) {
    System.out.println(line);
   }
  } catch (IOException i) {
   i.printStackTrace();
  } finally {
   if (send_sock != null) {
    try {
     send_sock.close();
     local_read.close();
    } catch (IOException i1) {
     i1.printStackTrace();
    }
   }
   if (local_read != null) {
    try {
     local_read.close();
    } catch (IOException i2) {
     i2.printStackTrace();
    }
   }
  }
 }
}

Server端:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
 public static void main(String[] args) throws IOException {
  ServerSocket listen_sock = new ServerSocket(8888); //監(jiān)聽套接字只需創(chuàng)建一個(gè),因此在任務(wù)之外
  while (true) { //每建立一個(gè)連接,就開啟一個(gè)線程
   Socket conn_sock = listen_sock.accept(); //沒有新連接進(jìn)來時(shí),main主線程阻塞在此
   new Thread(new Uploader(conn_sock)).start();
  }
 }
}
class Uploader implements Runnable {
 private File dest_dir = new File("d:/temp"); // 上傳目錄
 private Socket conn_sock = null; // 連接套接字
 InputStream recv_stream = null;
 FileOutputStream dest_stream = null;
 Uploader(Socket conn_sock) throws IOException {
  this.conn_sock = conn_sock;
 }
 public void run() {
  try {
   if (!dest_dir.exists()) {
    dest_dir.mkdirs();
   }
   // 1.獲取連接管道的輸入流
   recv_stream = conn_sock.getInputStream();
   // 客戶端ip
   String client_ip = conn_sock.getInetAddress().getHostAddress();
   System.out.println(client_ip + ".....connected");
   // 2.文件的上傳位置,即輸出目標(biāo),以ip命名。如果文件已存在,則使用括號(hào)加數(shù)字新建文件,如"192.168.100.23(1).txt"
   File dest_file = new File(dest_dir, client_ip + ".docx");
   int count = 1;
   while (dest_file.exists()) {
    dest_file = new File(dest_dir, client_ip + "(" + count + ")" + ".docx");
    count++;
   }
   // 3.讀取數(shù)據(jù)并寫入目標(biāo)文件
   dest_stream = new FileOutputStream(dest_file);
   byte[] buf = new byte[1024];
   int len = 0;
   while ((len = recv_stream.read(buf)) != -1) {
    dest_stream.write(buf, 0, len);
   }
   // 4. 向客戶端反饋信息
   OutputStream ack_send = conn_sock.getOutputStream();
   byte[] text = "upload successful!".getBytes();
   ack_send.write(text);
  } catch (IOException e1) {
   e1.printStackTrace();
  } finally {
   if (dest_stream != null) {
    try {
     dest_stream.close();
    } catch (IOException i) {
     i.printStackTrace();
    }
   }
   if (conn_sock != null) {
    try {
     conn_sock.close();
    } catch (IOException i) {
     i.printStackTrace();
    }
   }
  }
 }
}

以上這篇java 網(wǎng)絡(luò)編程之TCP通信和簡(jiǎn)單的文件上傳功能實(shí)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • JPA中JpaRepository接口的使用方式

    JPA中JpaRepository接口的使用方式

    這篇文章主要介紹了JPA中JpaRepository接口的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring Batch批處理框架使用解析

    Spring Batch批處理框架使用解析

    這篇文章主要介紹了Spring Batch批處理框架使用解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java的繼承原理與實(shí)現(xiàn)方法詳解

    java的繼承原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了java的繼承原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Java繼承的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • java開源好用的簡(jiǎn)繁轉(zhuǎn)換類庫(kù)推薦

    java開源好用的簡(jiǎn)繁轉(zhuǎn)換類庫(kù)推薦

    這篇文章主要為大家介紹了java開源好用的簡(jiǎn)繁轉(zhuǎn)換類庫(kù)推薦,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • Java軟件設(shè)計(jì)模式之橋接模式詳解

    Java軟件設(shè)計(jì)模式之橋接模式詳解

    這篇文章主要介紹了Java軟件設(shè)計(jì)模式之橋接模式詳解,橋接模式也叫做橋梁模式,結(jié)構(gòu)型設(shè)計(jì)模式的一種,顧名思義,就是用來連接兩個(gè)部分,為被分離了的抽象部分和實(shí)現(xiàn)部分搭橋,需要的朋友可以參考下
    2023-07-07
  • Java設(shè)計(jì)模式之工廠模式實(shí)現(xiàn)方法詳解

    Java設(shè)計(jì)模式之工廠模式實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之工廠模式實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了工廠模式的分類、原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-12-12
  • 詳解如何將springboot項(xiàng)目導(dǎo)出成war包

    詳解如何將springboot項(xiàng)目導(dǎo)出成war包

    這篇文章主要介紹了詳解如何將springboot項(xiàng)目導(dǎo)出成war包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Java實(shí)現(xiàn)從字符串中找出數(shù)字字符串的方法小結(jié)

    Java實(shí)現(xiàn)從字符串中找出數(shù)字字符串的方法小結(jié)

    這篇文章主要介紹了Java實(shí)現(xiàn)從字符串中找出數(shù)字字符串的方法,結(jié)合實(shí)例形式總結(jié)分析了Java查找數(shù)字字符串的常用技巧,需要的朋友可以參考下
    2016-03-03
  • Java和C++通過new創(chuàng)建的對(duì)象有何區(qū)別?

    Java和C++通過new創(chuàng)建的對(duì)象有何區(qū)別?

    Java和C++都是面向?qū)ο蟮木幊陶Z(yǔ)言,然而Java和C++在創(chuàng)建對(duì)象時(shí)卻存在不同的方式,由于方式的不同導(dǎo)致在內(nèi)存中管理的不同。這篇文章主要給大家介紹了關(guān)于Java和C++通過new創(chuàng)建對(duì)象區(qū)別的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-11-11
  • Java關(guān)于桶排序的知識(shí)點(diǎn)總結(jié)

    Java關(guān)于桶排序的知識(shí)點(diǎn)總結(jié)

    這篇文章給大家總結(jié)了關(guān)于JAVA中J桶排序的相關(guān)知識(shí)點(diǎn)和用法分享,有興趣的讀者跟著學(xué)習(xí)下。
    2018-04-04

最新評(píng)論

遂溪县| 紫阳县| 壤塘县| 凉城县| 乐东| 襄垣县| 宁波市| 新民市| 合山市| 科技| 铅山县| 拜城县| 景泰县| 江北区| 新河县| 铜梁县| 渭源县| 东宁县| 漠河县| 新郑市| 太康县| 宜良县| 肥乡县| 伊宁县| 加查县| 玉树县| 宁强县| 开封市| 抚松县| 乌拉特中旗| 亳州市| 西丰县| 海原县| 邵阳市| 旌德县| 勐海县| 泌阳县| 清河县| 天峨县| 乐平市| 磴口县|