加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java和TCL之间的套接字编程

发布时间:2020-12-15 04:09:51 所属栏目:Java 来源:网络整理
导读:我必须为一个场景编写一个程序,在该场景中,java程序将使用套接字编程与TCL程序进行通信. 我已经成功地尝试了TCL和 Java的套接字编程.但由于我必须将Java程序作为客户端套接字并将TCL程序作为服务器,因此我无法成功完成. 服务器的TCL程序 set svcPort 9999#Im
我必须为一个场景编写一个程序,在该场景中,java程序将使用套接字编程与TCL程序进行通信.
我已经成功地尝试了TCL和 Java的套接字编程.但由于我必须将Java程序作为客户端套接字并将TCL程序作为服务器,因此我无法成功完成.

服务器的TCL程序

set svcPort 9999

#Implement the service
# This example just writes the info back to the client...

proc doService {sock msg} {
  puts $sock "$msg"
}

# Handles the input from the client and  client shutdown
proc  svcHandler {sock} {
  set l [gets $sock]    ;# get the client packet
   puts "The packet from the client is $l"
  if {[eof $sock]} {    ;# client gone or finished
     close $sock        ;# release the servers client channel
  } else {
    doService $sock $l
  }
}

# Accept-Connection handler for Server. 
# called When client makes a connection to the server
# Its passed the channel we're to communicate with the client on,# The address of the client and the port we're using 
#
# Setup a handler for (incoming) communication on 
# the client channel - send connection Reply and log connection
proc accept {sock addr port} {

  # if {[badConnect $addr]} {
  #     close $sock
  #     return
  # }

  # Setup handler for future communication on client socket
  fileevent $sock readable [list svcHandler $sock]

  # Read client input in lines,disable blocking I/O
  fconfigure $sock -buffering line -blocking 0

  # Send Acceptance string to client
  puts $sock "$addr:$port,You are connected to the echo server."
  puts $sock "It is now [exec date]"

  # log the connection
  puts "Accepted connection from $addr at [exec date]"
}


# Create a server socket on port $svcPort. 
# Call proc accept when a client attempts a connection.
socket -server accept $svcPort
vwait events    ;# handle events till variable events is set

Java客户端程序

// File Name GreetingClient.java

import java.net.*;
import java.io.*;

public class GreetingClient
{
   public static void main(String [] args)
   {
      String serverName = args[0];
      int port = Integer.parseInt(args[1]);
      try
      {
         System.out.println("Connecting to " + serverName
                             + " on port " + port);
         Socket client = new Socket(serverName,port);
         System.out.println("Just connected to "
                      + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out =
                       new DataOutputStream(outToServer);

         out.writeUTF("Hello from "
                      + client.getLocalSocketAddress()+"n");
         InputStream inFromServer = client.getInputStream();
         DataInputStream in =
                    new DataInputStream(inFromServer);
         System.out.println("Server says " + in.readUTF());
         client.close();
      }catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

>我启动了服务器,服务器什么也没显示.
>我启动了客户端,服务器显示“从2013年5月6日星期一02:50:21 PDT 2013开始接受连接”,客户端显示
“连接到端口9999
刚连接到/(服务器IP地址):9999“
>当out.writeUTF在客户端执行时,服务器显示“来自客户端的数据包是”Hello来自:/< client ip address>:< client port no>“.但是客户端没有显示任何内容,因为它应该是显示来自服务器的回复.客户端进程没有退出并等待System.out.println的执行(“服务器说”in.readUTF());.

有人可以在这里帮忙,并说明为什么客户端在连接时无法看到服务器的回复,客户端可以将数据发送到服务器.

谢谢

解决方法

您的Java客户端正在使用DataOutputStream.writeUTF和DataInputStream.readUTF;这些在套接字之上使用简单的成帧协议,Tcl服务器不会说.这会让事情出错.

框架协议非常简单.首先,字符串的长度(以字节为单位)写为双字节大端(“network-endian”)整数.然后发送字符串的UTF-8字节.非常简单,但你需要知道才能真正正确地处理它.你也想以这种方式将套接字置于二进制模式;你不再使用面向行的协议了.

# Two helper procedures that know how to do the framing encoding/decoding
proc writeJavaUTF {sock msg} {
  set data [encoding convertto utf-8 $msg]
  puts -nonewline $sock [binary format "S" [string length $data]]$data
}
proc readJavaUTF {sock} {
  binary scan [read $sock 2] "S" len
  set data [read $sock [expr {$len & 0xFFFF}]]
  return [encoding convertfrom utf-8 $data]
}

# This is your sample code,stripped of comments and adapted
set svcPort 9999
proc doService {sock msg} {
  writeJavaUTF $sock "$msg"; # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
}
proc svcHandler {sock} {
  set l [readJavaUTF $sock]; # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  puts "The packet from the client is $l"
  if {[eof $sock]} {
     close $sock
  } else {
    doService $sock $l
  }
}
proc accept {sock addr port} {
  fileevent $sock readable [list svcHandler $sock]
  # Next *three* lines are changed!
  fconfigure $sock -buffering line -blocking 0 -translation binary
  writeJavaUTF $sock "$addr:$port,You are connected to the echo server."
  writeJavaUTF $sock "It is now [exec date]"
  puts "Accepted connection from $addr at [exec date]"
}
socket -server accept $svcPort
vwait events

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读