社区
Java SE
帖子详情
网络通讯中,监听线程类在运行情况下如何更改监听端口号?
BatiTan
2008-04-22 05:40:36
实现功能如下: 如服务器启动监听线程后,一直在监听某一设置端口
现在是要改变监听的端口,该如何去实现?类似网络点对点通讯实现
...全文
233
15
打赏
收藏
网络通讯中,监听线程类在运行情况下如何更改监听端口号?
实现功能如下: 如服务器启动监听线程后,一直在监听某一设置端口 现在是要改变监听的端口,该如何去实现?类似网络点对点通讯实现
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
BatiTan
2008-04-24
打赏
举报
回复
[Quote=引用 10 楼 jiangnaisong 的回复:]
答:我都不明白,一个简单的问题,为什么都要搞得那么的复杂。
1)注意:楼主的网络通信是UDP通信。
2)因此:楼主在使用:ds.receive(UDP)包时,为了让接受线程不能一直在等待,应在创建DatagramSocket之后,立即使用:ds.setSoTimeout(毫秒)超时选项。时间…
[/Quote]你说的设置超时可以考虑,我觉得
在超时异常出现后应该可以进行下一次接受等待吧.
中间判断如果端口号改变,就新建一个监听新端口的接收线程,否则就继续执行原来的线程
还是你的意思是关掉当前监听线程,再重新开一个新的啊...
BatiTan
2008-04-24
打赏
举报
回复
不好意思,刚才还有格式的
发表上去之后就没有格式了,看起来要麻烦一点了
BatiTan
2008-04-24
打赏
举报
回复
这是我的接收线程类,负责数据的接收,同时里面调用了对接收数据的解析方法,并将解析后的数据显示到对应的文本区域内
package comm;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.Date;
import ui.MainFrame;
/**
* 接收信息线程类
* @author HUHG
*
*/
public class RecvThread extends Thread {
private MainFrame mainFrame;
private DatagramSocket dataSocket;
private DatagramPacket dataPacket;
private int port;
//设置返回字符串信息,没有返回信息时返回NO INFORMATION
private String recvString= "NO INFORMATION";
public RecvThread(MainFrame mainFrame){
this.mainFrame= mainFrame;
this.port= 5001;
}
public RecvThread(int port){
this.port= port;
}
public RecvThread(MainFrame mainFrame, int port){
this.mainFrame= mainFrame;
this.port= port;
}
/*
* (non-Javadoc)
* @see java.lang.Thread#run()
*/
public void run(){
try{
dataSocket= new DatagramSocket(port);
}catch(SocketException e){
e.printStackTrace();
}
while(true){
try{
byte[] data= new byte[1024];
dataPacket= new DatagramPacket(data,1024);
dataSocket.receive(dataPacket);
recvString= ParseData.parse(dataPacket, this.mainFrame.getID(), (byte)(this.mainFrame.getCom()),this.mainFrame.isFilterFlag());
this.mainFrame.getRecvArea().append(new Date()+ "\n "+ recvString+ "\n"); //将接收返回信息显示到显示文本区域
}catch(SocketException e){
e.printStackTrace();
}catch(IOException ex){
ex.printStackTrace();
}
}
}
/**
* 返回接收到的数据信息字符串
* @return String 返回接收的返回信息
*/
public String recv(){
return recvString;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/**
* 返回接收线程的监听端口
* @return
*/
public int getPort() {
return port;
}
/**
* 设置接收线程的监听端口
* @param port
*/
public void setPort(int port) {
this.port = port;
}
}
云上飞翔
2008-04-24
打赏
举报
回复
[Quote=引用 14 楼 BatiTan 的回复:]
引用 10 楼 jiangnaisong 的回复:
答:我都不明白,一个简单的问题,为什么都要搞得那么的复杂。
1)注意:楼主的网络通信是UDP通信。
2)因此:楼主在使用:ds.receive(UDP)包时,为了让接受线程不能一直在等待,应在创建DatagramSocket之后,立即使用:ds.setSoTimeout(毫秒)超时选项。时间…
你说的设置超时可以考虑,我觉得
在超时异常出现后应该可以进行下一次接受等待吧.
中间判断如果端口号改变,就新建一个…
[/Quote]
答:原来的线程不要去关闭它,当然你想关就关吧。完全可以使用原来的线程:若读操作超时,您想继续在老的端口上监听收包,你就继续调:ds.receive(UDP包),若想换一个端口号,你就关闭老的socket,(ds.close())然后,在同一个线程中,创建一个新的DatagramSocket(新端口号),用ds.receive(UDP包)接收。
也可以
新创建一个线程,在其中创建一个新的DatagramSocket(新端口号),用ds.receive(UDP包)接收。老的那个线程在老的端口号上继续监听一段时间(这个时间就是你的过渡时间,在这个过渡时间,你通过发UDP包通知你的客户机端口号到几月几号要变了,让他们有个准备时间),这个过渡时间一过,你再关闭这个老的线程(及其老的ds.close())
以上仅供你参考
云上飞翔
2008-04-23
打赏
举报
回复
[Quote=引用楼主 BatiTan 的帖子:]
实现功能如下: 如服务器启动监听线程后,一直在监听某一设置端口
现在是要改变监听的端口,该如何去实现?类似网络点对点通讯实现
[/Quote]
答:我都
不明白
,一个简单的问题,为什么都要搞得那么的复杂。
1)注意:楼主的网络通信是UDP通信。
2)因此:楼主在使用:ds.receive(UDP)包时,为了让
接受线程不能一直在等待
,应在创建DatagramSocket之后,立即使用:ds.setSoTimeout(毫秒)超时选项。时间一到,ds.receive()就抛出java.net.SocketTimeoutException,接收数据的线程就不会一直在等待。
3)楼主随时可用:new DatagramSocket(port)打开新的监听端口号。老的监听端口号,若想不用时,可直接在接收数据的线程超时或数据处理之后,直接关闭就行了。(不过此时:没有接到端口号改变的客户机,数据将都发错了。)怎么办?可在改变端口号之前,留一个缓冲时间,在这个时间段,老端口继续接收数据,但同时发回响应UDP包给客户机,通知它“端口号”将改变就行了。
4)补充说明:对于楼主的ds.disconnect()方法,看来楼主错用了。ds.disconnect()方法是用于关闭“连接型”UDP的,不是关闭“Socket”监听的。而是只能用于“客户机方”的。
lifanfly
2008-04-23
打赏
举报
回复
应该是没有好的方法吧,端口号是服务器和客户机要对应的,你更改一方另一方也需要更改。
hmsuccess
2008-04-22
打赏
举报
回复
用代理或守护进程
llpgy
2008-04-22
打赏
举报
回复
java2000_net 说的没看明白呀,能否给个例子
1、配置文件
原线程定时检查文件中配置的端口号,如果改变了就使用新端口
2、原线程实现一个改变监听端口的方法并做好同步
public class myThread extends Thread{
int port=0;
int oldport=0;
boolean isChanged=false;
boolean canChange=false;
public synchronized boolean setPort(int port){
while (true)
{
if (canChange)
{
isChanged = true;
oldport=this.port;
this.port = port;
return true;
}
else
{
try
{
sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
return false;
}
}
}
}
public void run(){
boolean goon=true;
while(goon){
try
{
sleep(1000);
canChange=false;
if(isChanged){
stopOldport();
isChanged=false;
}
listern();
canChange=true;
}
catch (InterruptedException e)
{
e.printStackTrace();
goon=false;
}
}
}
private void stopOldport()
{
//your code
}
private void listern(){
//your code
}
}
BatiTan
2008-04-22
打赏
举报
回复
[Quote=引用 3 楼 java2000_net 的回复:]
简单,新侦听一个端口,然后把以前的链接做一个代理转过来,
老端口不再接收新的链接!
也就是
老
老+新
新
做一个平滑过渡就可以了!
[/Quote]这个技术有点深奥,暂时还搞不懂
....代理,用到了设计模式?
BatiTan
2008-04-22
打赏
举报
回复
[Quote=引用 1 楼 flyinsky10 的回复:]
监听线程自己实现一个改变监听端口的方法,让服务通过这个方法通知线程改变。别人是没有办法改变监听端口的。
[/Quote]这个可以改变监听端口,但是接收线程在接收到数据前是一直阻塞的
即使我改变了端口还是不起作用的
BatiTan
2008-04-22
打赏
举报
回复
[Quote=引用 2 楼 joejoe1991 的回复:]
把原来的端口关掉,再开一个端口就行了吧?
[/Quote]这个怎么讲...?
我现在就是DatagramSocket recvSocket= new DatagramSocket(5001);
把原来的端口关掉是: recvSocket.disconnect();
还是我上面的直接把该接收线程强制关掉,再重新创建?
BatiTan
2008-04-22
打赏
举报
回复
现在我的实现是将原来线程关掉
再重新创建一个新的监听端口接收线程
功能是实现了...就是把原来的线程强制关掉了~~
老紫竹
2008-04-22
打赏
举报
回复
简单,新侦听一个端口,然后把以前的链接做一个代理转过来,
老端口不再接收新的链接!
也就是
老
老+新
新
做一个平滑过渡就可以了!
joejoe1991
2008-04-22
打赏
举报
回复
把原来的端口关掉,再开一个端口就行了吧?
flyinsky10
2008-04-22
打赏
举报
回复
监听线程自己实现一个改变监听端口的方法,让服务通过这个方法通知线程改变。别人是没有办法改变监听端口的。
C#基于TCP的Socket多
线程
通信(包含服务端和客户端)
C#基于TCP的Socket多
线程
通信(包含服务端和客户端) 代码都有注释,方便新手阅读
android在wifi下手机与电脑的socket通信
代码完整,手机做服务端,电脑做客户端;也可以反过来,电脑做服务端,手机做客户端。修改积分000000000000000000000000000
C#Socket通信实例
此资源是一款WinFrom程序,客户端与服务器端互发数据
VC几个网络服务器端编程模型的示例代码
我的文章的配套代码,关于VC服务器端网络编程模型的,详情请见http://blog.csdn.net/PiggyXP/archive/2004/09/23/114883.aspx
Android UDP通讯工具
一个简单的Android UDP通讯工具
Java SE
62,623
社区成员
307,257
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章