java網路程式設計二:伺服器處理多個使用者請求的解決方案(返回多個使用者輸入的資訊)
1、用多個執行緒來同時為多個客戶提供服務,這是提高伺服器的併發效能的最常用的手段,那麼怎樣來為多個使用者提供服務呢?
主要有三種方法:
2、為了更清楚理解伺服器到底是怎麼工作的,下面用第一種方式來處理多個使用者請求。如果想用第二、第三方式可以參考Touch的部落格:
下面的示例中客戶端輸入資訊,伺服器端回覆相同的資訊,可以同時開啟多個客戶端,同時輸入資訊,原始碼如下:
伺服器端程式碼:
package demo.net;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 伺服器返回使用者輸入的資訊, 為多個使用者提供服務:為每個客戶分配一個工作執行緒
*/
public class ChatServers {
private int port = 8189;// 預設伺服器埠
public ChatServers() {
}
// 建立指定埠的伺服器
public ChatServers(int port) {
this.port = port;
}
public void service() {
int i=0;
try {
// 建立伺服器連線,設定客戶連線請求佇列的長度
ServerSocket server = new ServerSocket(port,3);
while (true) {
// 等待客戶連線
Socket socket = server.accept();
i++;
System.out.println("第"+i+"個客戶連線成功!");
new Thread(new ServerThread(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ChatServers().service();
}
}
class ServerThread implements Runnable {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
// 任務是為一個使用者提供服務
@Override
public void run() {
try {
try {
// 讀取客戶端傳過來資訊的DataInputStream
DataInputStream in = new DataInputStream(socket
.getInputStream());
// 向客戶端傳送資訊的DataOutputStream
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
while (true) {
// 讀取來自客戶端的資訊
String accpet = in.readUTF();
out.writeUTF("伺服器:" + accpet);
}
} finally {// 建立連線失敗的話不會執行socket.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客戶端程式碼:
package demo.net;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
/**
* 注意用到的輸入輸出流DataInputStream和DataOutputStream,成對出現,最好用位元組流
*/
// 客戶端類
public class ChatClients {
private String host = "localhost";// 預設連線到本機
private int port = 8189;// 預設連線到埠8189
public ChatClients() {
}
// 連線到指定的主機和埠
public ChatClients(String host, int port) {
this.host = host;
this.port = port;
}
public void chat() {
try {
// 連線到伺服器
Socket socket = new Socket(host, port);
try {
// 讀取伺服器端傳過來資訊的DataInputStream
DataInputStream in = new DataInputStream(socket
.getInputStream());
// 向伺服器端傳送資訊的DataOutputStream
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
// 裝飾標準輸入流,用於從控制檯輸入
Scanner scanner = new Scanner(System.in);
while (true) {
String send = scanner.nextLine();
// 把從控制檯得到的資訊傳送給伺服器
out.writeUTF(send);
// 讀取來自伺服器的資訊
String accpet = in.readUTF();
System.out.println(accpet);
}
} finally {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new ChatClients().chat();
}
}
執行結果:
相關文章
- 多個網路請求的介面設計
- Node.js如何處理多個請求?Node.js
- Android多個EditText輸入效果解決方案Android
- 淺談如何在專案中處理頁面中的多個網路請求
- jQuery:在一個回撥中處理多個請求jQuery
- 頁面無法輸入多個空格解決方案
- 多個網路請求中GCD訊號量的使用GC
- AngularJS中的$http快取以及處理多個$http請求AngularJSHTTP快取
- 執行緒安全-一個VC下多個網路請求執行緒
- Android 多使用者多快取的簡單處理方案Android快取
- java TCP入門程式設計(檔案傳送、服務端接收多個客戶端請求)JavaTCP程式設計服務端客戶端
- Java後端請求想接收多個物件入參的資料方法Java後端物件
- QTP測試多個Windows應用程式的解決方案QTWindows
- Laravel 路由匹配多個請求Laravel路由
- 檢視AFnetworking網路請求時伺服器返回的頭部資訊伺服器
- 微信網頁授權登入回撥多個二級域名站的處理方法網頁
- 由使用者輸入系列對稱的點的解決方案
- mssql單個使用者與多個使用者SQL
- 解決jQuery多個事件處理函式執行的現象jQuery事件函式
- linux如何處理多連線請求?Linux
- 請教多專案的設計方案
- iOS 多網路請求的執行緒安全iOS執行緒
- iOS for 迴圈內網路請求的處理iOS內網
- 請教設計一個流程多變的模式模式
- 多個請求統一更新介面
- java 請求HTTP返回json集合,物件處理方式JavaHTTPJSON物件
- nginx 如何處理一個請求Nginx
- 併發請求導致的業務處理安全風險及解決方案求導
- WebApi系列~基於單請求封裝多請求的設計WebAPI封裝
- 處理多個異常
- js網路請求 短時間發出多個 展示最新響應JS
- .NET處理HTTP請求——摘自網路HTTP
- 基於 Laravel Passport API 的多使用者多欄位認證系統(二):多使用者登入LaravelPassportAPI
- jQuery ajax請求返回401問題解決方案jQuery
- HTML如何輸入多個空格HTML
- 實現傳送多個Ajax請求
- Java Struts2 的請求處理流程詳解Java
- 用 UI 多執行緒處理 WPF 大量渲染的解決方案UI執行緒