java socket总是连接不上

guoxiaoxi32 2010-10-27 10:42:01
我自己开发了一个socketservicer和socketClient。但是客户端有的时候连接的上有的时候连不上。连不上的时候总是出现这样的两种错误:
(1):
com.enterprisedt.net.ftp.ControlChannelIOException: Connection reset
at com.enterprisedt.net.ftp.FTPControlSocket.readLine(FTPControlSocket.java:1029)
at com.enterprisedt.net.ftp.FTPControlSocket.readReply(FTPControlSocket.java:1064)
at com.enterprisedt.net.ftp.FTPControlSocket.sendCommand(FTPControlSocket.java:988)
at com.enterprisedt.net.ftp.FTPClient.quit(FTPClient.java:4044)
at com.enterprisedt.net.ftp.FileTransferClient.disconnect(FileTransferClient.java:1034)
at Tools.FTP.edtftpj.uploadFile(edtftpj.java:26)
at main.main$MyThread.run(main.java:225)
………………
………………
(2):
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at Tools.Scoket.Scoket.CreatScoket(Scoket.java:19)
at main.main$MyThread.run(main.java:233)
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:178)
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4251)
at main.main$3.widgetSelected(main.java:178)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:228)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1003)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3823)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3422)
at main.main.main(main.java:192)

我总是找不到解决方法。求大家帮助,在线给分。。。
...全文
482 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
roclostr1987 2010-10-28
  • 打赏
  • 举报
回复
//接受服务器指令
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
while(str.length()==0){
Thread.sleep(1000);
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
str = br.readLine();
}
System.out.println("服务器:"+str);

你这段代码怎么写的这么诡异啊?
为什么要反复的去new BufferedReader呢?难道是等待服务端返回字符吗?
如果你使用BufferedReader是不需要等待的,因为代码走到readLine会自己等待流的。
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guoxiaoxi32 的回复:]
java.net.ConnectException: Connection refused: connect
[/Quote]
这种情况一般是服务器端的原因,要么是服务器端没有启动,或者说是防火墙处于启开状态!
楼主上面的贴出的代码感觉有些混乱,建议对代码重新进行封装,针对客户端的代码我习惯按下面的方式编写:

package com.ncs.client;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
private String host;
private int port;

private Socket client;

public Client(String host, int port) {
this.host = host;
this.port = port;
}

/**
* 与服务端建立连接
* @throws Exception
*/
public void connect() throws Exception {
client = new Socket();
client.connect(new InetSocketAddress(host, port));
}

/**
* 与设备建立连接
* @param timeout 超时时间
* @throws Exception
*/
public void connect(int timeout) throws Exception {
client = new Socket();
client.setSoTimeout(timeout);
client.connect(new InetSocketAddress(host, port));
}

/**
* 服务向服务器端发送数据
* @throws Exception
*/
public void send() throws Exception {
//do some thing
}

/**
* 服务接受服务端的数据
* 这个最好是客户端和服务端都协商好,用一个特殊符号作为结束标记。
* 不然无法知晓服务器端的数据是否发送结束。
* @return
* @throws Exception
*/
public byte[] receive() throws Exception {
//do some thing
return null;
}

public void close() {
try {
client.close();
} catch (IOException e) {}
client = null;
}
}

qingbt 2010-10-28
  • 打赏
  • 举报
回复
接收端用readline的话,写入端必须手工加"\n"
qybao 2010-10-27
  • 打赏
  • 举报
回复
Socket没close,再进入方法是,端口已经被占用了吧
guoxiaoxi32 2010-10-27
  • 打赏
  • 举报
回复
java.net.ConnectException: Connection refused: connect
guoxiaoxi32 2010-10-27
  • 打赏
  • 举报
回复
public void CreatScoket(String serviceIp,int servicePort,Text text) throws InterruptedException{
try {
String ipAdd = serviceIp;
int port = servicePort;
Socket s = new Socket(ipAdd,port);
String time = "";
TimeUtil timeUtil = new TimeUtil();
time = "和讯机构投资"+timeUtil.getString(3);
//发送服务器指令
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write(time);
System.out.println(time);
bw.flush();
//接受服务器指令
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = br.readLine();
while(str.length()==0){
Thread.sleep(1000);
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
str = br.readLine();
}
System.out.println("服务器:"+str);
bw.close();
br.close();


} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
System.out.println("服务器连接失败!");
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
System.out.println("服务器连接失败!!!");
e1.printStackTrace();
}
}
madFatso 2010-10-27
  • 打赏
  • 举报
回复
你至少贴点报错时的代码吧
meZhou 2010-10-27
  • 打赏
  • 举报
回复
在while循环中创建了过多了connection 没有及时的关闭 一般情况当创建了又没有关闭的connection达到400-500左右的时候就会有这个报错了 我把创建connection的那几句隐去之后
没有代码,所以网上找的
http://tieba.baidu.com/f?kz=604910306

50,523

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧