2014-01-29 4 views
-1

두 명의 클라이언트가 참여하는 게임을 만들면 하나는 다른 서버를 호스팅하여 함께 게임 할 수 있습니다. 내 코드에서는 한 클라이언트가 serversocket을 사용하고 다른 소켓은 serversocket을 사용하여 소켓을 serversocket.accept()으로 가져옵니다. 내 문제는 그 때마다 PrintWriter.println(...) 사용할 때마다 다른 클라이언트가 메시지를받지 못합니다. 메시지를 보낼 때 또는받은 때 확실하지 않습니다. 이 메인 클래스입니다 :Java 소켓이 메시지를 보내거나받지 않음

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


public class RecieveHandler implements Runnable { 

Base b; 
Socket s; 
BufferedReader r; 

public RecieveHandler(Base base, Socket socket) { 

    try { 

     b = base; 
     s = socket; 
     r = new BufferedReader(new InputStreamReader(s.getInputStream())); 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

@Override 
public void run() { 

    try { 

     while (true) { 

      String message = r.readLine(); 
      System.out.println("Recieved message: " + message); 
      if (message.equals("ready")) { 

       b.setOtherReady(); 

      } 

     } 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

} 

그리고 여기 서버 모드입니다 :

여기

내 RecieveHandler이다}

public class Base extends JPanel { 

PrintWriter pw; 
JButton host = new JButton("Host New Game"); 
JButton join = new JButton("Join Existing Game"); 
JButton ready = new JButton("Ready"); 
Base b = this; 
String ip; 
String port; 
String message; 
boolean otherready; 
int textip = 0; 
Socket s; 
int count = 0; 

public Base() { 

    Handler handler = new Handler(); 

    host.addActionListener(handler); 
    join.addActionListener(handler); 
    text.addActionListener(handler); 

} 

public void notifyOfPlayer() { 

    game = true; 
    setUpGame(); 

} 

public void sendMessage (String message) { 

    try { 

     if (!doneonce) { 

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

     } 

     pw.println(message); 
     pw.flush(); 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

public void setPlayer (Socket player) { 

    s = player; 

} 

private class Handler implements ActionListener, MouseListener, MouseMotionListener { 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void mouseClicked(MouseEvent e) { 



    } 

    @Override 
    public void mouseExited(MouseEvent e) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     if (e.getSource() == host) { 

      remove(host); 
      remove(join); 
      text.setText("Server Mode, Waiting for player"); 
      text.setSize((int)text.getPreferredSize().getWidth(), 25); 
      text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
      Thread t = new Thread(new ServerMode(b)); 
      t.start(); 
      repaint(); 

     } else if (e.getSource() == join) { 

      remove(host); 
      remove(join); 
      text.setText("Enter IP"); 
      textip = 1; 
      /*text.setSize((int)text.getPreferredSize().getWidth(), 25); 
      text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
      */text.setEditable(true); 
      repaint(); 

     } else if (e.getSource() == text) { 

      if (textip == 1) { 

       textip ++; 
       ip = text.getText(); 
       text.setText("Enter Port"); 
       /*text.setSize((int)text.getPreferredSize().getWidth(), 25); 
       text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
       */ 
      } else { 

       textip = 0; 
       port = text.getText(); 
       text.setText("Joining Game..."); 
       text.setSize((int)text.getPreferredSize().getWidth(), 25); 
       text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 

       try { 

        s = new Socket(ip, Integer.parseInt(port)); 
        text.setText("Game Joined"); 
        remove(text); 
        game = true; 
        setUpGame(); 
        repaint(); 
        Thread t = new Thread(new RecieveHandler(b, s)); 
        t.start(); 

       } catch (Exception e1) { 

        text.setText("Could not connect"); 
        text.setSize((int)text.getPreferredSize().getWidth(), 25); 
        text.setLocation((int)((Toolkit.getDefaultToolkit().getScreenSize().getWidth()/2) - (text.getPreferredSize().getWidth()/2)), 200); 
        text.setEditable(false); 
        e1.printStackTrace(); 

       } 

      } 

     } else if (e.getSource() == ready) { 

      sendMessage("ready"); 

     } 

    } 

} 

public void setOtherReady() { 

    otherready = true; 
    JOptionPane.showMessageDialog(null, "Your opponent is ready!", "Ready!", JOptionPane.INFORMATION_MESSAGE); 

} 

(나는 길 밖으로 GUI 물건의 대부분을 제거했다)

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class ServerMode implements Runnable { 

ServerSocket ss; 
Base b; 
PrintWriter pw; 
BufferedReader r; 

public ServerMode (Base base) { 

    b = base; 

} 

@Override 
public void run() { 

    try { 

     ss = new ServerSocket(3602); 

     while (true) { 

      Socket s = ss.accept(); 
      pw = new PrintWriter(s.getOutputStream()); 
      pw.println("HI!!!"); 
      InputStreamReader isr = new InputStreamReader(s.getInputStream()); 
      r = new BufferedReader(isr); 
      b.notifyOfPlayer(); 
      b.setPlayer(s); 
      Thread t = new Thread(new RecieveHandler(b, s)); 
      t.start(); 

     } 

    } catch (Exception e) { 

     e.printStackTrace(); 

    } 

} 

} 

이 코드는 두 클라이언트에서 모두 동일합니다.

내가 잘못 했습니까?

+1

작가를 플러시합니까? 다른 생성자를 사용하여 자동 여백 PrintWriter도 만들 수 있습니다. – Kayaman

+0

ServerMode pw.println ("HI !!") 부분이 해결되었지만 아직까지는 다른 부분이 없습니다. ( – dodo

+1

"그 밖의 아무것도 작동하지 않습니다."라는 메시지는 실제로 문제를 설명하지 않습니다. – Kayaman

답변

0

코드를 철저히 조사했는데 메시지를 보내는 버튼에 .addActionListener(...)이 붙어 있지 않은 것을 발견했습니다. 죄송합니다. |

관련 문제