2013-03-24 82 views
1

我必須創建一個由服務器和4個客戶端組成的分佈式系統,服務器有一個文件,所有客戶端不能同時讀取,只有一個文件寫入。每個客戶端隨機選擇是讀取文件的內容還是寫入文件。客戶端/服務器問題與線程。已經綁定的端口

如果客戶端選擇寫入,它會生成一個介於0和911之間的隨機數,寫入給客戶端服務器的文件中。當隨機數爲100時,客戶端將從服務器 斷開連接。您必須實施適當的機制以使服務器能夠同步客戶端。

這裏的錯誤:

Error during I/O 
Error during I/O java.net.BindException: Address already in use: 
JVM_Bind at java.net.DualStackPlainSocketImpl.bind0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketBind(Unknown Source)  at 
java.net.AbstractPlainSocketImpl.bind(Unknown Source) at 
java.net.PlainSocketImpl.bind(Unknown Source) at 
java.net.ServerSocket.bind(Unknown Source) at 
java.net.ServerSocket.<init>(Unknown Source) at 
java.net.ServerSocket.<init>(Unknown Source) at 
My_Thread.run(My_Thread.java:18) java.net.BindException: Address 
already in use: JVM_Bind at 
java.net.DualStackPlainSocketImpl.bind0(Native Method) at 
java.net.DualStackPlainSocketImpl.socketBind(Unknown Source) at 
java.net.AbstractPlainSocketImpl.bind(Unknown Source) at 
java.net.PlainSocketImpl.bind(Unknown Source) at 
java.net.ServerSocket.bind(Unknown Source) at 
java.net.ServerSocket.<init>(Unknown Source) at 
java.net.ServerSocket.<init>(Unknown Source) at 
My_Thread.run(My_Thread.java:18) Waiting Incoming Connection... Local 
Address :0.0.0.0/0.0.0.0 Port :5555 Error during I/O 
java.net.SocketException: Connection reset at 
java.net.SocketInputStream.read(Unknown Source)  at 
java.net.SocketInputStream.read(Unknown Source)  at 
sun.nio.cs.StreamDecoder.readBytes(Unknown Source) at 
sun.nio.cs.StreamDecoder.implRead(Unknown Source) at 
sun.nio.cs.StreamDecoder.read(Unknown Source) at 
java.io.InputStreamReader.read(Unknown Source) at 
java.io.BufferedReader.fill(Unknown Source)  at 
java.io.BufferedReader.readLine(Unknown Source)  at 
java.io.BufferedReader.readLine(Unknown Source)  at 
Server.main(Server.java:34) 

下面的代碼:

服務器

import java.net.*; 
    import java.util.Scanner; 
    import java.io.*; 

    public class Server { 
    public static void main(String[] args) { 
     My_Thread t1=new My_Thread(); 
     My_Thread t2=new My_Thread(); 
     t1.start(); 
     t2.start(); 

    try{ 

    ServerSocket server = new ServerSocket(5555,50); 
    System.out.println("Waiting Incoming Connection..."); 
    System.out.println("Local Address :"+server.getInetAddress()+" Port :"+server.getLocalPort()); 
    Socket sock = server.accept(); 
    BufferedReader instream = new BufferedReader (new InputStreamReader (sock.getInputStream())); 
    BufferedWriter outstream = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 
    FileWriter file = null; 
    int number=0; 
    try 
    { 
      file = new FileWriter("C://Users//Vagos//Desktop//file.txt"); 

    } 
    catch(IOException ex) 
    { 
      System.out.println("File Error"); 
    } 

    Scanner scanner = new Scanner(new File("file.txt")); 

    String strin = instream.readLine(); <---and heare 
    if (strin.equals("Insert")){ //following the protocol 

    do{ 
    //strin = instream.readLine(); 
    //outstream.write(strin+"\n"); 
    //outstream.flush(); 
    number = instream.read(); 
    file.write(new Integer(number).toString()); 
    file.write(" "); 
    file.flush(); 
    }while(number!=100); //bye = terminate the conversation 
    }else if(strin.equals("Read")){ 

     while(scanner.hasNextInt()){ 
        outstream.write(scanner.nextInt()); 
        outstream.flush(); 
       } 
    }else { 
    System.out.println("Connection Closing..."); 
    } 
    instream.close(); 
    outstream.close(); 
    file.close(); 
    sock.close(); 
    }catch (Exception ex){ 
    System.out.println("Error during I/O"); 
    ex.getMessage(); 
    ex.printStackTrace(); 
    }}} 

client 

    import java.net.*; 
    import java.io.*; 
    import java.util.Random; 
    import java.util.Scanner; 
    public class client { 

    public static void main(String[] args) { 

    try{ 

    Socket sock = new Socket("localhost", 5555); 
    BufferedReader instream = new BufferedReader (new InputStreamReader(sock.getInputStream())); 
    BufferedWriter outstream = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 
    System.out.println("Sending Messages to the Server..."); 
    System.out.println("Connecting to "+ sock.getInetAddress()+ " and port "+sock.getPort()); 
    System.out.println("Local Address :"+sock.getLocalAddress()+" Port :"+sock.getLocalPort()); 
    Random random = new Random(System.currentTimeMillis()); 
    String strin, strout; 
    int number=0,choice=0;; 
    choice=random.nextInt(2); 
    System.out.println("choice "+choice); 
    if(choice==1){ 
    outstream.write("Insert\n"); 
    outstream.flush(); 

    do{ 
    number=random.nextInt(911); 
    System.out.print(number); 
    outstream.write(number); 
    outstream.flush(); 
    }while (number!=100); 

    }else if(choice==2){ 
    outstream.write("Read\n"); 
    outstream.flush(); 

    do{ 
    number=instream.read(); 
    System.out.println(number); 

    }while (true); 
    } 

     }catch (Exception ex){ 
    System.out.println("Connection Refused!!!"); 
    } 
    } 
    } 

My_Thread 

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 


public class My_Thread extends Thread{ 
    public void run(){ 

     try{ 

      ServerSocket server = new ServerSocket(5555,50); <---heare 
      System.out.println("Waiting Incoming Connection..."); 
      System.out.println("Local Address :"+server.getInetAddress()+" Port :"+server.getLocalPort()); 
      Socket sock = server.accept(); 
      BufferedReader instream = new BufferedReader (new InputStreamReader (sock.getInputStream())); 
      BufferedWriter outstream = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 
      FileWriter file = null; 
      int number=0; 
      try 
      { 
        file = new FileWriter("C://Users//Vagos//Desktop//file.txt"); 

      } 
      catch(IOException ex) 
      { 
        System.out.println("File Error"); 
      } 

      Scanner scanner = new Scanner(new File("file.txt")); 

      String strin = instream.readLine(); 
      if (strin.equals("Insert")){ //following the protocol 

      do{ 
      //strin = instream.readLine(); 
      //outstream.write(strin+"\n"); 
      //outstream.flush(); 
      number = instream.read(); 
      file.write(new Integer(number).toString()); 
      file.write(" "); 
      file.flush(); 
      }while(number!=100); //bye = terminate the conversation 
      }else if(strin.equals("Read")){ 

       while(scanner.hasNextInt()){ 
          outstream.write(scanner.nextInt()); 
          outstream.flush(); 
         } 
      }else { 
      System.out.println("Connection Closing..."); 
      } 
      instream.close(); 
      outstream.close(); 
      file.close(); 
      sock.close(); 
      }catch (Exception ex){ 
      System.out.println("Error during I/O"); 
      ex.getMessage(); 
      ex.printStackTrace(); 
      } 


    } 
} 
+0

莫非你標記錯誤發生在哪裏? – 11684 2013-03-24 20:13:50

+0

如果您嘗試在另一個端口上收聽(並連接 - 不要忘記調整!),會發生什麼情況? – 11684 2013-03-24 20:16:03

+0

我在市場上銷售....... @ 11684我不知道你的意思。 – 2013-03-24 20:27:24

回答

2

您只能從程序綁定到一個端口一次(除非你設置一個特定的套接字選項,SO_REUSEADDRESS,但現在忽略)。就目前而言,您正試圖將一個進程綁定到同一個端口三次 - 一次在for循環中,一次爲每個啓動的兩個線程。我不完全確定你爲什麼要啓動三個服務器進程,但你會想重新訪問你的設計,並確保你只綁定了一次服務器端口。


編輯

我會做的是從主要方法去除try/catch語句的邏輯,和產卵只是一個線程:

public static void main(String[] args) { 
    My_Thread t1 = new My_Thread(); 
    t1.start(); 
} 
+0

你能舉個例子嗎? – 2013-03-24 21:35:05

+0

@Βίκτοραςανδρεάδης - 見編輯。 – Perception 2013-03-24 21:39:31

+0

我不能重試try/catch – 2013-03-24 21:50:06