-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();
}
}
}
이 코드는 두 클라이언트에서 모두 동일합니다.
내가 잘못 했습니까?
작가를 플러시합니까? 다른 생성자를 사용하여 자동 여백 PrintWriter도 만들 수 있습니다. – Kayaman
ServerMode pw.println ("HI !!") 부분이 해결되었지만 아직까지는 다른 부분이 없습니다. ( – dodo
"그 밖의 아무것도 작동하지 않습니다."라는 메시지는 실제로 문제를 설명하지 않습니다. – Kayaman