标题:[求助]C/S的聊天程序
只看楼主
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
结帖率:66.67%
 问题点数:0 回复次数:28 
[求助]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
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
得分:0 
啊,我晕,我记得我以前不是写过好几个吗?

淘宝杜琨
2005-12-13 19:02
live41
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:67
帖 子:12442
专家分:0
注 册:2004-7-22
得分:0 
传个上来给我!
2005-12-13 19:50
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
噢,现在神还没给你?打它PP

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-12-13 20:38
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
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:0 
因你威望过高,没人敢回贴

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-12-15 13:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-37896-1-1.html




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

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