请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
查看: 176|回复: 0

[求助] TCP客户端求助

[复制链接]

1

主题

1

帖子

2

积分
交易币
0

新手入门

Rank: 1

发表于 2019-11-22 14:23:50 | 显示全部楼层 |阅读模式
简单讲,目的是公司要做一个TCP客户端,要求是当连接到指定该端口时,可以实时接收该端口的数据,与此同时,也可以通过手动发送一些数据到这个端口。我写的代码如下:
[aardio] 纯文本查看 复制代码
import win;
import winex;
import win.ui;
import win.ui.accelerator
import win.util.tray;
import win.ui.menu;
import win.ui.simpleWindow;
import win.ui.minmax;
import win.ui.tabs;
import win.ui.tooltip; 
import process;
import thread.command;
import sio;
import key;
import web.form;
import time;
import fsys.dlg;
import fsys.ini;
import wsock.tcp.client; 
import console;
/*DSG{{*/
var tcpForm = win.form(text="TCP Connector";right=759;bottom=469)
tcpForm.add(
Host={cls="edit";text="192.192.192.11";left=263;top=12;right=382;bottom=37;dr=1;dt=1;edge=1;font=LOGFONT(h=-14);z=9};
Port={cls="edit";text="23";left=415;top=12;right=462;bottom=37;dr=1;dt=1;edge=1;font=LOGFONT(h=-14);z=10};
combobox={cls="combobox";left=473;top=12;right=631;bottom=32;dr=1;dt=1;edge=1;items={};mode="dropdown";z=7};
connect={cls="button";text='\u27A4 连接';left=637;top=10;right=692;bottom=37;dr=1;dt=1;z=8};
disconnect={cls="button";text='\u3013 断开';left=696;top=10;right=751;bottom=37;dr=1;dt=1;z=11};
downmsg={cls="button";text='\u25BC';left=721;top=432;right=753;bottom=464;db=1;dr=1;font=LOGFONT(h=-16);z=6};
groupbox={cls="groupbox";left=0;top=0;right=760;bottom=43;aw=1;dt=1;edge=1;z=1};
receiveText={cls="edit";left=8;top=45;right=752;bottom=427;autohscroll=false;bgcolor=0;color=13102540;db=1;dl=1;dr=1;dt=1;edge=1;font=LOGFONT(h=-15;name='Consolas');multiline=1;z=2};
send={cls="button";text="手动发送";left=596;top=432;right=683;bottom=464;db=1;dr=1;z=4};
sendText={cls="edit";left=8;top=433;right=589;bottom=463;bgcolor=0;color=13102540;db=1;dl=1;dr=1;edge=1;font=LOGFONT(h=-15;name='Consolas');multiline=1;z=3};
static={cls="static";text="Host";left=234;top=17;right=263;bottom=36;dr=1;dt=1;transparent=1;z=12};
static2={cls="static";text="Port";left=388;top=17;right=416;bottom=36;dr=1;dt=1;transparent=1;z=13};
upmsg={cls="button";text='\u25B2';left=689;top=432;right=721;bottom=464;db=1;dr=1;font=LOGFONT(h=-16);z=5}
)
/*}}*/

/****************变量组****************/
//定义一个TCP客户端
tcpForm.tcp = wsock.tcp.client()
tcpForm.receiveCache = "";
tcpForm.msgflag = 0; //TCP是否开启的标志量

/****************窗口组****************/
//鼠标滑过提示
var tooltipCtr = win.ui.tooltip( tcpForm );//在窗口上创建tooltip控件 
tooltipCtr.addTool(tcpForm.upmsg,"调用上一条",0x10/*_TTF_SUBCLASS*/ )
tooltipCtr.addTool(tcpForm.downmsg,"调用下一条",0x10/*_TTF_SUBCLASS*/ )

/****************函数组****************/
var Msgtcp = thread.command();
Msgtcp.recDealFunc = function(v_str = ""){
    tcpForm.receiveText.log(v_str);
}
//打开TCP端口
tcpForm.openTcp = function(){
	if(tcpForm.Host.text != ""){
		tcpForm.connect.disabled = true;
		thread.set("tcpflag",1);
		thread.invoke(recTcp, tcpForm)
	}	
}
//创建工作线程
function recTcp (tcpForm){ 
    //必须在线程函数内部导入需要的库
    import wsock.tcp.client;
    import thread.command;
    import io;
    io.open();
    var i = 0;
    var tcp = wsock.tcp.client()
    var sport = tcp.connectTimeout("192.192.192.11",23,5)
    if(!sport) {tcpForm.msgboxErr("端口初始化失败!"); tcpForm.connect.disabled = false;}
	else{
		io.print("1" + thread.get("tcpflag"))
    	while(thread.get("tcpflag")){
        	//调用界面线程的命令
        	//thread.command.recDealFunc(tcp.recv());
        	thread.command.send("recDealFunc", tcp.recv());
        	i++;
sleep(1000)
        	io.print("step" + tostring(i));
        	if(thread.get("tcpmsg")){
        		if(tcpForm.sendText.text != ""){
        			io.print(("send" + tcpForm.sendText.text))
        			tcp.write(tcpForm.sendText.text + '\n')
        			tcpForm.sendText.text = "";
        		}
        		thread.set("tcpmsg",false);
        	}

    	}
    }
}
/****************菜单组****************/


/****************控件组****************/
tcpForm.connect.oncommand = function(id,event){
	tcpForm.openTcp()
}

tcpForm.disconnect.oncommand = function(id,event){
}

tcpForm.send.oncommand = function(id,event){
	thread.set("tcpmsg",true);
	tcpForm.sendText.text = "";
}

tcpForm.show();
win.loopMessage();
return tcpForm;


现在问题是,当我连接到端口后,就只能接收一组数据,然后就进入了卡死的状态,IO也会卡在step2,直到这个连接超时退。
请问是哪里出了问题?我应该如何让系统能正常发出我想发出的命令呢?
已知以下方法不行:
把发送函数直接写在发送按钮里,会建立两个不同的TCP连接。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



GMT+8, 2020-2-25 20:41 , Processed in 0.106270 second(s), 26 queries .

© 2001-2011 Powered by Discuz! X3.2.

快速回复 返回顶部 返回列表