服务器端:import java.io.*;
import java.net.*;import javax.swing.*;
import java.net.*;
import java.awt.*;import java.awt.event.*; public class CreateServer extends JFrame implements Runnable
{
JTextField jtfName; //名字输入域
JTextArea jtaChat; //显示聊天信息
JTextArea jtaInput; //输入消息
JButton jbSend;
int sportNum=6000;
ServerSocket ss;
Socket s;
OutputStream os;
InputStream is;
byte[] buf=new byte[10*1024];
int len=0;
CreateServer()
{
super("服务器端");
setLocation(300,300);
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container=this.getContentPane();
JPanel p=new JPanel();
jtfName=new JTextField(10);
JButton linkToClient=new JButton("连接客户端");
JButton disconnect=new JButton("断开连接");
linkToClient.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jtaChat.append("正在等待客户端的连接..."); /////////// 疑问一
jtaChat.append("\n");
try
{
ss=new ServerSocket(sportNum);
s=ss.accept();
os=s.getOutputStream();
is=s.getInputStream();
{
//jtaChat.setText("");
}
/*if((is=s.getInputStream())!=null)
{
//jtaChat.setText("");
}*/
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
disconnect.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jtaChat.append("与客户端的连接已断开!");
jtaChat.append("\n");
try
{
os.close();
is.close();
ss.close();
s.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
p.add(new JLabel("昵称:"));
p.add(jtfName);
p.add(linkToClient);
p.add(disconnect);
container.add(p,BorderLayout.NORTH);
jtaChat=new JTextArea();
jtaChat.setLineWrap(true);
container.add(new JScrollPane(jtaChat,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
),BorderLayout.CENTER); Box box=new Box(BoxLayout.X_AXIS);
jtaInput=new JTextArea(3,20);
jtaInput.setLineWrap(true);
jbSend=new JButton();
jbSend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
replaceMessage();
jtaInput.setText("");
}
});
jbSend.setText("发送");
box.add(new JScrollPane(jtaInput,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ));
box.add(jbSend);
container.add(box,BorderLayout.SOUTH);
Action sendMessage = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
replaceMessage();
jtaInput.setText("");
}
};
jtaInput.getInputMap().put(KeyStroke.getKeyStroke("ENTER"),"send");
jtaInput.getActionMap().put("send",sendMessage);
}
private void replaceMessage()
{
try
{
jtaChat.append(jtfName.getText()+"说: ");
//jtaChat.append("\n");
jtaChat.append(jtaInput.getText());
jtaChat.append("\n");
os.write((jtfName.getText()+"说: "+jtaInput.getText()).getBytes());
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()
{
String str;
while(true)
{
try
{
len=is.read(buf);
str=new String(buf,0,len);
jtaChat.append(str);
jtaChat.append("\n");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) {
CreateServer cs=new CreateServer();
new Thread(cs).start();
}
}
因为篇幅的限制,客户端代码就不贴出来了,客户端代码跟服务器端差不多。疑问一:
jtaChat.append("正在等待客户端的连接...");我的意思是说开启服务器端,然后点击 连接客户端 ,这时应该在聊天显示内容的文本域中显示
"正在等待客户端的连接..."
可是问题是只有当点击客户端的 连接服务器端 按钮时,在客户端与服务器端建立连接以后才显示这段文字。这是为什么啊?疑问二:
如何在一方断开连接以后,在另一方显示一方已断开连接。 比如当点击服务器端的 断开连接 是,会立即在客户端的聊天显示内容的文本域中显示客户端断开连接的消息。这又怎么实现?疑问三:
我用两台机子做实验,我自己的机子开启服务器端,同学的机子开启客户端,然后他在客户端的ip输入中输入我的ip,我们想建立连接,为什么连接建立不了啊,点击程序也没有任何反应,程序好像死掉了。这又是为什么啊,怎么解决啊(我们之间已经建立网络连接)? 详细的话请看代码,麻烦有经验的高手帮忙,谢了啊!
import java.net.*;import javax.swing.*;
import java.net.*;
import java.awt.*;import java.awt.event.*; public class CreateServer extends JFrame implements Runnable
{
JTextField jtfName; //名字输入域
JTextArea jtaChat; //显示聊天信息
JTextArea jtaInput; //输入消息
JButton jbSend;
int sportNum=6000;
ServerSocket ss;
Socket s;
OutputStream os;
InputStream is;
byte[] buf=new byte[10*1024];
int len=0;
CreateServer()
{
super("服务器端");
setLocation(300,300);
setSize(400,300);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container container=this.getContentPane();
JPanel p=new JPanel();
jtfName=new JTextField(10);
JButton linkToClient=new JButton("连接客户端");
JButton disconnect=new JButton("断开连接");
linkToClient.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jtaChat.append("正在等待客户端的连接..."); /////////// 疑问一
jtaChat.append("\n");
try
{
ss=new ServerSocket(sportNum);
s=ss.accept();
os=s.getOutputStream();
is=s.getInputStream();
{
//jtaChat.setText("");
}
/*if((is=s.getInputStream())!=null)
{
//jtaChat.setText("");
}*/
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
disconnect.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
jtaChat.append("与客户端的连接已断开!");
jtaChat.append("\n");
try
{
os.close();
is.close();
ss.close();
s.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
});
p.add(new JLabel("昵称:"));
p.add(jtfName);
p.add(linkToClient);
p.add(disconnect);
container.add(p,BorderLayout.NORTH);
jtaChat=new JTextArea();
jtaChat.setLineWrap(true);
container.add(new JScrollPane(jtaChat,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
),BorderLayout.CENTER); Box box=new Box(BoxLayout.X_AXIS);
jtaInput=new JTextArea(3,20);
jtaInput.setLineWrap(true);
jbSend=new JButton();
jbSend.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
replaceMessage();
jtaInput.setText("");
}
});
jbSend.setText("发送");
box.add(new JScrollPane(jtaInput,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ));
box.add(jbSend);
container.add(box,BorderLayout.SOUTH);
Action sendMessage = new AbstractAction()
{
public void actionPerformed(ActionEvent e)
{
replaceMessage();
jtaInput.setText("");
}
};
jtaInput.getInputMap().put(KeyStroke.getKeyStroke("ENTER"),"send");
jtaInput.getActionMap().put("send",sendMessage);
}
private void replaceMessage()
{
try
{
jtaChat.append(jtfName.getText()+"说: ");
//jtaChat.append("\n");
jtaChat.append(jtaInput.getText());
jtaChat.append("\n");
os.write((jtfName.getText()+"说: "+jtaInput.getText()).getBytes());
}
catch(Exception e)
{
e.printStackTrace();
}
}
public void run()
{
String str;
while(true)
{
try
{
len=is.read(buf);
str=new String(buf,0,len);
jtaChat.append(str);
jtaChat.append("\n");
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
public static void main(String[] args) {
CreateServer cs=new CreateServer();
new Thread(cs).start();
}
}
因为篇幅的限制,客户端代码就不贴出来了,客户端代码跟服务器端差不多。疑问一:
jtaChat.append("正在等待客户端的连接...");我的意思是说开启服务器端,然后点击 连接客户端 ,这时应该在聊天显示内容的文本域中显示
"正在等待客户端的连接..."
可是问题是只有当点击客户端的 连接服务器端 按钮时,在客户端与服务器端建立连接以后才显示这段文字。这是为什么啊?疑问二:
如何在一方断开连接以后,在另一方显示一方已断开连接。 比如当点击服务器端的 断开连接 是,会立即在客户端的聊天显示内容的文本域中显示客户端断开连接的消息。这又怎么实现?疑问三:
我用两台机子做实验,我自己的机子开启服务器端,同学的机子开启客户端,然后他在客户端的ip输入中输入我的ip,我们想建立连接,为什么连接建立不了啊,点击程序也没有任何反应,程序好像死掉了。这又是为什么啊,怎么解决啊(我们之间已经建立网络连接)? 详细的话请看代码,麻烦有经验的高手帮忙,谢了啊!
我在学校的时候也写过这种简单的聊天程序,可以发份给你参考。