一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java 網絡編程之TCP通信和簡單的文件上傳功能實例

java 網絡編程之TCP通信和簡單的文件上傳功能實例

2021-03-23 14:11駿馬金龍 Java教程

下面小編就為大家分享一篇java 網絡編程之TCP通信和簡單的文件上傳功能實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

TCP通信需要明確的幾點:

tcp通信是面向連接的,需要先啟動服務端,再啟動客戶端。

客戶端和服務端都要創建套接字對象,客戶端需要指定服務端套接字(ip+port),而服務端必須指定服務端口。

?
1
2
Socket client_socket = new Socket("192.168.100.17",8888); //客戶端套接字(Socket類的套接字為已連接套接字)
ServerSocket listen_socket = new ServerSocket(8888);  //服務端套接字,此時為監聽套接字(已經bind()地址和端口了)

服務端需要使用accept()方法將監聽套接字轉變為已連接套接字。這個監聽套接字可以生成多個已連接套接字,這樣連接后還能監聽其他客戶端的請求。因此,這里應該使用多線程實現并發訪問。獲得了已連接套接字,就可以獲取很多客戶端的信息,例如客戶端的ip地址,發送請求的端口等。

?
1
2
3
Socket server_scoket = socket.accept();
Socket server_scoket2 = socket.accept();
Socket server_scoket3 = socket.accept();

服務端要實現并發連接,大致使用如下代碼:其中ThreadTask是線程任務對象。

?
1
2
3
4
5
6
7
public static void main(String[] args) throws IOException {
 ServerSocket listen_sock = new ServerSocket(8888); //監聽套接字只需創建一個,因此在任務之外
 while (true) { //每建立一個連接,就開啟一個線程
  Socket conn_sock = listen_sock.accept(); //沒有新連接進來時,main主線程阻塞在此
  new Thread(new ThreadTask(conn_sock)).start();
 }
}

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

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

服務端應主動關閉已連接套接字,至于監聽套接字則在合適的地方關閉。

服務端應該循環不斷地負責接收。

簡單的Client端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
 public static void main(String[] args) {
 // 1.創建客戶端套接字
 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.輸出數據
  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();
  }
  }
 }
 }
}

簡單的Server端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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.創建監聽套接字
 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.根據已連接套接字,獲取輸入流,讀取客戶端發送的數據
  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.關閉已連接套接字
  server_sock.close();
  } catch (IOException e) {
  e.printStackTrace();
  }
 }
 }
}

以下是tcp實現文件上傳功能:

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

服務端也同樣有三流:套接字的輸入、輸出流,寫入上傳目標文件的輸出流。

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

服務端為了能為多人提供上傳功能,需要使用多線程實現并發連接。

Client端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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.字節輸入流讀取本地文件數據,并使用套接字的輸出流發送出去
   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.標記輸出流到結尾
   send_sock.shutdownOutput();
   // 5.接收服務端的反饋數據,如上傳成功,上傳失敗等
   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端:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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); //監聽套接字只需創建一個,因此在任務之外
  while (true) { //每建立一個連接,就開啟一個線程
   Socket conn_sock = listen_sock.accept(); //沒有新連接進來時,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.文件的上傳位置,即輸出目標,以ip命名。如果文件已存在,則使用括號加數字新建文件,如"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.讀取數據并寫入目標文件
   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 網絡編程之TCP通信和簡單的文件上傳功能實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/f-ck-need-u/p/8250952.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成年人视频在线免费观看 | 久久成人a毛片免费观看网站 | 狠狠的撞进去嗯啊h女强男视频 | 国产精品一区二区三区久久 | 18日本xxxxxxⅹxx96| 全肉一女n男np高h双龙养成 | 久久99亚洲热最新地址获取 | 激情艳妇 | 亚洲AVAV天堂AV在线网爱情 | 天天亚洲综合 | 白鹿扒开内裤露出尿孔 | 亚洲天堂三区 | 免费观看视频在线播放 | 欧美亚洲激情在线 | 女生被爆操 | 女教师被女同学调教成脚奴 | 草莓香蕉绿巨人丝瓜榴莲18 | 羞羞私人影院可以直接免费观影吗 | 亚洲国产第一 | 美日韩一区二区三区 | 成人一级黄色大片 | 国产精品va在线观看手机版 | 国产欧美精品一区二区三区四区 | 91久久福利国产成人精品 | 日日爽日日操 | 99久久国产综合精麻豆 | 日韩丝袜在线观看 | 青青草99热久久 | 亚洲福利区 | 黄网久久| 色天天综合网色鬼综合 | 2022av小四郎的最新地址 | 国产私拍精品88福利视频 | 日韩人成 | 91在线高清视频 | 日本无遮挡吸乳视频看看 | 欧美最猛性xxxxx短视频 | 魔法满屋免费观看完整版中文 | 成年人免费在线播放 | 精品久久久久久久高清 | 免费一级毛片在线播放放视频 |