所以我一直在做一个简单的聊天,比有一台服务器和一群客户端连接到它们。在客户端,我有类ConnectionManager来管理创建套接字等。这是它的核心方法:java - 服务器没有收到来自客户端的消息(reader.readLine()== null?)
public class ConnectionManager {
private Socket socket;
private BufferedReader reader;
private PrintWriter writer;
public ConnectionManager(String URL, int port){
tryConnectToServer(URL, port);
}
public BufferedReader getReader() {
return reader;
}
public PrintWriter getWriter() {
return writer;
}
private void tryConnectToServer(String ip, int servSocket) {
try{
socket = new Socket(ip, servSocket);
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
}
catch (IOException ex){
System.out.println("Unable to connect to specified server. Code pink");
ex.printStackTrace();
}
}
连接管理器对象是ChatGUI的一部分。 ChatGUI的字段写入器和读取器获得和从CM,以便与ChatGUI的JTextField中(msgInput)一起传递作家设置为SendButtonListener:
private void addSendButton() {
JButton sendButton = new JButton("Send");
sendButton.addActionListener(new SendButtonActionListener(writer, msgInput));
panel.add(sendButton);
panel.add(this.msgArea);
}
然后,actionPerformed方法的作用:
public class SendButtonActionListener implements ActionListener{
private PrintWriter writer;
private JTextField msgInput;
public SendButtonActionListener(PrintWriter pr, JTextField mi){
writer = pr;
msgInput = mi;
}
public void actionPerformed(ActionEvent event){
writer.println(msgInput.getText());
System.out.println("Sending: " + msgInput.getText());
flushMessageInputField();
}
private void flushMessageInputField(){
msgInput.setText("");
}
}
在服务器端另一方面我有这个:
try{
this.servSocket = new ServerSocket(port);
System.out.println("Server socket established");
}
catch (IOException ex){
System.out.println("Unable to establish server socket. Code pink \n");
ex.printStackTrace();
}
和上面后谈到这一点:
public void waitForClients(){
System.out.println("The gates has been opened...");
while (true){
try {
Socket client = servSocket.accept();
processClient(client);
}
catch (IOException ex){
ex.printStackTrace();
}
}
}
private void processClient(Socket client){
writers.add(getClientWriter(client));
startUpdateFrom(client);
System.out.println("New client connected: " + client.getPort());
}
private PrintWriter getClientWriter(Socket client){
try{
return new PrintWriter(client.getOutputStream());
}
catch (Exception ex){
ex.printStackTrace();
}
return null;
}
最后,一个新的线程开始监听来自客户端的任何新的消息:
private void startUpdateFrom(Socket client){
new Thread(
new WaitAndSendToAllFrom(client))
.start();
}
那就是:
public class WaitAndSendToAllFrom implements Runnable{
BufferedReader reader;
public WaitAndSendToAllFrom(Socket clientSocket){
try{
reader = new BufferedReader(
new InputStreamReader(
clientSocket.getInputStream()));
}
catch (IOException ex){
ex.printStackTrace();
}
}
public void run(){
try{
String message;
System.out.println("Thread: waiting for messages to send...");
while (true){
message = reader.readLine();
while (message != null){
System.out.println("Server: Sending message: " + message);
sendToAll(message);
}
}
}
catch (IOException ex){
ex.printStackTrace();
}
}
private void sendToAll(String message){
List<PrintWriter> writers = ServerClientConnector.getWriters();
for (PrintWriter pr : writers){
pr.println(message + "\n");
pr.flush();
}
}
}
的周期到达“线程:等待消息发送...”,但没有更进一步,reader.readLine()返回null(用sysout检查:))。我试图去调试它,但是我没有那么有经验,尤其是调试两个单独的代码。我一直在看这个为期3天,而我在这里严重受阻。
你能后,从客户端发送消息,以及代码?顺便说一下,在WaitAndSendToAllFrom-> run-> while(message!= null)时你有一个无限循环' - 在while.loop中没有办法改变消息,所以它会循环并永远循环(即使它不是'你要求的问题,可能是下一个问题)。 –
我编辑过这篇文章,写的不多,但我相信这就是需要的一切:)。提前为其他错误/错误 - 我知道代码需要改变一点点和重构,但现在我专注于那些该死的插座/读者/作家:)。 –