【问题标题】:Client not able to send message [closed]客户端无法发送消息[关闭]
【发布时间】:2016-07-29 11:44:13
【问题描述】:

这是一个简单的客户端-服务器程序,其中客户端发送文本,服务器将其显示在控制台上。这是我的代码:

我的服务器

import java.io.*;
import java.net.*;
public class MyServer {
public static void main(String args[]) throws IOException
 {
  ServerSocket socket=new ServerSocket(4444);
  Socket s=socket.accept();
  BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream()));

 String text;
 while(  (text=in.readLine())!=null)
  {  System.out.println(text);
   } 

 }

我的客户

 import java.io.*;
 import java.net.*;


 public class MyClient {
public static void main(String args[]) throws IOException
{ Socket socket=new Socket("localhost",4444);
PrintWriter out=new PrintWriter(socket.getOutputStream());
out.println("c:/users/pinder/desktop/happy.txt");



 }
 }

异常发生在 MyServer 类的 readLine() 语句中。 这是我得到的例外:

Exception in thread "main" java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:209)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:161)
at java.io.BufferedReader.readLine(BufferedReader.java:324)
at java.io.BufferedReader.readLine(BufferedReader.java:389)
at networking.MyServer.main(MyServer.java:25) 

【问题讨论】:

  • 关于为什么此代码不起作用的问题是题外话......
  • 程序正在做你期望它做的事情。您还没有解释错误是什么。
  • 哦,真的吗?我希望它打印客户端发送的消息,但它没有。我已经正确地提到了这个错误
  • 提示:只要你有一个Closeable 资源,如果你希望它干净地关闭并且不会出错,你应该调用close()
  • 当您遇到错误时,如果不打印,您希望 Java 做什么?

标签: java sockets client-server


【解决方案1】:

SocketException 是一个IOException(在main() 方法的throws 子句中。由于您没有正确关闭连接,因此阅读器抛出此错误,并由启动器打印。

如果您close() Socket 当另一端正在读取连接时,您将不会收到此错误。例如

public class MyServer {
    public static void main(String args[]) throws IOException {
        try (ServerSocket socket = new ServerSocket(4444);
             Socket s = socket.accept();
             BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()))) {

            String text;
            while ((text = in.readLine()) != null) {
                System.out.println(text);
            }
        }
    }
}
public class MyClient {
    public static void main(String[] args) throws IOException {
        try (Socket socket = new Socket("localhost", 4444);
             PrintWriter out = new PrintWriter(socket.getOutputStream())) {
            out.println("c:/users/pinder/desktop/happy.txt");
        }
    }
}

如果我运行 MyServer,然后运行 ​​MyClient,服务器会打印

 c:/users/pinder/desktop/happy.txt

【讨论】:

  • 是的,它有效。谢谢!
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 2013-04-24
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 2015-10-16
相关资源
最近更新 更多