2014-02-06 310 views
1

TCP服務器TCP線程服務器/客戶端

我運行了服務器和客戶端,但它似乎只有一個線程正在工作。我應該更改端口還是什麼?在此先感謝

我跑了服務器和客戶端,但它似乎只有一個線程正在工作。我應該更改端口還是什麼?在此先感謝 我跑了服務器和客戶端,但它似乎只有一個線程正在工作。我應該更改端口還是什麼?在此先感謝 Server代碼:

package tcpecho; 

import java.io.*; 
import java.net.*; 


class TCPserver implements Runnable { 
private static String clientMSG; 
private static String serverRespond; 
private static ServerSocket MySocket=null; 
private static Socket client; 
private static Socket connectionSocket = null; 
private BufferedReader inFromClient = null; 
public TCPserver(Socket client){ 
    TCPserver.client=client;} 

public static void main(String[] args) { 


public void socketProcess() 
{ 



    try { 
     clientMSG = inFromClient.readLine(); 
    } catch (IOException e) { 
     System.err.println("Message from client is not readable"); 
    } 

    serverRespond = clientMSG +connectionSocket.getInetAddress()+ '\n'; 

    try { 
     outToClient.writeBytes(serverRespond); 
    } catch (IOException e) { 
     System.err.println("Message to client is not out"); 
    } 

    try { 
     MySocket.close(); 
    } catch (IOException e1) { 

     System.err.println("Unable to close the socket"); 
    } 

} 




} 

}

這裏是我的客戶端代碼:

package task3; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.Socket; 

class Client { 
    public static void main(String argv[]) throws Exception { 

     String str; 
     String strFromServer; 
     BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); 

     Socket client = null; 
     // for(int i=0;i<10;i++){ 
     int port = 6880; 
     try { 
      client = new Socket("192.168.56.1", port); 
     } catch (Exception e) { 
      System.err.println("Couldn't connect to the port" + port); 
      System.exit(1); 
     } 

     DataOutputStream outToServer = new DataOutputStream(client.getOutputStream()); 

     BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     System.out.println("Write a message to the server :"); 
     str = inFromUser.readLine(); 

     outToServer.writeBytes(str + '\n'); 
     strFromServer = inFromServer.readLine(); 
     System.out.println("Respond from server: " + strFromServer); 
     client.close(); 
    } 
} 
+0

一旦你收到答案,不要污衊你的問題。 –

回答

3

右鍵你在這之後

connectionSocket = MySocket.accept();

你需要將此connectionSocket實例傳遞給新線程並在該線程上調用start

此外,移動所有connectionSocket處理邏輯到您的螺紋類的run方法
(這個邏輯是目前在上述這條線之後的main方法)。

爲了實現您自己的Thread,您可以擴展Thread或實現Runnable

檢查此鏈接一些更多的細節:Java Threads

+0

另外,你不應該在循環中創建一個新的ServerSocket。創建一次就足夠了。 – Kayaman

+0

正確,他應該刪除我猜的整個循環。我想他在嘗試支持接受多個客戶時添加了它。 –

+0

我將connectionSocket傳遞給了一個新的線程,但是我不能移動run方法中的所有進程,它會拋出很多錯誤。 – Jason

0

只是一個建議,如果你想有多個線程始終打開,所有的客戶端,你可能要檢查出java.nio包,它使用非阻塞IO 。

這將允許您處理更多的連接。

+1

線程池呢? – Jason

+0

線程池從程序員的控制中被抽象出來。你通常使用一個nio.channel子類和一個選擇器。它與C/C++中的select()函數類似。根據您使用TCP服務器的方式,研究java.nio可能更有優勢。 –