java窗口连接_关于客户端与服务器端连接的问题(图形界面)

本文介绍了一个使用Java实现的客户端和服务器端连接的示例,涉及图形界面操作。通过创建`CreateServer`和`CreateClient`类,实现了聊天应用的基本功能,包括连接、断开和消息传递。在实际运行中遇到三个问题:1) 文本提示显示时机;2) 断开连接后的通知;3) 多机连接失败。作者寻求解决方案。
摘要由CSDN通过智能技术生成

关于客户端与服务器端连接的问题(图形界面)

热度:592   发布时间:2011-03-22 10:43:26

关于客户端与服务器端连接的问题(图形界面)

服务器端:

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);  //初始化一个Box

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);  //在容器上增加box

Action sendMessage = new AbstractAction()

{  //发送消息Action

public void actionPerformed(ActionEvent e)

{

replaceMessage();  //更新消息显示框

jtaInput.setText("");

}

};

jtaInput.getInputMap().put(KeyStroke.getKeyStroke("ENTER"),"send");  //键盘事件处理,按受回车事件

jtaInput.getActionMap().put("send",sendMessage);  //回车时的处理(调用发送消息Action)

}

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();

}

}

客户端:

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.net.*;

import java.awt.*;

import java.awt.event.*;

public class CreateClient extends JFrame implements Runnable

{

JTextField jtfName;  //名字输入域

JTextField ipName;   //IP输入

JTextArea jtaChat;  //显示聊天信息

JTextArea jtaInput;  //输入消息

JButton jbSend;

int sportNum=6000;

Socket s;

OutputStream os;

InputStream is;

byte[] buf=new byte[10*1024];

int len=0;

CreateClient()

{

super("客户端");  //调用父类构造函数

setLocation(300,300);

setSize(520,300);  //设置窗口尺寸

setVisible(true);  //设置窗口可视

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  //关闭窗口时退出程序

Container container=this.getContentPane();  //得到容器

JPanel p=new JPanel();  //初始化一个面板

jtfName=new JTextField(5);  //初始化名字输入域

ipName=new JTextField(8);

JButton linkToServer=new JButton("连接服务器端");

JButton disconnect=new JButton("断开连接");

linkToServer.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

String ipstr=ipName.getText().trim();

try

{

if(ipstr.length()==0)

{

s=new Socket(InetAddress.getByName(null),sportNum);//如果想在一台机子上做连接,就不输入ip

}

else

s=new Socket(InetAddress.getByName(ipstr),sportNum);

os=s.getOutputStream();

is=s.getInputStream();

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

});

disconnect.addActionListener(new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

jtaChat.append("与服务器端的连接已断开!");

jtaChat.append("\n");

try

{

os.close();

is.close();

s.close();

}

catch(Exception ex)

{

ex.printStackTrace();

}

}

});

p.add(new JLabel("昵称:"));  //增加昵称标签

p.add(jtfName);  //增加名字输入域

p.add(new JLabel("输入服务器端IP:"));

p.add(ipName);

p.add(linkToServer);

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);  //初始化一个Box

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);  //在容器上增加box

Action sendMessage = new AbstractAction()

{  //发送消息Action

public void actionPerformed(ActionEvent e)

{

replaceMessage();  //更新消息显示框

jtaInput.setText("");

}

};

jtaInput.getInputMap().put(KeyStroke.getKeyStroke("ENTER"),"send");  //键盘事件处理,按受回车事件

jtaInput.getActionMap().put("send",sendMessage);  //回车时的处理(调用发送消息Action)

}

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());

jtaInput.setText("");

}

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)

{

CreateClient cc=new CreateClient();

new Thread(cc).start();

}

}

疑问一:

jtaChat.append("正在等待客户端的连接...");我的意思是说开启服务器端,然后点击 连接客户端 ,这时应该在聊天显示内容的文本域中显示

"正在等待客户端的连接..."

可是问题是只有当点击客户端的 连接服务器端 按钮时,在客户端与服务器端建立连接以后才显示这段文字。这是为什么啊?

疑问二:

如何在一方断开连接以后,在另一方显示一方已断开连接。 比如当点击服务器端的 断开连接 是,会立即在客户端的聊天显示内容的文本域中显示客户端断开连接的消息。这又怎么实现?

疑问三:

我用两台机子做实验,我自己的机子开启服务器端,同学的机子开启客户端,然后他在客户端的ip输入中输入我的ip,我们想建立连接,为什么连接建立不了啊,点击程序也没有任何反应,程序好像死掉了。这又是为什么啊,怎么解决啊(我们之间已经建立网络连接)?  详细的话请看代码,麻烦有经验的高手帮忙,谢了啊!----------------解决方案--------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值