我需要和一台远程主机通过modem拨号后传送接收数据包,
当客户机通过RAS拨号与远程RAS服务器主机建立连接后,
应该采用什么方式收发数据包进行通信,是不是要用串口方式通信,
还是使用一些delphi其他的网络通信方法进行通信,
比如使用Tcientsocket,Tserversocket控件的方法通信,
或FTP上传下载的方法通信。请介绍一下通信的具体过程。
  串口通信是否和基与Internet的www网络通信不同?
  不是通过直接拨号,而是通过IP地址建立的连接是否可以使用串口通信?
  什么情况下应该使用串口通信?

解决方案 »

  1.   

    不用串口
    我记得有专门的api
    可是又记不清了 hoho
      

  2.   

    不用串口,用Ras接通后, 可以用Pop, Smtp等(API)方式来做数据传送
      

  3.   

    感谢楼上各位高手的指点,现在小弟参与的项目要求如下:客户在自己的PC上,填好一张报表,然后通过远程拨号,与一台服务器建立连接,然后将这张报表上的数据按一定的协议打包发给服务器,服务器返回处理信息。现在用Delphi来做,应该采用什么方法,什么控件来做?本人水平不高,请说得详细,具体些,小弟不胜感激。
      

  4.   

    有两种方法:
    一、 使用ActiveX控件
    由于Delphi中没有串口控件可用,所以首先需要把ActiveX控件MSCOMM加到元件选项板上。这是一个非常好的控件它不仅能对串口进行操作,而且还可以对Modem进行控制。下面结合一个具体的实例来说明如何用MSCOMM控件开发出串口通信程序。
    创建一个Communication.dpr工程,把窗体的Name属性变为CommForm,将标题改为The Communication Test,选择File/Save As将新的窗体存储为CommFrm.pas,接下来参照图1和图2将控件添加到主窗体中。图1 图2
    由图1和图2我们可以看出,通过设置页可选定进行数据传输的通信端口和端口的波特率、奇偶校验、数据位和停止位,通信时每传输一个字符都将触发响应事件,在通信页“传输显示”位置可看到当前正在进行传输的数据。同时当出现回车换行符时将整行内容显示在memDisplay新的一行中,而全部接收的内容还将存在一个文件中。部分源代码如下:
    变量说明
    var
    CommForm: TCommForm;
    ss :string;
    savef,readf :file of char;
    i,j :longint;初始化
    procedure TCommForm.FormCreate(Sender: TObject);
    begin
    mscomm.commport:=1;
    mscomm.settings:='9600,n,8,1';
    mscomm.inputlen:=1;
    mscomm.inbuffercount:=0;
    mscomm.portopen:=true;
    ss:='';
    i:=0;
    j:=0;
    assignfile(savef,'save1');
    rewrite(savef);
    assignfile(readf,'read1');
    reset(readf);
    end;设置确定
    procedure TCommForm.btnConfirmClick(Sender: TObject);
    begin
    if mscomm.portopen then
    mscomm.portopen:=false;
    mscomm.commport:=strtoint(edtCommport.text);
    mscomm.settings:=edtCommsetting.Text;
    end;传输事件
    procedure TCommForm.MSCommComm(Sender: TObject);
    var
    filenrc :char;
    buffer :variant;
    s1:string;
    c :char;
    begin
    case mscomm.commEvent of
    comEvSend:
    begin
    while not(eof(readf)) do
    begin
    read(readf,filenrc);
    mscomm.output:=filenrc;
    j:=j+1;
    lblDisplay.caption:=inttostr(j);
    if mscomm.outbuffercount>=2 then
    break;
    end;
    end;
    comEvReceive:
    begin
    buffer:=mscomm.Input;
    s1:=buffer;
    c:=s1[1];
    ss:=ss+c;
    i:=i+1;
    lblDisplay.caption:=c+inttostr(i);
    write(savef,c);
    if (c=chr(10))or(c=chr(13)) then
    begin
    lblDisplay.caption:='cr'+inttostr(i);
    memDisplay.lines.add(ss);
    ss:='';
    end;
    end;
    end;
    end;当然还有许多串口控制的ActiveX控件,有控件用是方便,但是是否说没有控件就不能用Delphi本身解决问题呢。那么就请来看一下下面的解决方案:二、使用行间汇编
    对于硬件的控制,汇编语言是最方便的了,而Delphi中又允许使用行间汇编那么来看一下怎样使用行间汇编接收下位机传来的数据,在下面的例子中我们简化了问题,比如我们通过COM2接收400个传来的字符并将这些内容保存在AAA.DAT文件中当接收完毕后显示‘Receive end’。但是为什么说我们简化了问题呢,因为实际情况中双方通信可能是约定传送字符的个数,也可能约定的是规定好的起始字符和结束字符,或是多种条件同时约定待各种条件全部满足时才表示完成一次成功的接收否则如有一个条件未满足都表示接收失败需要重新传送。这些约定在使用了行间汇编的Delphi程序中都可实现。下面的程序就是按一个按钮进入的一个简化的串口接收程序。
    procedure TForm1.Button1Click(Sender: TObject);
    var ca:array[1..400]of char;
    c:char;
    i,j:integer;
    f1:file of char;
    label loop1;
    begin
    i:=1;
    asm
    mov dx,0001
    mov ax,005eh
    int 14h
    end;
    for j:=1 to 400 do
    begin
    asm
    loop1: mov dx,0001
    mov ah,02
    int 14h
    test ah,80h
    jnz loop1
    mov c,al
    end;
    ca[i]:=c;
    i:=i+1;
    end;
    assignfile(f1,'aaa.dat');
    rewrite(f1);
    for j:=1 to i-1 do
    write(f1,ca[j]);
    closefile(f1);
    label1.caption:='receive end';
    end;
    相信你已经明白了吧!!
      

  5.   

    ni xian yong chuan kou liang shang yi hou 
    ke yi yong Tclientsocket,Tserversocket
    zhe yang ren he gongz dou  ke yi zuo le
      

  6.   

    没有必要自已写吧。。如果是同一种平台的话用DELPHI自带的INDY控件一般就能搞定你的要求了
      

  7.   

    用INDY控件如何做,请说得详细些?
      

  8.   

    如果客户端的PC和远程主机通过拨号建立连接后,不使用TCP/IP协议通信,而要使用自己定义的一套协议,应该使用什么方式来实现?串口通信,还是文件传输?