java.net.SocketException:连接被对等重置:套接字写入错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16402351/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
java.net.SocketException: Connection reset by peer: socket write error
提问by Aayush
java.net.SocketException: Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.DataOutputStream.writeUTF(Unknown Source)
at java.io.DataOutputStream.writeUTF(Unknown Source)
at SignUp.setUser(SignUp.java:225)
at SignUp.jButton1_actionPerformed(SignUp.java:207)
at SignUp.access(SignUp.java:201)
at SignUp.actionPerformed(SignUp.java:135)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access0(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.awt.EventQueue.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Signup.java
注册.java
/********************************************************/
/* SignUp */
/********************************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import javax.swing.*;
/**
* Summary description for SignUp
*/
public class SignUp extends JFrame {
// Variables declaration
private JLabel jLabel1;
private JLabel jLabel2;
private JLabel jLabel3;
private JLabel jLabel4;
private JTextField jTextField1;
private JTextField jTextField2;
private JTextField jTextField3;
private JButton jButton1;
private JButton jButton2;
private JPanel contentPane;
private String username;
private String password;
private String port;
private Socket socket;
private DataOutputStream dos;
private DataInputStream dis;
private ImageIcon image1;
// End of variables declaration
public SignUp() {
super();
initializeComponent();
//
// TODO: Add any constructor code after initializeComponent call
//
this.setVisible(true);
}
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Windows Form Designer. Otherwise, retrieving design
* might not work properly. Tip: If you must revise this method, please
* backup this GUI file for JFrameBuilder to retrieve your design properly
* in future, before revising this method.
*/
private void initializeComponent() {
image1 = new ImageIcon("SIGNUP.jpg");
jLabel1 = new JLabel();
jLabel2 = new JLabel();
jLabel3 = new JLabel();
jLabel4 = new JLabel(image1);
jTextField1 = new JTextField();
jTextField2 = new JTextField();
jTextField3 = new JTextField();
jButton1 = new JButton();
jButton2 = new JButton();
contentPane = (JPanel) this.getContentPane();
//
// jLabel1
//
jLabel1.setText("NAME");
//
// jLabel2
//
jLabel2.setText("PASSWORD");
//
// jLabel3
//
jLabel3.setText("PORT");
//
// jLabel4
//
//jLabel4.setText("jLabel4");
//
// jTextField1
//
jTextField1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jTextField1_actionPerformed(e);
}
});
//
// jTextField2
//
jTextField2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jTextField2_actionPerformed(e);
}
});
//
// jTextField3
//
jTextField3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jTextField3_actionPerformed(e);
}
});
//
// jButton1
//
jButton1.setText("SUBMIT");
jButton1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
//
// jButton2
//
jButton2.setText("RESET");
jButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton2_actionPerformed(e);
}
});
//
// contentPane
//
contentPane.setLayout(null);
addComponent(contentPane, jLabel1, 55, 100, 100, 40);
addComponent(contentPane, jLabel2, 55, 157, 100, 40);
addComponent(contentPane, jLabel3, 55, 210, 100, 40);
addComponent(contentPane, jLabel4, 25, 10, 300, 75);
addComponent(contentPane, jTextField1, 189, 99, 120, 40);
addComponent(contentPane, jTextField2, 188, 153, 120, 40);
addComponent(contentPane, jTextField3, 190, 209, 120, 40);
addComponent(contentPane, jButton1, 65, 267, 100, 40);
addComponent(contentPane, jButton2, 189, 265, 100, 40);
//
// SignUp
//
this.setTitle("SignUp - extends JFrame");
this.setLocation(new Point(0, 0));
this.setSize(new Dimension(370, 366));
}
/** Add Component Without a Layout Manager (Absolute Positioning) */
private void addComponent(Container container, Component c, int x, int y,
int width, int height) {
c.setBounds(x, y, width, height);
container.add(c);
}
//
// TODO: Add any appropriate code in the following Event Handling Methods
//
private void jTextField1_actionPerformed(ActionEvent e) {
System.out
.println("\njTextField1_actionPerformed(ActionEvent e) called.");
// TODO: Add any handling code here
}
private void jTextField2_actionPerformed(ActionEvent e) {
System.out
.println("\njTextField2_actionPerformed(ActionEvent e) called.");
// TODO: Add any handling code here
}
private void jTextField3_actionPerformed(ActionEvent e) {
System.out
.println("\njTextField3_actionPerformed(ActionEvent e) called.");
// TODO: Add any handling code here
}
private void jButton1_actionPerformed(ActionEvent e) {
System.out.println("\njButton1_actionPerformed(ActionEvent e) called.");
// TODO: Add any handling code here
username = jTextField1.getText();
password = jTextField2.getText();
port = jTextField3.getText();
setUser(username, password, port);
}
private void jButton2_actionPerformed(ActionEvent e) {
System.out.println("\njButton2_actionPerformed(ActionEvent e) called.");
// TODO: Add any handling code here
}
public void setUser(String username, String password, String port) {
try {
new source();
if (true) {
socket = new Socket("localhost", 3306);
dos = new DataOutputStream(socket.getOutputStream());
source.gdelete();
dos.writeUTF("Signup");
dos.writeUTF("user");
dos.writeUTF("pass");
dos.writeUTF(port);
dis = new DataInputStream(socket.getInputStream());
String response = dis.readUTF();
if (response.equalsIgnoreCase("success")) {
System.out.println("Success...");
} else {
System.out.println("Failure...");
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
//
// TODO: Add any method code to meet your needs in the following area
//
// ============================= Testing ================================//
// = =//
// = The following main method is just for testing this class you built.=//
// = After testing,you may simply delete it. =//
// ======================================================================//
public static void main(String[] args) {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
/*try {
UIManager
.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception ex) {
System.out.println("Failed loading L&F: ");
System.out.println(ex);
}*/
new SignUp();
}
// = End of Testing =
}
Basically in my app am trying to create a sender and a receiver. But am not able to signup the user. keep getting this error have tried online solutions but its not helping.
基本上在我的应用程序中我试图创建一个发送者和一个接收者。但我无法注册用户。不断收到此错误已尝试在线解决方案,但无济于事。
socket = new Socket("localhost", 3306);//when I change the port number I get an error saying connection refused.
dos = new DataOutputStream(socket.getOutputStream());
source.gdelete();
dos.writeUTF("Signup");//the exception is raised the moment I hit the next line
dos.writeUTF("user");
dos.writeUTF("pass");
dos.writeUTF(port);
回答by Kenster
Connection reset by peergenerally means the program handling the remote end of the TCP connection has crashed or exited without closing its end of the socket. In this case, "the remote end of the TCP connection" is whatever server you are connecting to at localhost:3306.
对等端的连接重置通常意味着处理 TCP 连接远程端的程序崩溃或退出,而没有关闭其端的套接字。在这种情况下,“TCP 连接的远程端”是您在 localhost:3306 连接到的任何服务器。
Some of the code that you included in an early revision of this question suggests that there is a MySQL server running on localhost:3306
, yet in Signup()
you are making a direct TCP connection to that port and writing data to the socket, instead of using JDBC. I suspect the problem is that you're connecting to a MySQL server, and it is getting data from your program which doesn't match what it expects to get from a client, and it is dropping the connection resulting in the "connection reset" message.
您在此问题的早期修订版中包含的一些代码表明,有一个 MySQL 服务器正在运行localhost:3306
,但Signup()
您正在与该端口建立直接 TCP 连接并将数据写入套接字,而不是使用 JDBC。我怀疑问题在于您正在连接到 MySQL 服务器,并且它正在从您的程序中获取与它期望从客户端获取的数据不匹配的数据,并且它正在断开连接,导致“连接重置”信息。
If you want to communicate with a MySQL server, you should be using JDBC and a MySQL driver. Here is an exampleof using JDBC to communicate with a MySQL Server. Pay special attention to the readDataBase()
function in the example; it shows the correct way to connect to the server.
如果要与 MySQL 服务器通信,则应使用 JDBC 和 MySQL 驱动程序。这是使用 JDBC 与 MySQL 服务器通信的示例。特别注意readDataBase()
例子中的函数;它显示了连接到服务器的正确方法。
回答by user207421
The usual cause for this exception is writing to a connection that has already been closed by the peer. In other words, an application protocol error. As you appear to be writing directly to a MySQL port, that's not surprising. Use JDBC.
此异常的通常原因是写入已被对等方关闭的连接。换句话说,应用程序协议错误。由于您似乎是直接写入 MySQL 端口,因此这并不奇怪。使用 JDBC。
Other possibilities include a remote application crash, firewall, cable pull, etc.
其他可能性包括远程应用程序崩溃、防火墙、电缆拉扯等。