Java和TCL之间的套接字编程
我必须为一个场景编写一个程序,在该场景中,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(); } } } >我启动了服务器,服务器什么也没显示. 有人可以在这里帮忙,并说明为什么客户端在连接时无法看到服务器的回复,客户端可以将数据发送到服务器. 谢谢 解决方法
您的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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |