我在宿舍的两台电脑中分别运行写好的ServerSocket端和Socket端。但是运行是总是显示IP地址不对。
而我在自己电脑同时运行是可以通信的。 代码如下:
import java.io.IOException;
import java.net.*;
import java.io.*;
import java.util.*;public class ChatServer {
Socket s;
ServerSocket ss;
public static void main(String[] args) {
new ChatServer().start();
}
public void start(){
try {
ss=new ServerSocket(6666);
while(true){
s=ss.accept();
//System.out.println("connect complete!\n");
Client c=new Client(s);
new Thread(c).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("端口使用中...");
System.exit(-1);
}
}
class Client implements Runnable {
Socket s;
String str;
Client(Socket s){
this.s=s;
}
public void run() {
//InputStreamReader isr;
try {
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader bfr=new BufferedReader(isr);
while(true){
str=bfr.readLine();
if (str==null) {
System.out.println(s.getInetAddress().getHostName()+"下线了!");
bfr.close();
isr.close();
s.close();
break;
}
System.out.print(str+"\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.*;
import java.net.*;public class ChatClient extends Frame{
TextField tf;
TextArea taSum;
Socket s;
OutputStream os;
PrintStream ps;
String name;
public static void main(String[] args) {
ChatClient cc=new ChatClient();
// cc.launchFrame();
cc.connect();
cc.launchFrame();
}
public void launchFrame(){
setTitle("聊天室");
setBounds(new Rectangle(200,200,400,200));
setResizable(false);
setLayout(new BorderLayout());
tf=new TextField();
taSum=new TextArea("",8,50,TextArea.SCROLLBARS_VERTICAL_ONLY);
add(tf,BorderLayout.SOUTH);
add(taSum,BorderLayout.NORTH);
taSum.setEditable(false);
taSum.setBackground(Color.PINK);
tf.addActionListener(new tfMonitor()); this.addWindowListener(new WindowAdapter(){ @Override
public void windowClosing(WindowEvent arg0) {
try {
ps.close();
os.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setVisible(false);
System.exit(0);
}
});
pack();
setVisible(true);
}
class tfMonitor implements ActionListener { public void actionPerformed(ActionEvent e) {
ps.println(name+tf.getText());
taSum.append(name+tf.getText());
taSum.append("\n");
tf.setText("");
}
}
public void connect(){
try {
s=new Socket("SkySmile",6666);
System.out.println("服务器连接成功!\n");
os=s.getOutputStream();
ps=new PrintStream(os);
name=s.getLocalAddress().getHostName();
ps.println(name+"上线了!");
} catch (UnknownHostException e) {
System.out.println("IP地址错误!");
System.exit(-1);
} catch (IOException e) {
System.out.println("服务器连接失败!");
System.exit(-1);
}
}
}
而我在自己电脑同时运行是可以通信的。 代码如下:
import java.io.IOException;
import java.net.*;
import java.io.*;
import java.util.*;public class ChatServer {
Socket s;
ServerSocket ss;
public static void main(String[] args) {
new ChatServer().start();
}
public void start(){
try {
ss=new ServerSocket(6666);
while(true){
s=ss.accept();
//System.out.println("connect complete!\n");
Client c=new Client(s);
new Thread(c).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("端口使用中...");
System.exit(-1);
}
}
class Client implements Runnable {
Socket s;
String str;
Client(Socket s){
this.s=s;
}
public void run() {
//InputStreamReader isr;
try {
InputStreamReader isr = new InputStreamReader(s.getInputStream());
BufferedReader bfr=new BufferedReader(isr);
while(true){
str=bfr.readLine();
if (str==null) {
System.out.println(s.getInetAddress().getHostName()+"下线了!");
bfr.close();
isr.close();
s.close();
break;
}
System.out.print(str+"\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}}import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.*;
import java.net.*;public class ChatClient extends Frame{
TextField tf;
TextArea taSum;
Socket s;
OutputStream os;
PrintStream ps;
String name;
public static void main(String[] args) {
ChatClient cc=new ChatClient();
// cc.launchFrame();
cc.connect();
cc.launchFrame();
}
public void launchFrame(){
setTitle("聊天室");
setBounds(new Rectangle(200,200,400,200));
setResizable(false);
setLayout(new BorderLayout());
tf=new TextField();
taSum=new TextArea("",8,50,TextArea.SCROLLBARS_VERTICAL_ONLY);
add(tf,BorderLayout.SOUTH);
add(taSum,BorderLayout.NORTH);
taSum.setEditable(false);
taSum.setBackground(Color.PINK);
tf.addActionListener(new tfMonitor()); this.addWindowListener(new WindowAdapter(){ @Override
public void windowClosing(WindowEvent arg0) {
try {
ps.close();
os.close();
s.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
setVisible(false);
System.exit(0);
}
});
pack();
setVisible(true);
}
class tfMonitor implements ActionListener { public void actionPerformed(ActionEvent e) {
ps.println(name+tf.getText());
taSum.append(name+tf.getText());
taSum.append("\n");
tf.setText("");
}
}
public void connect(){
try {
s=new Socket("SkySmile",6666);
System.out.println("服务器连接成功!\n");
os=s.getOutputStream();
ps=new PrintStream(os);
name=s.getLocalAddress().getHostName();
ps.println(name+"上线了!");
} catch (UnknownHostException e) {
System.out.println("IP地址错误!");
System.exit(-1);
} catch (IOException e) {
System.out.println("服务器连接失败!");
System.exit(-1);
}
}
}
中"SkySmile"是什么?此处你应写ChatServer这台机器的IP地址.(除非你做了"SkySmile"这个名字与IP地址的映射)
2.尽量使用9000以后的端口;
3.服务器的多线程机制有问题,目前的代码只能有一个客户端连接;
s=new Socket("SkySmile",6666);
我的计算机主机名就是SkySmile,而且就算改成了Ip地址。客户端也连不上服务器。3.服务器的多线程机制有问题,目前的代码只能有一个客户端连接;
这个没问题。我的可以多个客户端向服务器发信息。这个服务器并不转发收到的信息。我发现我宿舍同一个交换机下的电脑互相Ping不通。。会不会是这个原因啊!!
我的计算机主机名就是SkySmile,而且就算改成了Ip地址。客户端也连不上服务器。
我发现我宿舍同一个交换机下的电脑互相Ping不通。。会不会是这个原因啊!!答:
1)不是你的机器名,也不是你的IP,而是那个服务器的IP.
2)互相Ping不通,有两处可能,一种是真正网络不通,另一种是网络通但设置成PING不响应.
你还是先用1)试一试.
3.ping不通话的,把你们2个机器都改成固定的ip。比如198.0.1.5和198.0.1.6
我觉得原因就出在这里
哈哈。。问题解决了。。就是防火墙没关。。其他的一切正常。我又把服务器加上了转发功能真的很好用哦。。
继续讨论。。我的飞鸽传书就能在Windows自带的防火墙开着的况下发信息啊。。
有没有什么方法使我的这个小程序也能做到这样??????