| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1747 人关注过本帖
标题:[求助]C/S的聊天程序
取消只看楼主 加入收藏
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
收藏
 问题点数:0 回复次数:19 
[求助]C/S的聊天程序

//服务器端的监听。。。

//停止按钮jButton2...
private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {

try{
//isListen = false;
socket.close();
socket = null;
}
catch(Exception e)
{
}

jTextField1.setText("Waiting...");
jButton1.setEnabled(true);
jButton2.setEnabled(false);
}

//开始监听按钮jButton1...
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {

try{
//将socket连接到本机的一个可用的端口上
socket = new DatagramSocket(sport);
//System.out.println("Listening on port:" + socket.getLocalPort());

jTextField1.setText("Listening on port: " + socket.getLocalPort());
}
catch(Exception e)
{
//System.out.println("Error: " + e);
//jTextArea1.setText("Error: " + e);
}

//jTextField1.setText(state);
jButton1.setEnabled(false); //.disable();
jButton2.setEnabled(true);

if(socket==null)
return;

//*
while(true)
{
try{
InetAddress address;
int cport;
byte[] buf = new byte[1000];

//接收数据报...到缓冲字节
packet = new DatagramPacket(buf,buf.length);
socket.receive(packet);

//输出数据报的内容
String sReceive = new String(packet.getData());
//System.out.println("Received from client: " + sReceive);
//sReceive = "Received from client: " + sReceive;
jTextArea1.append("Received from client: " + sReceive + "\n");

//从数据报获取客户端的源地址和端口
address = packet.getAddress();
cport = packet.getPort();

//发送数据报给客户端以应答...确认接收
String sResponse = "Your packet is received";
sResponse.getBytes(0,sResponse.length(),buf,0);
//生成发送的数据报...到缓冲字节
packet = new DatagramPacket(buf,buf.length,address,cport);
socket.send(packet);

socket.close();
socket = null;
break;

}
catch(Exception e)
{
System.out.println("Error: " + e);
}
}
//*/
}



//客户端的发送。。。

//发送按钮
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {

String hostAddress = ""; //服务器端IP地址
int localPort = 0; //本地端口
int hostPort = 0; //服务器端端口

if(jTextField1.getText()==null && jTextField2.getText()==null && jTextField3.getText()==null)
{
System.out.println("input local address & port, server port.");
System.exit(0);
}
else
{
//分别从jTextField123输入信息
hostAddress = jTextField1.getText();
localPort = Integer.parseInt(jTextField2.getText());
hostPort = Integer.parseInt(jTextField3.getText());
}

InetAddress address;
int port;
byte[] buf = new byte[1000];
String sSend = "Hello, Queenie!"; //发给服务器端的文字

try{
socket = new DatagramSocket(localPort); //绑定到本地端口
address = InetAddress.getByName(hostAddress); //从服务器名字获取其IP地址
port = hostPort; //服务器端口

sSend.getBytes(0,sSend.length(),buf,0); //将发送文字放进buf,二进制形式
packet = new DatagramPacket(buf,buf.length,address,port); //绑定buf为数据报
socket.send(packet);

for(int i=0;i<buf.length;i++)
buf[i] = 0;

//接收从服务器端返回的消息
packet = new DatagramPacket(buf,buf.length);
socket.receive(packet);
sSend = new String(packet.getData());

//System.out.println("Received from server: " + sSend);
jTextArea1.append("Received from server: " + sSend);

socket.close();
}
catch(Exception e)
{
System.out.println("Error: " + e);
}
}


问题在于,客户端和服务器端只能发送一次,
因为如果不加蓝色那三句,服务器端就会死循环,停不下来。
我想一直监听,然后客户端发信息,服务器端就显示出来。
谁帮忙解决此问题??

[此贴子已经被作者于2005-12-12 9:44:46编辑过]

搜索更多相关主题的帖子: 服务器 socket false java 
2005-12-12 09:30
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
斑竹们,英雄们,想想解决办法,或者提供一个简单的聊天程序给小弟啊!
2005-12-12 09:46
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
传个上来给我!
2005-12-13 19:50
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
臭神,我自己解决算了,我知道我的程序错在哪里了。
2005-12-14 09:36
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
对了,有没有高手告诉我怎么创建线程。

程序的bug在于,监听那里的while需要用线程来调用,否则停不下来,连控件都消失了。


try{
//将socket连接到本机的一个可用的端口上
socket = new DatagramSocket(sport);
//System.out.println("Listening on port:" + socket.getLocalPort());

jTextField1.setText("Listening on port: " + socket.getLocalPort());
}
catch(Exception e)
{
//System.out.println("Error: " + e);
//jTextArea1.setText("Error: " + e);
}

//jTextField1.setText(state);
jButton1.setEnabled(false); //.disable();
jButton2.setEnabled(true);

if(socket==null)
return;

//*
while(true)
{
try{
InetAddress address;
int cport;
byte[] buf = new byte[1000];

//接收数据报...到缓冲字节
packet = new DatagramPacket(buf,buf.length);
socket.receive(packet);

//输出数据报的内容
String sReceive = new String(packet.getData());
//System.out.println("Received from client: " + sReceive);
//sReceive = "Received from client: " + sReceive;
jTextArea1.append("Received from client: " + sReceive + "\n");

//从数据报获取客户端的源地址和端口
address = packet.getAddress();
cport = packet.getPort();

//发送数据报给客户端以应答...确认接收
String sResponse = "Your packet is received";
sResponse.getBytes(0,sResponse.length(),buf,0);
//生成发送的数据报...到缓冲字节
packet = new DatagramPacket(buf,buf.length,address,cport);
socket.send(packet);

socket.close();
socket = null;
break;

}
catch(Exception e)
{
System.out.println("Error: " + e);
}

把这段代码,变成函数,然后用线程来调用就可以了。

但是谁告诉我怎么用线程来调用,小的只会C#。
2005-12-14 09:53
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
唉,有问题啊,好烦啊!!!

ls1 = new Listen(1777); //ls1是线程对象
ls1.start();
jTextField1.setText(ls1.MsgPort()); //获取ls1对象中的变量
jTextArea1.setText(ls1.MsgReceive());

但是问题是,线程是启动了,函数却没返回,为什么?
2005-12-15 01:10
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
同志们,进来的都是初学者吗?版主呢?

帮一下忙吧。
2005-12-15 13:43
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
傻啊,那我下次用马甲问,快帮忙!
2005-12-15 15:12
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
现在问题已经解决大半了,控件消失是因为在收到packet然后送到JText的两个控件时因为用了GridBagLayout,所以会自动变形,

但是如果用Null Layout的话运行时要自己把窗体拉开。

等一下,我把问题详细的写上来。

[此贴子已经被作者于2005-12-15 15:30:35编辑过]

2005-12-15 15:14
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


1、如果用Null Layout,就会变成这样子,好麻烦!




图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


2、如果用GridBagLayout便可以运行时看到完整的界面,不用手动拉大。





图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


3、但是用了GridBagLayout,后果是,当接收到信息并显示到Text控件上的时候,由于窗体布局变形而令到控件都跑了,而在Null Layout布局并不出现这种情况。


[此贴子已经被作者于2005-12-15 15:35:02编辑过]

2005-12-15 15:33
快速回复:[求助]C/S的聊天程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014500 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved