这几天又有一个挑战砸到了我的头。我正在尝试用Java创建一个FTP服务器,它应该能够与FileZilla FTP客户端通信。代码不是最好的,因为我尝试了很多方法来找出发生了什么。
这里的FileZilla日志从德语翻译
Status: Connect to 127.0.0.1:21...
Status: Connected!Waiting for welcome message.
Response: 220 localhost connected
Error: Establishing connection to server failed.
目前的主要问题是建立真正的联系。套接字已连接,我可以向客户端发送至少一条消息,但没有机会获取客户端输入,例如PASV、USER和PASS。
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import javax.swing.JButton;
import javax.swing.JFrame;
public class FTP_Server extends JFrame implements ActionListener, WindowListener {
private static final long serialVersionUID = 1L;
private Container cp;
private JButton btncon;
private ServerSocket listenSocket;
private Socket connectionSocket;
private DataOutputStream dos;
private DataInputStream dis;
private OutputStream os;
private InputStream is;
public FTP_Server() {
super("FTP Server");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
cp = this.getContentPane();
cp.setLayout(new BorderLayout());
btncon = new JButton("Connect");
btncon.addActionListener(this);
cp.add(btncon, BorderLayout.CENTER);
this.pack();
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource().equals(btncon)){
createConnection();
}
}
public void createConnection() {
System.out.println("Connecting...");
try {
listenSocket = new ServerSocket(21);
listenSocket.setSoTimeout(0);
connectionSocket = listenSocket.accept();
connectionSocket.setSoLinger(true, 0);
connectionSocket.setSoTimeout(0);
connectionSocket.setKeepAlive(true);
System.out.println("Connected!");
os = connectionSocket.getOutputStream();
dos = new DataOutputStream(os);
is = connectionSocket.getInputStream();
dis = new DataInputStream(is);
while(connectionSocket.isConnected() == true) {
dos.writeUTF("220 localhost connected\r\n");
//Will cause socket write error soon!
dos.flush();
dos.writeUTF("331 Anonym no password needed\r\n");
System.out.println(is.read());
}
} catch (SocketException exp) {
try {
listenSocket.close();
System.out.println("Disconnected");
exp.printStackTrace();
} catch (IOException exp2) {
exp2.printStackTrace();
}
} catch (IOException exp) {
exp.printStackTrace();
}
}
@Override
public void windowOpened(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
@Override
public void windowClosed(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowIconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeiconified(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowActivated(WindowEvent e) {
// TODO Auto-generated method stub
}
@Override
public void windowDeactivated(WindowEvent e) {
// TODO Auto-generated method stub
}
}
对于错误消息/打印堆栈:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.DataOutputStream.write(DataOutputStream.java:107)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:401)
at java.io.DataOutputStream.writeUTF(DataOutputStream.java:323)
at ftp.FTP_Server.createConnection(FTP_Server.java:82)
at ftp.FTP_Server.actionPerformed(FTP_Server.java:58)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)
我仍然无法发送信息。我现在所做的是为每个连接的套接字以及每个now输出流创建一个新线程。
package ftp;
import java.io.DataOutputStream;
import java.io.IOException;
public class MultiIO implements Runnable{
private DataOutputStream dos;
public MultiIO(DataOutputStream stream) {
dos = stream;
System.out.println("Set OutputStream.");
}
@Override
public void run() {
try {
dos.writeBytes("220");
dos.flush();
System.out.println("tried once");
} catch (IOException e) {
System.exit(-1);
}
}
}
现在的问题是FileZilla客户端无法获得220消息。
下面是新的套接字处理类。我是从甲骨文页面上抄的。
package ftp;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
public class MultiConnection implements Runnable{
private Socket cSocket;
public MultiConnection(Socket client) {
cSocket = client;
System.out.println("Connected!");
}
@Override
public void run() {
OutputStream os = null;
DataOutputStream dos = null;
try {
os = cSocket.getOutputStream();
dos = new DataOutputStream(os);
} catch (SocketException es) {
es.printStackTrace();
} catch (IOException e) {
System.exit(-1);
}
MultiIO mio;
mio = new MultiIO(dos);
Thread thio = new Thread(mio);
thio.start();
}
}
这里有很多错误。
这就足够了。
问题内容: 我正在寻找一种使用Go语言与UDP套接字进行客户端/服务器通信的好的解决方案。 我在Internet上找到的示例向我展示了如何将数据发送到服务器,但是没有讲授如何将数据发送回客户端。 为了演示,我的程序执行以下操作: 我的客户端程序在4444端口上创建一个套接字,如下所示: 我向服务器发送了字符串和本地地址,因此它可以打印字符串并发送OK消息。我为此使用gob: 我的数据结构如下所示:
我希望能够连接到需要智能卡的个人证书进行身份验证的https站点。我想我已经很接近让它工作了,但不知道如何克服这个例外: 由于合同关系,我不能共享我的代码,但这里有一个总结: 我创建了一个密钥库,其中包含从浏览器导出的所有证书。我使用此密钥存储作为SSLContext的信任存储。我非常肯定这个密钥库包含正确的CA证书来验证远程站点的证书,因为它修复了“无法找到请求目标的有效证书路径”的异常。 我可
我已经在Raspberry Pi上安装了MQTT,并为代理配置了Arduino Uno,但在/var/log/mosquitto/mosquitto.log文件中看到了以下条目: Pi是用有线到本地LAN的ETH0设置的,IP地址为192.168.1.50 在PI上还有一个WiFi AP设置。Arduino Uno通过WiFi连接以发送/接收MQTT消息。WiFi AP的IP地址为192.168.
我用Java编写了套接字客户端程序。我正在使用DataOutputStream向服务器套接字发送消息。有时DataOutputstream上的writed消息不会发送到ServerSocket。我想是因为我发了信息后没有脸红。我这样做,但没有用。如果我终止类执行,那么只有我从ServerSocket接收消息。 我的代码: 已完成将消息放入队列。无限while循环将负责向服务器套接字发送日志。 文件
首先我要感谢你花时间... 我在macbook中用C++创建了一个服务器套接字,在运行windows XP的不同机器中用Java创建了一个客户机/套接字。我已将端口指定为5000,但无法指定正确的主机,因此无法进行连接。当我在windows xp中使用WinSock2创建一个C++服务器/套接字时,当我使用本地主机时,连接是完美的...有什么想法吗??? 提前Thnx int main(int a
我对套接字协议非常陌生,我肯定问题来自于我对此几乎一无所知。但是基本上我在服务器端口5000上有一个套接字,我需要一个angularjs代码来监听这个套接字。服务器上的套接字可以读取我从另一台计算机(客户端)发送的任何内容。但是由于某种原因,angular代码不能监听/连接到插座。以下是我现在所拥有的: index.html 下面是angularjs代码: 在Firefox中: Firefox无法