Socket Connection Timed Out 的问题

ndscsr 2013-05-01 06:48:46
想写一个简单的聊天程序,于是写了一个服务器程序,和两个客户端程序,两个客户端程序代码差不多,就是相互的连接端口号不同,客户端程序打开时先向服务器端通报自己的IP地址,之后两个客户端聊天时,先向服务器取得对方的IP地址,之后再向对方发送数据,我的客户端程序中,都开了个线程,在这个线程中也写ServerSocket的代码,用来接收消息,但是测试时,在两台电脑上,分别运行两个客户端程序,只有一方能发送成功,另一方发送时总是失败,提示java.net.ConnectException: Connection timed out: connect,把Socket关闭了也没用啊,求解,以下是代码,Test作获取客户端的IP地址的服务器,Client和Client1分别是客户端。客户端程序运行到点击发送按钮的事件处理的代码时,提示异常的那个就无法运行新建Socket的代码

import java.net.*;
import java.io.*;

public class Test
{
public static void main(String argv[])
{
int port=7;
String userip[]=new String[2];

try
{
ServerSocket srv=new ServerSocket(port);
System.err.println("Echo server start at port:"+port);

while(true)
{
Socket clnt=srv.accept();
DataInputStream dataIn=new DataInputStream(new BufferedInputStream(clnt.getInputStream()));
DataOutputStream dataOut=new DataOutputStream(new BufferedOutputStream(clnt.getOutputStream()));

String cc=String.valueOf(clnt.getInetAddress());

String ip=cc.substring(1,cc.length());

String req=dataIn.readUTF();
System.out.println(req);

if(req.equals("Client"))
{
userip[0]=ip;
System.out.println("Client初始化成功!");
}
else if(req.equals("Client1"))
{
userip[1]=ip;
System.out.println("Client1初始化成功!");
}
else if(req.equals("needClient1"))
{
dataOut.writeUTF(userip[1]);
dataOut.flush();
System.out.println(userip[1]);
}
else if(req.equals("needClient"))
{
dataOut.writeUTF(userip[0]);
dataOut.flush();
System.out.println(userip[0]);
}

dataIn.close();
dataOut.close();
}
}
catch(IOException ioe)
{
System.err.println(ioe);
}
}
}





import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class Client implements Runnable
{
private Socket sock;
private DataInputStream dataIn;
private DataOutputStream dataOut;

Label la,la1;
TextField tf,tf1;
Button bu;
String ip;

public static void main(String argv[])
{
new Client();
}

public Client()
{
Frame f=new Frame("Client");
la=new Label("请输入要发送的字符串:");
tf=new TextField();
la1=new Label("接收到的信息");
tf1=new TextField();
tf1.setEditable(false);
Panel pa=new Panel(new GridLayout(2,2));
pa.add(la);
pa.add(tf);
pa.add(la1);
pa.add(tf1);

makeConnection();
try
{
dataOut.writeUTF("Client");
dataOut.flush();
}
catch(IOException io)
{
System.err.println("Error"+io);
}

bu=new Button("发送");
bu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
makeConnection();

try
{
dataOut.writeUTF("needClient1");
dataOut.flush();
ip=dataIn.readUTF();
System.out.println("1");
InetAddress srvAddr=InetAddress.getByName(ip);
System.out.println("2");
Socket so=new Socket(srvAddr,1);
System.out.println("3");
dataOut=new DataOutputStream(new BufferedOutputStream(so.getOutputStream()));
send();
so.close();
}
catch(IOException io)
{
System.err.println("Error"+io);
}
}
});

f.add(pa,BorderLayout.NORTH);
f.add(bu,BorderLayout.CENTER);

f.pack();
f.setVisible(true);

Thread th=new Thread(this);
th.start();
}

private void makeConnection()
{
try
{
InetAddress srvAddr=InetAddress.getByName("221.205.48.54");

sock=new Socket(srvAddr,7);
dataOut=new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
dataIn=new DataInputStream(new BufferedInputStream(sock.getInputStream()));
System.out.println("Connection to server ok");
}
catch(IOException io)
{
System.err.println("Error:"+io);
}
}

private void send()
{
try
{
dataOut.writeUTF(tf.getText());
dataOut.flush();
}
catch(IOException IOE)
{
System.out.println(IOE);
}
}

public void run()
{
int port=3800;

try
{
ServerSocket srv=new ServerSocket(port);
System.err.println("Echo server start at port:"+port);

while(true)
{
Socket clnt=srv.accept();
DataInputStream dataIn=new DataInputStream(new BufferedInputStream(clnt.getInputStream()));

System.out.println("Clinet connected from:"+clnt.getInetAddress());
String req=dataIn.readUTF();

tf1.setText(req);
dataIn.close();
clnt.close();
}
}
catch(IOException ioe)
{
System.err.println(ioe);
}
}
}






import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class Client1 implements Runnable
{
private Socket sock;
private DataInputStream dataIn;
private DataOutputStream dataOut;

Label la,la1;
TextField tf,tf1;
Button bu;
String ip;

public static void main(String argv[])
{
new Client1();
}

public Client1()
{
Frame f=new Frame("Client1");
la=new Label("请输入要发送的字符串:");
tf=new TextField();
la1=new Label("接收到的信息");
tf1=new TextField();
tf1.setEditable(false);
Panel pa=new Panel(new GridLayout(2,2));
pa.add(la);
pa.add(tf);
pa.add(la1);
pa.add(tf1);

makeConnection();
try
{
dataOut.writeUTF("Client1");
dataOut.flush();
}
catch(IOException io)
{
System.err.println("Error"+io);
}

bu=new Button("发送");
bu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent ae)
{
makeConnection();
try
{
dataOut.writeUTF("needClient");
dataOut.flush();
ip=dataIn.readUTF();
System.out.println("4");
InetAddress srvAddr=InetAddress.getByName(ip);
System.out.println("5");
Socket so=new Socket(srvAddr,3800);
System.out.println("6");
dataOut=new DataOutputStream(new BufferedOutputStream(so.getOutputStream()));
send();
so.close();
}
catch(IOException io)
{
System.err.println("Error"+io);
}
}
});

f.add(pa,BorderLayout.NORTH);
f.add(bu,BorderLayout.CENTER);

f.pack();
f.setVisible(true);

Thread th=new Thread(this);
th.start();
}

private void makeConnection()
{
try
{
InetAddress srvAddr=InetAddress.getByName("221.205.48.54");

sock=new Socket(srvAddr,7);
dataOut=new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
dataIn=new DataInputStream(new BufferedInputStream(sock.getInputStream()));
System.out.println("Connection to server ok");
}
catch(IOException io)
{
System.err.println("Error:"+io);
}
}

private void send()
{
try
{
dataOut.writeUTF(tf.getText());
dataOut.flush();
}
catch(IOException IOE)
{
System.out.println(IOE);
}
}

public void run()
{
int port=1;

try
{
ServerSocket srv=new ServerSocket(port);
System.err.println("Echo server start at port:"+port);

while(true)
{
Socket clnt=srv.accept();
DataInputStream dataIn=new DataInputStream(new BufferedInputStream(clnt.getInputStream()));

System.out.println("Clinet connected from:"+clnt.getInetAddress());
String req=dataIn.readUTF();

tf1.setText(req);
dataIn.close();
clnt.close();
}
}
catch(IOException ioe)
{
System.err.println(ioe);
}
}
}
...全文
985 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyxk2012 2013-05-05
  • 打赏
  • 举报
回复
你们看到没,它的客户端,既有ServerSocket又有Socket! 这样算下来,有三个ServerSocket,两个Socket,好生怪异啊!! 看作者的意思就好像是服务器端的ServerSocket专门用来处理IP链接。 而客户端呢,既有ServerSocket又有Socket,一个接受消息,一个发送消息!!(这可能吗???) 好生怪异!!!!
zzfsd 2013-05-02
  • 打赏
  • 举报
回复
好像写的聊天的程序。都是同样的客户端吧在不同的机器上运行吧。这种两个客户端的确实没见过。可能是我比较孤陋寡闻吧。坐等大神来解决看看。
张某码 2013-05-01
  • 打赏
  • 举报
回复
我在想两个客户端的代码不是应该一样的吗?一起去连接服务器(连接服务器的端口也是一样的吧,服务器给出一个端口供所有的客户端连接),你这程序有点乱、、、C/S(客户端/服务器模式还要去看看)
七神之光 2013-05-01
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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