Java 聊天室 - 为啥我收到 SocketException?
Posted
技术标签:
【中文标题】Java 聊天室 - 为啥我收到 SocketException?【英文标题】:Java Chat Room- Why am I getting a SocketException?Java 聊天室 - 为什么我收到 SocketException? 【发布时间】:2012-05-26 07:12:00 【问题描述】:我正在使用简单的套接字-套接字连接创建一个聊天室。 我有一个服务器和客户端程序。服务器在端口 225 上运行,然后当我在端口 225 上运行客户端以便它们可以读取/写入套接字时,客户端立即停止并显示错误消息
java.net.SocketException: Connection resetJava Result: 1
为什么会抛出这个异常?连接成功,该行打印到控制台,如图:
try
client = new Socket(serverAdress, portNumber);
System.out.println("Successful connection to server on port " + portNumber + ".");
那为什么连接不上呢?
这是异常跟踪...
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at schoolroom10.SchoolRoomClient.SchoolRoomClientWindow.main(SchoolRoomClientWindow.java:85)
这是我的服务器代码...
public class SchoolRoomServer
// 'server' will create the server over the local port:
static ServerSocket serverSocket = null;
//Socket for listening:
static Socket clientcommunicate = null;
//portnum is the number of the local port. Change to required port before running.
static int portnum = 225;
public static void main(String[] args) throws IOException
try
serverSocket = new ServerSocket(portnum);
clientcommunicate = serverSocket.accept();
Communicate c = new Communicate(Communicate.server);
Thread t = new Thread(c);
t.start();
catch (UnknownHostException uhe)
System.err.println(uhe);
System.exit(1);
catch (IOException ioe)
System.err.println(ioe);
System.exit(1);
class Communicate implements Runnable
public static Socket server;
Communicate(Socket server)
Communicate.server = server;
public void run()
String in = "";
try
//i/o for clients:
PrintStream output = new PrintStream(server.getOutputStream());
BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
String message;
//Message handling:
while(((message = input.readLine()) != null) && (!in.equals(".")))
output.println(message);
catch (IOException ioe)
System.err.println(ioe);
【问题讨论】:
请写完整的堆栈跟踪。 'server' 在 Communicate 类中不应是静态的。 【参考方案1】:正如之前的海报所指出的,您应该避免使用低于 1024 的端口,因为这些端口是保留的。
没有看到你所有的代码,剩下的只是猜测,但是在客户端,你应该进入一个循环,不断地从输入流中准备好并处理传入的消息,然后在重复之前短暂暂停,例如睡眠(100)。用于监控连接请求和传入消息的同一服务器端。
如果您不继续读取输入流,它将填充缓冲区并丢弃连接并出现异常。
【讨论】:
【参考方案2】:“连接重置”通常意味着您已写入已被另一端关闭的连接。一般来说,这是一个应用程序协议错误。但是在某些情况下,例如在对等点是浏览器的情况下,或者在您的情况下,这只是对等点可能随时选择离开这一事实的必然结果。在这些情况下,您所能做的就是关闭套接字并忘记连接。
【讨论】:
以上是关于Java 聊天室 - 为啥我收到 SocketException?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我在 ProcessBuilder --Java 中收到 IllegalThreadStateException 错误?
为啥我不断收到“java.net.MalformedURLException:无协议”[重复]