初學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呢。
這就是通信雙方事先約定好通信規則,也就是所謂的協議的作用了。
各種通信業務,都是先定義好通信協議,然後才是通信操作處理了。