产生原因
- 在创建客户端和服务端后,出现java.net.SocketException: Connection reset的错误。
-
导致的原因
- 客户端或者服务端其中一端还在传输数据的途中,另外一端的socket被关闭(或者主动0关闭,或者运行异常退出导致的关闭),这时,客户端的第一个数据包传输过来后就会引发该异常。
- 一端在退出时,未断开连接,另外一端仍旧在连接中读取数据,就会抛出该异常,简单来说就是连接断开后其中一端仍旧在进行读写操作导致的。
-
看错误代码:未及时关闭客户端连接,导致服务端仍旧在连接中读取数据。文章来源:https://www.toymoban.com/news/detail-707507.html
- 客户端代码:
-
package com.net.TCP;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//模拟客户端
public class TcpClient {
public static void main(String[] args) {
OutputStream os=null;
Socket socket =null;
//1.获取服务端的IP地址+端口号
try {
//获取IP地址
InetAddress getByName = InetAddress.getByName("127.0.0.1");
//获取端口号
int port=8080;
//创建一个Socket连接
socket = new Socket(getByName, port);
System.out.println("12");
//向连接发送数据,使用IO流
os= socket.getOutputStream();
os.write("你还号码".getBytes());
Thread.sleep(3000); // 1000毫秒,即1秒钟
} catch (Exception e) {
e.printStackTrace();
}
//未对连接进行关闭
}
}
}
2. 服务端代码:
package com.net.TCP;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//模拟TCP协议发送消息:三次握手
//模拟服务端接受数据
public class TcpService {
public static void main(String[] args) {
try {
//1.客户端需要拥有一个端口号
ServerSocket serverSocket = new ServerSocket(8080);
//等待客户连接
Socket accept = serverSocket.accept();
//读取客户信息
InputStream is = accept.getInputStream();
//使用管道流输出数据
//创建管道流对象
ByteArrayOutputStream bos = new ByteArrayOutputStream();
//创建管道流缓冲区
byte[] b=new byte[1024];
int len;
while ((len= is.read(b))!=-1){
System.out.println("23");
//通过管道流输出数据
bos.write(b,0,len);
}
System.out.println(bos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
只需要对两端的连接和数据流及时关闭就可以解决该问题文章来源地址https://www.toymoban.com/news/detail-707507.html
- 更改后客户端:
package com.net.TCP;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//模拟客户端
public class TcpClient {
public static void main(String[] args) {
OutputStream os=null;
Socket socket =null;
//1.获取服务端的IP地址+端口号
try {
//获取IP地址
InetAddress getByName = InetAddress.getByName("127.0.0.1");
//获取端口号
int port=8080;
//创建一个Socket连接
socket = new Socket(getByName, port);
System.out.println("12");
//向连接发送数据,使用IO流
os= socket.getOutputStream();
os.write("你还号码".getBytes());
Thread.sleep(3000); // 1000毫秒,即1秒钟
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 更改后服务端:
package com.net.TCP;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
//模拟TCP协议发送消息:三次握手
//模拟服务端接受数据
public class TcpService {
public static void main(String[] args) {
ByteArrayOutputStream bos =null;
InputStream is =null;
Socket accept =null;
try {
//1.客户端需要拥有一个端口号
ServerSocket serverSocket = new ServerSocket(8080);
//等待客户连接
accept = serverSocket.accept();
//读取客户信息
is = accept.getInputStream();
//使用管道流输出数据
//创建管道流对象
bos = new ByteArrayOutputStream();
//创建管道流缓冲区
byte[] b=new byte[1024];
int len;
while ((len= is.read(b))!=-1){
System.out.println("23");
//通过管道流输出数据
bos.write(b,0,len);
}
System.out.println(bos.toString());
} catch (IOException e) {
e.printStackTrace();
}
finally {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
accept.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
到了这里,关于在使用socket进行通信连接时出现java.net.SocketException: Connection reset的解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!