Java套接字。 服务器 – 客户端通信

我试图用gui连接一个客户端和一个没有gui的服务器。 正在进行连接,但我无法看到这两个应用之间的任何消息。 (我应该在客户端获取SERVER,在服务器中获取客户端)

客户端连接代码:

@Override public void ClientRunning(){ try { connectToServer(); setStreams(); ClientRun(); }catch(EOFException oefException){ showMessage("\n Client terminated the connection\n"); }catch(IOException ioException){ ioException.printStackTrace(); }finally{ close(); } } public void connectToServer() throws IOException{ showMessage("Attempting Connection... \n"); connection = new Socket(InetAddress.getByName(serverIP),6789); showMessage("Connected to: "+ connection.getInetAddress().getHostName()); } public void setStreams() throws IOException{ output = new PrintWriter(connection.getOutputStream(),true); output.flush(); input= new BufferedReader(new InputStreamReader(connection.getInputStream())); showMessage("\n Streams are now set. \n"); } public void close(){ showMessage("\n closing..."); try{ output.close(); input.close(); connection.close(); }catch(IOException ioException){ ioException.printStackTrace(); } } public void showMessage(final String text){ SwingUtilities.invokeLater(new Runnable(){ public void run(){ cwindow.append(text); } }); } public void sendMessage(String message){ output.write("CLIENT - "+message); output.flush(); showMessage("\nCLIENT - "+message); } private void ClientRun() throws IOException{ String message="CLIENT HERE!"; sendMessage(message); do{ try{ message=input.readLine(); showMessage("\n"+message); }catch(EOFException eofException){ showMessage("\n Server ended the connection!"); } }while(message!="EXIT"); } 

(输入和输出在此类Client扩展到的GUI类中定义。定义为“protected BufferedReader input; protected PrintWriter output;”)

此外,服务器代码:

 public class ServerClass { private ServerSocket server; private Socket connection; private BufferedReader input; private BufferedWriter output; public void startServer(){ try{ server=new ServerSocket(6789,100); while(true){ try{ waitForConnection(); setStreams(); ServerRunning(); }catch(EOFException eofException){ showMessage("\n Server ended the connection!"); }finally{ close(); } } }catch(IOException ioException){ ioException.printStackTrace(); } } private void waitForConnection() throws IOException{ showMessage("Waiting for someone to connect... \n"); connection=server.accept(); showMessage("Now connected to "+ connection.getInetAddress().getHostName()); } private void setStreams() throws IOException{ output = new BufferedWriter(new OutputStreamWriter(connection.getOutputStream())); output.flush(); input= new BufferedReader(new InputStreamReader(connection.getInputStream())); showMessage("\n Streams are now set. \n"); } public void ServerRunning() throws IOException{ String message="SERVER HERE!"; sendMessage(message); do{ try{ message=input.readLine(); showMessage("\n"+message); }catch(EOFException eofException){ showMessage("\n Server ended the connection!"); } }while(message!="EXIT"); } private void close(){ showMessage("\n Closing connections... \n"); try{ output.close(); input.close(); connection.close(); }catch(IOException ioException){ ioException.printStackTrace(); } } private void showMessage(String text){ System.out.println(text); } private void sendMessage(String message){ try{ output.write("SERVER - "+message); output.flush(); showMessage(message); }catch(IOException ioException){ System.out.println("\n ERROR!"); } } 

连接似乎没问题,所以我不知道什么是错的。 任何帮助,将不胜感激。

PS:我也在服务器上尝试过PrintWriter,并尝试在流语句中尝试catch,问题依然存在。

你正在使用readLine() ,它需要一个换行符。 要么为要发送的消息添加\n ,要么不使用readLine()

[求助]由于TedTrippin和Alfie提到readline(),搞砸了我的代码。 在每条消息中添加“\ n”后,一切似乎都顺利进行! 我还在客户端代码中将printwriter更改为bufferwritter,并且我还在sendMessage中添加了try-catch函数,因为printwritter似乎也出于某种原因导致了一些问题。 无论如何,一切都已完成! 多谢你们!

更新的客户代码:

 private void ClientRun() throws IOException{ String message="CLIENT HERE! \n"; <----added \n here. sendMessage(message); do{ try{ message=input.readLine(); showMessage("\n"+message); }catch(EOFException eofException){ showMessage("\n Server ended the connection!"); } }while(message!="EXIT"); } public void sendMessage(String message){ try{ <-----added try-catch statement output.write("CLIENT - "+message+"\n"); <----adding "\n" here is super userful, instead of having to add \n in each message. output.flush(); showMessage(message); }catch(IOException ioException){ System.out.println("\n ERROR!"); } } protected BufferedReader input; protected BufferedWriter output; <----changed printwriter to BufferWriter 

更新的服务器代码:

 public void ServerRunning() throws IOException{ String message="SERVER HERE! \n"; <--- added \n here as well. sendMessage(message); do{ try{ message=input.readLine(); showMessage("\n"+message); }catch(EOFException eofException){ showMessage("\n Server ended the connection!"); } }while(message!="EXIT"); 

}

多谢你们!

将这段代码与我过去使用套接字编写的一些代码进行比较后,我注意到你使用的是output.write(string)input.readline() – 这些不能很好地混合, readline()期望换行并write不给出一。

println()替换write() println()