delphi java socket 对象传输

这篇博客介绍了如何使用Delphi作为客户端,通过Socket与Java服务端进行数据传输,包括字符串、文件以及中文内容。Delphi客户端首先发送特定格式的字符串,然后Java服务端接收并处理。对于大文件传输,Delphi分块发送,Java接收并写入文件。在处理中文内容时,涉及了编码解码的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

082|reset|||

082|setclient|172.16.1.82|00:0c:29:54:ff:21|

082|check|open||

082|auth||111|;gascode=082

 

(1)  delphi客户端发送:

csConnect()中

       tmpstr := ipcode + '|setclient|' + ip + '|' + mac + '|' + #13#10;
      Socket.SendText(tmpstr);

(2)java服务接受:

public ServerThread2(Socket s) { // serverThread的构造器
  this.request = s;
  // 接收receiveServer传来的套接字
  try { // 初始化输入、输出流
   response = new DataOutputStream(request.getOutputStream());
   input = new DataInputStream(request.getInputStream());
  } catch (IOException e) {
   GlobaTx.LogLn(e.getMessage());
  }
 }

 @Override
 public void run() { // 线程的执行方法
  String str = "";
  //StringBuilder sb=new StringBuilder();
 
    str = input.readLine();

//下边详细处理

}

 

(3)java服务端返回:

 /**
  * 发送报文到客户端
  * @param response
  * @param pg
  * @return
  */
 public static boolean writePg(DataOutputStream response, DataPg pg) {
  try {
   String tmp=pg.getReturnStr()+"*";
   System.out.println("sender:"+tmp);
   response.writeBytes(tmp);//(s)writeUTF
   response.flush();
   return true;
  } catch (IOException e) {
   e.printStackTrace();
   return false;
  } finally {
  }
 }

(4)delphi客户端接收:

csRead()中

 res := Socket.ReceiveText;
  tmpstr := res[length(res)];
  if tmpstr <> '*' then   //约定的结束字符*,防止传送不完整串
    begin
      pgcs := pgcs + res;
      Exit;
    end;
  res := pgcs + res;
  pgcs := '';

--------------------------------------------------------------------------------------------------------------------

大文件传送:

(1)delphi发送

procedure TForm1.csfileConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  Buf: array[1..MAX_BUF + 1] of char;
  bytes, iLength, MySendLength: Integer;
  res, tmpstr, Msg: string;
  bufSend: pointer;
  picname: string; //保存的照片名称
  ipcode: string; //机器编号
  timestr: string; //时间
  lt: TSYSTEMTIME;
begin
  res := pg;
  ipcode := tools.findsegment(res, 1, '|');
  GetLocalTime(lt);

  picname := ipcode + '-' + inttostr(lt.wYear) +
    inttostr(lt.wMonth) + inttostr(lt.wDay) + inttostr(lt.wHour)
    + inttostr(lt.wMinute) + inttostr(lt.wSecond) + '.bmp';
  tools.CaptureScreen(picname);
  while tools.IsFileInUse(picname) do
    begin
    end;
  fsSend := TFileStream.Create(picname, fmOpenRead);
  Socket.SendText(ipcode + '|uppic|' + picname + '|' + inttostr(fsSend.Size) + '|' + #13#10);
  if fsSend.Size > 0 then
    begin
      while fsSend.Position < fsSend.Size do
        begin
          iLength := fsSend.Size;
          // - fsSend.Position;
          //将数据分段发送
          // if iLength > MAX_BUF then
          // iLength := MAX_BUF;
          GetMem(bufSend, iLength);
          try
            //读取文件流数据
            fsSend.Read(bufSend^, iLength);
            //发送长度为iLength的数据
            Socket.SendBuf(bufSend^, iLength);
            //进度条显示
           // Probar.Position := fsSend.Position;
          finally
            //释放内存
            FreeMem(bufSend, iLength);
          end;
        end;
      //Socket.Close();
      Timer1.Enabled := True;
    end;
end;

(2)java接收

 public static boolean fileWriteIn(File file, DataInputStream downStream,long length) {
        FileOutputStream fileWrite = null;
        try {
            fileWrite = new FileOutputStream(file);

            byte[] buffer = new byte[size];
            int len = 0;
            long n = 0;
            System.out.print("   >开始接受数据,写入文件 ");
            while ((len = downStream.read(buffer, 0, size)) != -1) {
                fileWrite.write(buffer, 0, len);
                n += len;
                System.out.print(".");
                if ((n + size) > length) {
                    int lastLen = (int) (length - n);
                    n += lastLen;
                    len = downStream.read(buffer, 0, lastLen);
                    fileWrite.write(buffer, 0, len);
                    System.out.print("-");
                    break;
                }
            }
           
            System.out.println("   >完成接受,长度为:" + n);

            //接收完成==========================
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Error: " + e.getMessage());
            return false;
        } finally {

            try {
                fileWrite.close();
            } catch (IOException e) {

            }
        }
    }

----------------------------------------------------------------------------

 中文传送:

   msg:=UTF8Decode(HttpDecode(msg))  ;
         // URLdecode(msg);
          showmessage(Msg);

 

 destr = URLEncoder.encode(body, "utf-8");
      System.out.println("-URL-----------"+destr+"------------");

本例子就是Delphi中如何利用Socket编写通信程序。 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议。TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登陆BBS,用的就是TCP协议;UDP是无连接的,通信双方都不保持对方的状态,浏览器访问Internet时使用的HTTP协议就是基于UDP协议的。TCP和UDP协议都非常复杂,尤其是TCP协议,为了保证网络传输的正确性和有效性,必须进行一系列复杂的纠错和排序等处理。   Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出,它定义两台计算机间进行通信的规范(也是一种编程规范),如果说两台计算机是利用一个“通道“进行通信,那么这个“通道“的两端就是两个套接字。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了套接字规范的计算机之间的通信成为可能。   微软的Windows Socket规范(简称winsock)对Berkley的套接字规范进行了扩展,利用标准的Socket的方法,可以同任何平台上的Socket进行通信;利用其扩展,可以更有效地实现在Windows平台上计算机间的通信。在Delphi中,其底层的Socket也应该是Windows的SocketSocket减轻了编写计算机间通信软件的难度,但总的说来还是相当复杂的(这一点在后面具体会讲到);Inprise在Delphi中对Windows Socket进行了有效的封装,使得用户可以很方便地编写网络通信程序。 本例子就是Delphi中如何利用Socket编写通信程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值