2014-11-03 48 views
0

每次从客户端连接到服务器时,客户端都会向服务器发送字符串消息“11”,并且当服务器收到字符串消息“11”时,它会运行count ++。然后出现了两个连接,它应该使计数++的count = 2运行两次,但是当客户端连接时,我检查了它并且客户端正确地向服务器发送了字符串消息“11”,但计数保持为1并且永远不会输入if(count == 2)块。一直在测试和寻找小时,但似乎无法找到问题。请帮忙!谢谢为什么我的计数++在Thread类的run()方法中重置?

客户端的代码片段:

Socket s = new Socket(hostname, port); // Plug in the socket to connect to the server 
pw = new PrintWriter(s.getOutputStream()); //Instance of sending it out 
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 

public void run() { //Deal with reading from server and print them out 

    try { 
     pw.println("11"); //Sends the message when connection is made to the server 
     pw.flush(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    try{ 

      while(true){ 

       String line = br.readLine(); //Read in the message from server 

       if(line.equals("12")){ //When finally receives the string message "12" from server 

        button.setBackground(Color.white); 
        button.addActionListener(sl); 

       } 

       int update = Integer.parseInt(line); 

       if(update < 10){ 
        current-= update; 
       } 
    } 

    } catch (IOException ioe){ 
     System.out.println("ioe in ChatClient.run: " + ioe.getMessage()); 
    } 
} 

Server线程的代码片段:

PrintWriter pw = new PrintWriter(s.getOutputStream()); 

public void run(){ 
    try{ 

     BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); 

     while(true){ 
      String line = br.readLine(); //blocking //Keep reading in messages 

      if(line.equals("11")){ //Tested it out and does receive "11" whenever a client connects and prints out "11" 
       count++; //But the problem is count stays as 1 every time it connects and never becomes 2 
       System.out.println(line); 
       System.out.println(count); 
      } 

      if(count == 2){ //Never able to reach inside this block of code 
       pw.println("12"); 
       pw.flush(); 
       count++; 
      } 
     } 

    } catch(IOException ioe){ 
     System.out.println("ioe in ChatTHread: " + ioe.getMessage()); 
    } 
} 

编辑 - 服务器代码:

import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.Scanner; 
import java.util.Vector; 

public class Server { 

private int count = 0; 
private Vector<FFThread> ctVector = new Vector<FFThread>(); //Parametrized 

public Server(int port){ 

    try{ 

     ServerSocket ss = new ServerSocket(port); //Server socket to connect to the port 

     while(true){ 

      Socket s = ss.accept(); // Listens for a connection to be made to this "s" socket and accepts it. 


      FFThread ct = new FFThread(s, this); //Get new socket access thread 
      ctVector.add(ct); //Appends the specified element "ct" to the end of this Vector. 
      ct.start(); 
     } 

    } catch(IOException ioe){ 
     System.out.println("ioe in ChatServer: " + ioe.getMessage()); 
    } 
} 

public int counter(){ 
    this.count = 0; 
    count++; 
    return count; 
} 

public void sendMessage(String message, FFThread ct){ 
    for(FFThread c : ctVector){ 
     if(!c.equals(ct)){ //Two different clients 
      c.sendMessage(message); 
     } 
    } 
} 

public void removeThread(FFThread ct){ 
    ctVector.remove(ct); 
} 

public static void main(String [] args){ 
    Scanner scan = new Scanner(System.in); 
    System.out.print("What port? "); 
    int port = scan.nextInt(); 
    new Server(port); 
} 

}

编辑 - 服务器的线程类:

import java.awt.List; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.ArrayList; 


public class FFThread extends Thread { 

private Socket s; 
private Server cs; 
private PrintWriter pw; 
private int count = 0; 
boolean ready = false; 

public FFThread(Socket s, Server cs){ 

    this.s = s; 
    this.cs = cs; 

    try{ 

     this.pw = new PrintWriter(s.getOutputStream()); //Set up to send messages to clients 

    } catch(IOException ioe){ 
     System.out.println("ioe in ChatThread constructor: " + ioe.getMessage()); 
    } 
} 
+0

检查变量'line'的长度是否为2,因为比较可能始终为false,因此不会增加'count'。例如:“11”不等于“11”。 – SkyMaster 2014-11-03 06:52:01

+0

尝试添加“其他”块,看看你的假设是否正确。使用IDE进行调试也很有用。 – Jayan 2014-11-03 06:54:12

+0

@JoseLuis这似乎不是问题,因为我用System.out.println(line)和System.out.println(count)对它进行了测试,并且它们是用字符串“11”打印出来的,但是伯爵总是保持1,证明他们能够进入if区块。 – 2014-11-03 07:07:41

回答

0

你的服务器级别的启动为每个传入连接一个新的线程(的FFThread实例)。您的run方法FFThread确实是count++,但它必须在局部变量上执行,因为它不访问Server类中的count变量。因此,每个线程将自己的count0增加到1,并且它永远不会达到两个。

您的run方法应该增加(并测试)服务器实例的count变量,以使该计数达到2.您必须以线程安全方式(即使用同步方法)对其进行增加。

我相信加入以下到您的服务器类将工作:

private volatile int count = 0; 
... 
public synchronized void incCount() 
{ 
    count++; 
} 

public int getCount() 
{ 
    return count; 
} 

然后,在你FFThread类,使用this.cs.getCount()this.cs.incCount()阅读和增加计数。

+0

你介意吗?我很迷茫...什么是最方便的方法呢? – 2014-11-03 07:56:57

+0

@OM编辑答案。 – Eran 2014-11-03 08:05:58

+0

它为启动的第二个客户端工作,但第一个客户端没有启动。我猜第一个仍然保持计数为1,但一旦第二个客户端的计数达到2,服务器是否应该向两个客户端发送字符串“12”的消息? – 2014-11-03 08:15:13

相关问题