程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> 線程-使用Java socket讓客戶端與服務器建立連接後,服務器如何判斷來自客戶端的各類請求

線程-使用Java socket讓客戶端與服務器建立連接後,服務器如何判斷來自客戶端的各類請求

編輯:編程綜合問答
使用Java socket讓客戶端與服務器建立連接後,服務器如何判斷來自客戶端的各類請求

初學java,目前寫了一個服務端和一個客戶端。大致了解了如何socket通信是如何操作的,並且初步實現了客戶端和服務端的通信。也僅僅是是接受和返回簡單的字符串。部分代碼如下

public void run(){

    try{
        serverSocket=new ServerSocket(SERVER_PORT_ONE);
        System.out.println("serversocket已創建");
        while(true){

            clientSocket=serverSocket.accept();
            System.out.println("監測到了socket");

            receiveThread=new SocketThread(clientSocket);   //開啟新線程處理請求

            receiveThread.start();
        }

    }catch(IOException e){
        System.out.println(e.getMessage());
    }
}

這是socket監聽的代碼。當服務器監聽到了socket之後,開啟一個新線程去處理。

socketthread類的run()方法來接受數據
public void run(){
String Command=null;
String str=null;

       output.println("服務器已經接受你的連接\n");

       while(true){
       try{ 
           str=null;
           str=input.readLine(); 
           System.out.println("監測數據如下:"+str);
           }catch(IOException e){ 
           System.out.println(e.getMessage());
           } 

       Command=str.trim().toUpperCase();
       if(str==null || Command.equals("QUIT")) {
           break;
       }
       }
       try{ 
           clientSocket.close();//關閉套接字 
           System.out.println("clientSocket已經斷開連接");
           }catch(IOException e){ 
           System.out.println(e.getMessage()); 
           } 
           Command=null;
 }
 在while循環裡面,服務端會不斷讀取來自客戶端的內容,然後輸出來。如果讀到quit,就表示斷開連接,並關閉socket。

現在的問題就是, 如果我的客戶端的請求十分多樣,比如發送語音,視頻,圖片或者數據給服務器進行處理,我的服務端必須做出相應的處理,請問如何做到這點啊。

我自己想的思路是客戶端發送數據前先要發送一個header標簽,表示想干什麼。然後讀取到了之後客戶端再判斷,然後分給不同的函數去處理。不知道這樣好不好,如下所示。
while(true){
try{
str=null;
str=input.readLine();
if(str.equals("圖片")){
圖片相關函數(socket );
}

            if(str.equals("視頻")){
                視頻處理相關函數(socket );
                }

                    if(str.equals("數據")){
                數據處理相關函數(socket );//如各種算法
                }

           System.out.println("監測數據如下:"+str);
           }catch(IOException e){ 
           System.out.println(e.getMessage());
           } 

       Command=str.trim().toUpperCase();
       if(str==null || Command.equals("QUIT")) {
           break;
       }

不知道是否可行。

第二個問題,我的服務器要主動推送數據給客戶端該如何實現,肯定不能寫在這個線程裡面。寫在其他地方我的類和函數如何得到這個線程裡的socket呢。

最佳回答:


這就是通信雙方事先約定好通信規則,也就是所謂的協議的作用了。
各種通信業務,都是先定義好通信協議,然後才是通信操作處理了。

wojiushiwo945you
cyf799232707
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved