2013-07-28 65 views
0

我正尝试在服务器和客户端之间创建数据传输。连接已建立,但服务器和客户端之间没有数据传输。 服务器端:线程中的Java套接字 - 无数据传输

public static void CreateServerSocket() { 
    try { 
     server = new ServerSocket(9999); 
     t = new Thread(new SocketServer()); 
     t.start(); 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

public static void closeServer() { 
    try { 
     server.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

public static void sentSide(String side) { 
    out.print(side); 
} 

@Override 
public void run() { 

    try { 
     client = server.accept(); 
     out = new PrintWriter(client.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     out.print("test from server"); 
     while (true){ 
      strIn=in.readLine(); 
      System.out.println(strIn); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

客户端:

public class SocketClient implements Runnable { 

static Socket client; 
static Thread t; 
static PrintWriter out; 
static BufferedReader in; 
static String strIn; 

public static boolean CreateClientSocket(InetAddress ip) { 
    try { 
     client = new Socket(ip, 9999); 
     t = new Thread(new SocketClient()); 
     t.start(); 
     return true; 
    } catch (UnknownHostException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
     return false; 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
     return false; 
    } 
} 

public static void closeClient() { 
    try { 
     client.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(SocketServer.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

@Override 
public void run() { 
    try { 
     out = new PrintWriter(client.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     out.print("test from client"); 
     while (true) { 
      strIn = in.readLine(); 
      System.out.println(strIn); 
      DialogMultiplayerStart.setSide(strIn); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(SocketClient.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

的问题是,的out.print不发送数据。连接已建立,因为CreateClientSocket返回true,但out.print(“来自客户端/服务器的测试”)都不起作用,也没有setSide方法。在此先感谢您的帮助。

+0

你试过'out.flush()'吗? – Desert

回答

4

客户端开始做

out.print("test from client"); 

,然后等待来自服务器的整条生产线:

strIn = in.readLine(); 

服务器通过做

out.print("test from server"); 

,然后等待来自客户端的全线:

strIn = in.readLine(); 

所以,双方都在等待对方发送一个行尾:死锁。

将其更改为

out.println("test from server"); 

out.println("test from client"); 

走得更远一点。但是,你会遇到另外一个问题:双方都会无限循环地阅读,而不会再发送更多内容。

+0

非常感谢。我把'print'改成了'println',并且在条件变成'while((strIn = in.readLine())!= null)'的时候改变了。但问题是方法sentSide仍然没用。 – lozga

+0

再次阅读我的答案的结尾:双方试图读取来自对方的线。但是双方都没有写任何东西。你应该有一个对话:服务器写入和客户端读取。然后客户端写入和服务器读取等。如果两者都在同一时间读取,则不会发生任何事情,并且一切都被阻止。 –

+0

那么,一段时间的变化是没有帮助的? – lozga