-1
我正在制作一个涉及两个客户端的游戏,一个为另一个托管服务器,然后他们可以一起玩。在我的代码中,我有一个客户端使用了一个serversocket,另一个使用了socketocket,然后serversocket通过serversocket.accept()
获得了一个套接字。我的问题是,无论何时我使用PrintWriter.println(...)
该消息不会被其他客户端收到。林不知道是否当我发送消息或收到时。这是主类:(我已删除大部分的GUI东西出来的样子)没有发送/接收消息的Java套接字
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);
}
}
这里是我的RecieveHandler:
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();
}
}
}
这里是ServerMode:
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