服务器收不到客户端消息,java - 服务器没有收到来自客户端的消息(reader.readLine()== null?)...

所以我一直在做一个简单的聊天,比有一台服务器和一群客户端连接到它们。在客户端,我有类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 writers = ServerClientConnector.getWriters();

for (PrintWriter pr : writers){

pr.println(message + "\n");

pr.flush();

}

}

}

的周期到达“线程:等待消息发送...”,但没有更进一步,reader.readLine()返回null(用sysout检查:))。我试图去调试它,但是我没有那么有经验,尤其是调试两个单独的代码。我一直在看这个为期3天,而我在这里严重受阻。

+0

你能后,从客户端发送消息,以及代码?顺便说一下,在WaitAndSendToAllFrom-> run-> while(message!= null)时你有一个无限循环' - 在while.loop中没有办法改变消息,所以它会循环并永远循环(即使它不是'你要求的问题,可能是下一个问题)。 –

+0

我编辑过这篇文章,写的不多,但我相信这就是需要的一切:)。提前为其他错误/错误 - 我知道代码需要改变一点点和重构,但现在我专注于那些该死的插座/读者/作家:)。 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值