Sockets and oblect passing between servers

Hi ..
This is my first try to make program that uses sockets
i have read the java's tutorial but what i cant understand is how can send objects instead of strings between the server and client ?
thank you in advance

i have created the server and client classes with success
i have used the out = new ObjectOutputStream(kkSocket.getOutputStream());
in = new ObjectInputStreamkkSocket.getInputStream());
for input and output for the client (same goes for the server class) and the code runs as expected!!!
as i have seen in some exaples they use the bufferedOutputStream and the BufferedInputStream
when i tied to use it the program dind't worked ..why?
( i have used the out = new ObjectOutputStream(new BufferedOutputStream(kkSocket.getOutputStream()));
in = new ObjectInputStream(new BufferedInputStream(kkSocket.getInputStream()));
here is the complete code
public class myServer {
      public static void main(String[] args) throws IOException {
             ServerSocket serverSocket = null;
             try {
                 serverSocket = new ServerSocket(4444);
                 System.out.println(serverSocket.toString());
                         } catch (IOException e) {
                 System.err.println("Could not listen on port: 4444.");
                 System.exit(1);
             Socket clientSocket = null;
              try {
                 clientSocket = serverSocket.accept();
             } catch (IOException e) {
                 System.err.println("Accept failed.");
                 System.exit(1);
             ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(clientSocket.getOutputStream()));
             ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(clientSocket.getInputStream()));
             MyObject inputLine, outputLine;
             outputLine = new MyObject(1);
             out.writeObject(outputLine);
             try {
                  while ((inputLine = (MyObject)in.readObject()) != null) {
                       System.out.println("server writes" + inputLine.getInt());
                       outputLine = new MyObject(inputLine.getInt());
                       out.writeObject(outputLine);
                       out.flush();
             catch (ClassNotFoundException ex){}
             out.close();
             in.close();
             clientSocket.close();
             serverSocket.close();
public class myClient {
     public static void main(String[] args) throws IOException {
        Socket kkSocket = null;
        ObjectOutputStream out = null;
        ObjectInputStream in = null;
        try {
             kkSocket = new Socket(InetAddress.getAllByName("192.168.178.21")[0],4444);
            out = new ObjectOutputStream(new BufferedOutputStream(kkSocket.getOutputStream()));
            in = new ObjectInputStream(new BufferedInputStream(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: taranis.");
            System.exit(1);
        MyObject fromServer = new MyObject(-10);
        MyObject responseToServer;
        try {
             while ((fromServer = (MyObject)in.readObject()) != null) {
                  //pause for a while
                  for (int i =0 ; i <1000;i++);
                  System.out.println("Client Writes: " + fromServer.getInt());
                 if (fromServer.getInt()==12)break;
                 responseToServer = new MyObject(fromServer.getInt()+1);
                 System.out.println("Client Rensponses: " + responseToServer.getInt());
                 out.writeObject(responseToServer);
                 out.flush();
         catch(ClassNotFoundException e){}
        out.close();
        in.close();
        kkSocket.close();
public class MyObject implements Serializable{
     private static final long serialVersionUID = 1L;
     String str;
     int myInt;
     MyObject(int a){
          str = "A String";
          myInt = a;
     public int getInt(){
          return myInt;
}

Similar Messages

  • Message between servers

    Hi,
    I am new to this JMS, after reading online and a sample application I got an idea how to configure JMS with resin and Jboss.
    My question now is, how to send and receive messages between servers ? I have created some sample applications and just sent and received messages within the same server.
    How can we achieve sending messages across servers ?
    Thanks in advance.
    ~ SK

    Hi Elad,
    We did XI-XI communictions a bit different, we approached it as a B2B scenario. We defined a Party for the sending XI system and we created an abstract interface with the Idoc messagetype (because you need on both sides the same interface name/namespace and we use naming conventions).
    In the receiver agreement of the sending XI system you have to replace the party and service name with the ones you have did setup on the receiving XI.
    I hope this helps you in the right directions
    Cheers,
    Frank

  • Copy file between servers, passing on firewall

    I'm try copy a file between servers with Windows NT. I mapping the target server to drive X and test copying a file in windows explorer and command window and the files copy is OK. But if I try with a java class don't.
    I'm try with FileInputStream (read) and FileOutputStream (write) but don't. I have use the Runtime.exec() for execute a DOS command but don't("cmd.exe /c copy c:\myfile.txt x:\"). this second showme a message "username incorrect or bad password", but the same sentence I run in a command window and the copy is OK!
    What can I do?

    Hi,
    try to use HTTP for the transfer between
    the two servers. Normally You can pass the
    firewall using HTTP (like browsers do).
    Therefor use classes in the java.net packages.
    CU,
    Mathias

  • Disk Utility: Differences between "Zero Out Data" and "7-Pass Erase"?

    I'm wondering if anyone knows if there's a significant difference between the "Zero Out Data" erase option in Disk Utility (specifically Disk Utility 10.5.5), and the "7-Pass Erase" and "35-Pass Erase" options in same software.
    Here's why I'm asking: I have a co-worker with an iMac G5 20" 1.8GHz with 160GB internal hard drive. As a result of the power supply overheating a week ago due to dust, some hard drive problems resulted. I'm trying to assess whether these are 'soft' formatting problems that can be recovered from, or 'hard' problems requiring replacement of the hard drive and/or power supply.
    Following the failure, I removed the dust and restored the iMac to servicable form. The power supply seems to be OK now. The next thing was to attempt to recover as much data as possible from the 160GB, as the last full backup was a week old. Carbon Copy Cloner, shell copy via 'sudo cp -p -R -v', Finder copy, and DiskWarrior recovery all met with problems. TechTool Pro identified a huge swatch of unreadable sectors during repeated surface scans. Unfortunately, these unreadable sectors were located midway in the OSX boot partition (an 80GB partition), and not in the other 80GB partition devoted to lower priority video data.
    When I was satisfied I had backed up the data to the best of my abilities, I next set out to reformat the drive and see if the bad sectors could be eliminated or remapped out of existence. I did a "Zero Out Data" erasure in Disk Utility (with no errors during the erase), but TechTool Pro showed the bad sectors persisted in equal strength at the same location. I next executed a sixteen hour "7-Pass Erase" (again no errors, and confirming that it takes about an hour per 10GB). The next day when I ran TechTool pro, all of the sector errors had disappeared. I'm a bit perplexed as to why the "7-Pass Erase" seems to have recovered the use of the drive. Is it possible that there are simply thousands of bad sectors now remapped that I'm not seeing? [If so, how do I check for this?] TechTool Pro has not reported any S.M.A.R.T. issues to date on the drive. What am I to make of that?
    There are some related threads I've checked into, but I'm not sure how to properly assess my situation based on this information:
    <http://discussions.apple.com/thread.jspa?threadID=232007>
    <http://discussions.apple.com/thread.jspa?threadID=138559>
    <http://discussions.apple.com/thread.jspa?threadID=118455>
    Since the iMac has three weeks left on it's one year warranty, and I've already moved the user to another machine temporarily, I'm thinking that the smart thing to so is to send it in to Apple to have them look at the power supply and hard drive. That way, when it returns, even if there is still a lingering hardware problem, at least it will be covered under warranty for another 90 days.
    Any thoughts?
    iMac G5 20" 1.8GHz   Mac OS X (10.4.6)   1.25GB RAM, 160GB hard disk, SuperDrive

    HI, Bret.
    The only differences between "Zero Out Data", "7-Pass Erase", and "35-Pass Erase" are the number of times a binary zero is written to every bit on the disk. "Zero Out Data" writes a binary zero once, whereas the 7- and 35-Pass options write a zero seven and 35 times, respectively.
    Technically, one pass with Zero Out Data should be sufficient to map bad sectors out of service, a process also known as sparing. If a bad sector is encountered, it is both marked as "in use" in the directory's allocation table and added to the directory's "bad blocks file."
    My understanding is that the Surface Scan of Tech Tool Pro should identify bad sectors every time it is run unless the bad sectors have been locked out by the drive controller of the ATA drive itself. This is because Surface Scan checks the entire surface of the disk.
    What may have happened is that running "Zero Out Data" spared the bad blocks from a directory standpoint, but did not result in the drive's controller locking out those sectors for reasons detailed in the "Surface Scan" section of the Tech Tool Pro manual. However, the 7-Pass Erase may have resulted in the drive's controller locking out the bad sectors and why Surface Scan did not pick them up after such.
    Given the problems you described, I concur with your plan to have Apple check the affected computer. You might also want to consider purchasing an AppleCare Protection Plan for that Mac: I recommend and buy these for all my Macs.
    For some additional information on bad sectors, see the "Bad Sectors" section of my "Resolving Disk, Permission, and Cache Corruption" FAQ.
    Good luck!
    Dr. Smoke
    Author: Troubleshooting Mac® OS X
    Note: The information provided in the link(s) above is freely available. However, because I own The X Lab™, a commercial Web site to which some of these links point, the Apple Discussions Terms of Use require I include the following disclosure statement with this post:
    I may receive some form of compensation, financial or otherwise, from my recommendation or link.

  • Conflict between socket and RMI

    Hi
    I wrote a program in client-server using socket and it was fine. I also wrote a client-server program using RMI. Fine as well. But after I connected the client-server using socket (open socket, send-receive messages, close socket), then use RMI. I got java.rmi.NotBoundException.
    Would anyone have a look and provide your feedback please? Thanks.
    big J
    *****************this is Server.java ***************************
    package single;
    import java.io.*;
    import java.rmi.Naming;
    import java.rmi.RemoteException;
    import java.net.*;
    import java.rmi.*;
    public class Server
    extends Thread {
    public static final int SOCKETPORT = 5555;
    private String serverName;
    public Server() throws IOException {
    System.out.println("*** socket opened ***");
    serverName = new String("localhost");
    ServerSocket serverSocket = new ServerSocket(SOCKETPORT);
    Socket socket = serverSocket.accept();
    InputStream is = socket.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
    System.out.println(bufferedReader.readLine());
    OutputStream os = socket.getOutputStream();
    PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(os), true);
    printWriter.println("from server");
    os.close();
    is.close();
    socket.close();
    System.out.println("*** socket closed ***");
    public void runServer() {
    System.out.println("*** start of run():RMI ***");
    System.setSecurityManager(new SecurityManager());
    try {
    RMIInterfaceImpl rMIInterfaceImpl = new RMIInterfaceImpl();
    Naming.bind("//" + serverName + ":9999/RMIInterface", rMIInterfaceImpl);
    catch (RemoteException ex) {
    catch (MalformedURLException ex) {
    catch (AlreadyBoundException ex) {
    System.out.println("*** end of run():RMI ***");
    public static void main(String args[]) throws Exception {
    Server server = new Server();
    server.runServer();
    ******************this is Client.java **************************
    package single;
    import java.io.*;
    import java.net.*;
    import java.rmi.Naming;
    public class Client {
    private String serverName;
    private final static int SOCKETPORT = 5555;
    public Client() throws IOException {
    serverName = new String("localhost");
    Socket socket = new Socket(serverName, SOCKETPORT);
    OutputStream os = socket.getOutputStream();
    PrintWriter printWriter=new PrintWriter(os, true);
    printWriter.println("from client");
    InputStream is = socket.getInputStream();
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
    System.out.println(bufferedReader.readLine());
    is.close();
    os.close();
    socket.close();
    public void runClient() throws Exception {
    System.out.println("*** start of runClient():RMI ***");
    System.setSecurityManager(new SecurityManager());
    RMIInterface rMIInterfaceImpl = (RMIInterface) Naming.lookup(
    "//" + serverName + ":9999/RMIInterface");
    String str = rMIInterfaceImpl.print();
    System.out.println(str);
    rMIInterfaceImpl.serverSide();
    System.out.println("*** end of runClient():RMI ***");
    public static void main(String args[]) throws Exception {
    Client client = new Client();
    client.runClient();
    ***************** this is RMIInterface.java ***********************
    package single;
    import java.rmi.Remote;
    import java.rmi.RemoteException;
    interface RMIInterface
    extends Remote {
    String print() throws RemoteException;
    void serverSide() throws RemoteException;
    ********************* this is RMIInterfaceImpl.java ***************
    package single;
    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    public class RMIInterfaceImpl
    extends UnicastRemoteObject
    implements RMIInterface {
    public RMIInterfaceImpl() throws RemoteException {}
    public String print() {
    return new String("hello world");
    public void serverSide(){
    System.out.println("this should appear in serverside");

    I think you have a timing problem between your client and server. As soon as your client and server programs have finished their socket communication, they will both do their "runServer"/"runClient" methods. If the client attempts to lookup the server before the server has registered itself via Naming.bind(), I would expect that's why you're getting a NotBoundException in the client.
    You probably wouldn't use the design of your test client/server for something significant, but a quick and dirty way to make this work might be to have the client call Thread.sleep() for a few seconds before trying to do the lookup.

  • How to mirror between the production server and the multiple local servers.

    I am currently looking for the best way to correspond between our production server and the multiple local servers. Because the production server is the only server that holds the latest updating applications, and our local servers are located for each developer’s local machines where the all modifications and creations are done. So when the developer locally makes changes for assets or files, he creates a patch archive first, then accesses to the production side Administration console screen and imports them from Application Management screen.
    We tried to find a way to see the imported date before (so we know which one has been imported as new.), but there is no show in the Administration console Application Management screen. There is Creation date but it’s set as we initially imported the full archive files, but not patch files. Since between applications have some types of the dependencies (like fragments or image files), what is the best way to keep mirroring between the production server and local servers? Or we should simply not use patch file for updating server?
    Thanks,

    Check out this utility : http://blogs.adobe.com/livecycle/2013/03/adobe-livecycle-configuration-migration-utility.h tml
    Thanks,
    Wasil

  • Best way to pass secure data between servers

    Hello,
    In the not to distant future my company wants to expand our
    site to include a single sign-on, this will be made possible with
    the 3rd party group that handles our customer info. Can someone
    enlighten me as the most secure method of transferring user data
    between these locations?
    What has been proposed is to pass the login from our site to
    the 3rd party, if successful pass back certain data, display and
    possibly update on our site and then pass this back to the 3rd
    party server.
    Is CFLogin the most powerful method for login? I've used
    query checks in the past, is that adequate or is CFLogin much
    better? Any pointers are appreciated.

    "Is CFLogin the most powerful method for login? I've used
    query checks
    in the past, is that adequate or is CFLogin much better?"
    Neither, CFLogin is really just a specific purpose IF block.
    Code
    within the opening and closing <cflogin...> tags is run
    when a user is
    not logged in with the <cfloginuser...> tag. Inside
    this block one
    still needs to validate the credentials provided by the user,
    often with
    a query check.
    The <cflogin...><cfloginuser...> combination
    provides an easy to
    interpret and use mechanism to run conditional code and
    persist a user
    login state from request to request. It is basically
    equivalent to ones
    own <cfif...> logic combined with session data for the
    user state.
    Under the hood it is using the same mechanisms.
    I usually prefer to roll my own solution because I often want
    to store
    more state data about a user then is allowed with the
    <cfloginuser...>
    tag and the related getAuthUser() and isUserInRole()
    functions.

  • Whats the difference between sending messages via socket and MQs?

    Whats the difference between sending messages via socket and MQs?

    Soph wrote:
    Whats the difference between sending messages via socket and MQs?With JMS (and the like) your application uses a socket to connect to a central server called a "*Message Broker*". Over this connection it can send or receive messages.
    A Message Broker is somewhat analogous to a database server. Multiple clients connect to it to exchange messages. As with a database a client first establishes a connection, then requests specific facilities like subscriptions.
    It creates a strong decoupling between sender and receiver and handles stuff like allowing multiple receivers for the same message, queuing of messages for applications not currently running and so on.
    (And don't worry, you can get perfectly good message brokers for free such as openMQ and activeMQ.)

  • Differences between 2 pass and 1 pass compressing in compressor 2.0

    Is there a noticeable difference between 2 pass and 1 pass compression? It seems to me that sometimes 1 pass looks better than 2 passes. Strange...
    Thanks,

    Hey Girshon
    this is more of a compressor forum question, but i can answer it here
    theoritically, a 2 pass VBR encode is a MUCH better option if you are limited to space with VERY complex scenes. a cbr encode is optimal for short encodes, or encodes where you have NO space limitation. of course this is how most encoders work.
    in compressors case, for SOME reason (unbeknown to me) a 2 pass vbr does not encode to a quality that where i can call acceptable, especially with accepatable bit-rates.
    this problem has seemed to come in compressor v2. a lot of people that use this version of compressor seem to recommend a CBR in compressor or a 2 pass vbr IN DVD SP.
    compressor v1 seems not to have this problem however. as a matter of fact, a lot of other DVD encoder, software or hardware dont seem to have this problem.
    if you do a search for 2 pass vbr in the compressor forums, you will see all the quality problems associated with compressor 2.
    Mikey m.

  • Can objects be passed between Applets and JSP?

    Can objects be passed between Applets and JSP? If so how? Thanks in advance.
    Scott

    see if this helps,
    http://forum.java.sun.com/thread.jsp?forum=54&thread=136847

  • Making choice between socket and RMI

    I never use RMI, but i am familiar to socket programming. i want to write an online game, I know that use RMI will easy than use socket, could anyone tell me what factors will affect the choice between using socket and RMI if don't consider which one i am familiar ?
    thanks
    jacky

    I would consider the amount of traffic your online game is going to be generating. Obviously, if the traffic is the bottleneck, you will want to optimize it as much as possible.
    I can see that if you are familiar with sockets and socket programming, where this is very appealing because after all, you can't get much faster than raw sockets. Also, the Java APIs around sockets are much easier than the equivalent BSD Socket C/C++ libraries.
    Still, RMI has much more to offer.
    o It is relatively easy to set up a connection
    o exceptions will be thrown when problems occur
    o serializing classes is so easy it's laughable
    o If performance becomes an issue, you can (as the previous poster suggests) create your own custom socket factory which optimizes the used bandwidth. Options here include compression if you have the CPU cycles to spare.
    o There are mechanisms in place for working RMI over firewalls
    Many of the things that RMI offers, you might find yourself re-writing in your own socket-based API. Personally, I would choose RMI.

  • Difference between socket and http in opera mini

    Sir,
                     can any one say in simple language, what is the difference between socket and http connection. Is http connection possible in opera mini? Which is best suited for economy in use and fee
    Solved!
    Go to Solution.

    First thing to do is to make your phone open the web pages. I don't think the phone has low speeds.
    First
    ask your customer care for correct access point.
    1.
    Copy the access point name you received from custome care to-
    Settings-Connectivity-Packet data-Packet data setting,
    edit active access point.
    Give any name to active access point and activate it.
    Now goto settings- configurations - personal config.- add new- web, give any name to web and press back twice.
    Now again add new access point in personal configurations, give any account name to this access point.
    Copy the access point name which you got from ccare to bearer settings- packet data access pt.
    Press back three times and activate this access point.
    Now in default config. Settings activate personal config.
    Now all apps which need internet connection like
    opera mini should work fine.
    2.
    Saved pages of Opera mini 4.x won't open with opera mini 7.x version.
    Saved pages are stored with an extension .obml.
    Connect memory card to your pc using a card reader,
    you can find them by enabling hidden folders and searching .obml.
    Now right click on any obml file of search results and click open file location or move them to any folder you like and
    note down the files location.
    Now goto saved pages of your opera mini, manage, set folder. Set the folder location to where .obml files are stored
    Now your old saved pages can be opened.
    Hope this helps.
    -------------------If this post helped you, click on accept as solution.------------------
    -----------------------------Appreciate by clicking on white star.----------------------------

  • Test and Dev configuration choosing between servers

    Need to create 2 node setups for Test and Dev utilizing 3 servers
    Server A - 8GB ram, 146GBx2 hd, 4 core 1.2GHz process.
    Server B - same as above
    Server C - 8GB Ram, 146GBx16 hd, 4 Dual corex1.2 GHz process
    What I was thinking was to make Server A and SErver B as the Apps Tier and server C to host the DB tier for both server A and server B
    Server A - Hosting Test App Tier
    Server B - Hosting Dev App Tier
    Server C - Hosting DB tier for TEst AND DB tier for Dev
    There are other combinations also possible. Do let me know if you feel some other permutation might be useful and why?

    Sunil,
    Since you have limitation in space on Server A and Server B, I believe the above should be the best configuration. If your database size is small and/or if you can manage to add more space to Server A and Server B, then I would suggest you have the TEST instance on Server A, C and DEV instance on Server B, C as follows:
    - Test instance: Application on Server C, and Database on Server A
    - DEV instance: Application on Server C, and Database on Server B

  • Communication between servers on different FIs

    Just want to verify communication between UCS servers on same chassis but having active vNICs on different FIs (Diagram attached). I suppose all commuication between server-A & server-B will happen through Layer 2 switch as server-A will generate an ARP request for Server-B, that will be passed over to FI-A and then to L2 switch down to FI-B, where server-B will respond back with it's MAC that will then be passed to Server-A via FI-B to L2 switch to FI-A.I don't expect any traffic between servers A & B be routed via firewall? Is there anything I need to be careful about in this design? Going forward we will have multiple subinterfaces on the firewall for different VLANs and all servers will use Firewall as default gateway.

    you may want to look at the throughput of your firewall for server-server traffic in different VLANs. If your L2 switch is 10G but your firewall is only 1G then you could have a potential bottle neck.

  • "Portable" way to do message passing between threads?

    (I posted this on the Apple Developer Forums already, but since that forum is only accessible to registered and paid iPhone developers, I thought it would be nice to put it here as well so as to get some more potential eyeballs on it. I apologize if this kind of "cross-posting" is not kosher/is frowned upon around here.)
    Hey everybody,
    "Long-time listener, first-time caller," heh.
    I've been working for the past 2-3 months on my very first iPhone app. Actually, what I've been working on is a framework that I plan to use in an iPhone app of my own but which I am also trying to write for the "lowest-common-denominator" so that I (and others) can use it in other apps written for both Mac and iPhone.
    Not only is this my first time writing an iPhone app, it is my first time writing for any Apple platform. In fact, it is my first time using Objective-C, period. I cannot stress this enough: I am a "n00b." So go easy on me. I also have not worked with threading before this, either, on any platform, so the learning curve for me here is rather significant, I'm afraid. I am NOT afraid of either taking the time to learn something properly OR of rolling up my shirtsleeves and working. However, on account of my experiences so far, I am finding myself (not to flame or anything!) quickly becoming frustrated by and disillusioned with not so much Objective-C itself, but the Foundation frameworks.
    So with that said, read on, if you dare...
    The basic idea behind my project is that the framework I am writing will present an API to developers which will allow them to write client apps that interact with a particular network appliance or network-aware embedded system. I already have my basic set of classes up and functioning, and the framework works to my satisfaction both on MacOS and iPhoneOS. The platforms I am targeting are MacOS X Tiger 10.4 and later, and iPhoneOS, and up until this point, I've managed to keep a codebase that works on all of the above.
    What I wanted to do next was add some multithreaded goodness to the mix. (Woe is me.) I have asynchronous network socket I/O working within the main thread, and it, in fact, works a treat. In my test app on the phone, I've managed to keep the UI nice and responsive by using the main thread's runloop efficiently. But even though TCP async I/O works fine within the main thread, I want to be able to split out and offload the processing of any data received by the app from the appliance to its own thread. (It is possible, and even desirable, for an application using this framework to be connected to multiple appliances simultaneously.)
    My idea, in order to try to keep things as simple and as clean as possible, was to implement a wrapper class that presented my other main class as an "actor." So, rather than instantiating my main class, one would create an instance of the wrapper class which would in turn control a single instance of my main class and spawn its own thread that the network connection and all data processing for that particular connection would run within.
    (I hope I'm making sense so far...)
    Out of the gate, writing a subclass of NSThread sounds like the logical design choice for an "actor-type" thread, but because I was trying to maintain Tiger compatibility, I stuck with +detachNewThreadSelector:etc.
    Once I decided to pursue the actor model, though, the main problem presented itself: how to best pass messages between the main thread and all of the "actor" threads that might be spawned?
    I stumbled upon -performSelector:onThread:withObject:, and knew instantly that this was exactly what I was looking for. Unfortunately, it doesn't exist on Tiger; only its much more limited little brother -performSelectorOnMainThread:withObject: does. So I kept looking.
    All of the pre-Leopard documentation, tutorials, and sample code that I read indicated that to pass messages between threads, I needed to basically pretend that the threads were separate processes and use the expensive Distributed Objects mechanism to get messages back and forth. Unfortunately, even if that WAS a desirable option, iPhoneOS does not have any support for DO! Grrr...
    Finally, I thought I found the answer when I ran into a third-party solution: the InterThreadMessaging library from Toby Paterson (available @ http://homepage.mac.com/djv/FileSharing3.html). In this library, the author basically implemented his own version of -performSelector:onThread:withObject: called -performSelector:withObject:inThread:. Sounds close enough, right? And actually, it is pretty darn close. It's made to do exactly what it sounds like, and it does it in a platform-neutral way that works on pre-Leopard systems as well as iPhoneOS, using Mach ports instead of DO.
    (...wellll, ALMOST. I discovered after I built a small test app around it that it actually isn't "iPhone-clean." The author used an NSMapTable struct and the NSMap*() functions, which don't exist in iPhoneOS, and he also implemented the handlePortMessage delegate method, but although iPhoneOS has NSPort, it DOESN'T have NSPortMessage. GAAARGH. So I took the time to replace the NSMapTable stuff with NSValue-wrapped objects inside of an NSMutableDictionary, and replaced the handlePortMessage method implementation with a handleMachMessage method, which took some doing because I had to figure out the structure of a Mach message, NO thanks to ANY of the available documentation...)
    Once I started using it, though, I quickly discovered that this implementation wasn't up to snuff. My "actor" class and my main thread will be passing a ton of messages to each other constantly whenever there is network activity, and with InterThreadMessaging, I found that whenever activity started to ramp up, it would collapse on itself. This mostly took the form of deadlocks. I found a note that someone else wrote after experiencing something similar with this library (quoted from DustinVoss @ http://www.cocoadev.com/index.pl?InterThreadMessaging):
    "It is possible to deadlock this library if thread A posts a notification on thread B, and the notification on B causes a selector or notification to be posted on thread A. Possibly under other circumstances. I have resolved this in my own code by creating an inter-thread communication lock. When a thread wants to communicate, it tries the lock to see if another thread is already using the InterThreadMessaging library, and if it can't get the lock, it posts a message to its own run-loop to try again later. This is not a good solution, but it seems to work well enough."
    So I tried implementing what he described using a global NSLock, and it did help with some of the deadlocks. But not all. I believe the culprit here is the Mach ports system itself (from the NSPortMessage documentation for -sendBeforeDate:):
    "If the message cannot be sent immediately, the sending thread blocks until either the message is sent or aDate is reached. Sent messages are queued to minimize blocking, but failure can occur if multiple messages are sent to a port faster than the portís owner can receive them, causing the queue to fill up."
    InterThreadMessaging in fact calls -sendBeforeDate: and exposes the deadline option, so I tried setting a really short time-to-live on the Mach messages and then intercepted any NSPortTimeoutExceptions that were thrown; upon catching said exceptions, I would then re-queue up the message to be sent again. It worked, but Performance. Was. A. Dog. At least the message queue wouldn't be full indefinitely anymore, causing the main thread to block, but during the whole time that these messages were expiring because the queue was full and then being re-queued, either the main thread was trying to send more messages or the actor thread was trying to send more messages. And as far as I can tell, the Mach ports queue is global (at the very least, there is seemingly only one per process). The message would get through with this model...eventually.
    JUST IN CASE the problem happened to be something I screwed up as I was rewriting portions of the InterThreadMessaging library so that it would compile and work on the iPhone SDK, I substituted in the original version of the library in my Mac test app to see if any of these problems became non-issues. I found that both versions of the library -- mine and the original -- performed identically. So that wasn't it.
    Finally, in frustration I said, "screw it, I'm going to try it the Leopard way," and replaced all of the method calls I was making to InterThreadMessaging's -performSelector:withObject:inThread: with calls to Foundation's native -performSelector:onThread:withObject: instead, changing nothing else within my code in the process. And wouldn't you know: IT WORKED GREAT. Performance was (and is) fantastic, about on-par with the non-threaded version when only dealing with a single connection/instance of my class.
    So, in the end, I was able to do nothing to salvage the InterThreadMessaging implementation of cross-thread method calling, and as far as I can tell, I'm out of (good) options. And thus my mind is filled with questions:
    How is the Leopard -performSelector:onThread: method implemented? I'm guessing not using Mach ports, given that I didn't have the same blocking & deadlocking problems I had with InterThreadMessaging. Is it possible to re-implement this Leopard+ method in a similar manner as a category to NSObject under Tiger? Or is it possible, perhaps, to increase the size of the Mach ports queue so that InterThreadMessaging works at a sane level of performance? Or -- I'm getting desperate here -- is there any way that I could trick -performSelectorOnMainThread: to target a different thread instead? (I am assuming here that -performSelectorOnMainThread is implemented under-the-hood much like the new -performSelector:onThread: is implemented, but with a hard-coded NSThread pointer built-in to the code, and that the new method just exposes a more flexible interface to what is basically the same code. I'm probably wrong...) Is there another third-party library out there that I've missed that fits my requirements for being able to do message-passing between threads in an efficient and portable manner?
    I refuse to believe that there is no way for me to maintain compatibility with all of the platforms I wish to support without having to resort to making preprocessor #ifdef spaghetti out of my code. And there SURELY has to be a better way of doing cross-thread message passing in Tiger without using Distributed Objects, for Pete's sake! Is this really how people did it for years-on-end since the dawn of NeXT up until the advent of Leopard? And if there really, genuinely wasn't another alternative, then what is up with the lack of DO in iPhoneOS?? Does Apple seriously intend for developers who have good, solid, tested and working code to just chuck it all and start over? What if there was some aspect of DO that previous implementations relied upon that cannot be recreated with simple -performSelector:onThread: calls? (I don't know what those aspects would be...just a hypothetical.) I mean, I can understand needing to write new stuff from scratch for your UI given how radically different the interface is between the Mac and iPhone, but having to reimplement back-end guts such as something as elemental as threads...really?!
    I do laud the inclusion of the new method in Leopard as well as the new ability to subclass NSThread itself. But for those of us that need to support Tiger for one reason or another, some of these restrictions and omissions within iPhoneOS seem like rather pointless (and frustrating) roadblocks.
    As I hope is obvious here, I have tried to do my homework before throwing up my hands and pestering y'all. If you have the patience to deal with me, please tell me what I am missing.
    Thanks for taking the time to read,
    -- Nathan

    Thanks again for your patience. Comments below.
    etresoft wrote:
    It is pretty unusual that anyone would want to call perfomrSelector on any thread other than the main thread.
    What I described in my original post was not a worker thread, but an "actor."
    It is hard for me to answer this question because there are so many options available to do "message passing". The fact that you think there are so few tells me that you really aren't sure what you need to use.
    I didn't say there were few options for message passing. I said there were few options for message passing that fit my criteria, which are that any potential solutions should both A) work efficiently and with good performance, and B) be available both pre-Leopard AND on the iPhone. -performSelector: ain't available before Leopard. Distributed Objects is overkill. Kernel Mach messages apparently have a high overhead, too, as my experience with the third-party library I wrote about in my original message shows.
    ...consider notifications.
    I thought notifications couldn't be posted across threads, either. How do I post a notification to another thread's default notification center or notification queue from a different thread?
    The notification center is owned by the process. Each run loop can listen for just the notifications it wants. You don't "pass" or "send" notifications, you run then up the flagpole for all to see.
    I am aware of how to use notifications. The documentation for NSNotificationCenter clearly states that "In a multithreaded application, notifications are always delivered in the thread in which the notification was posted, which may not be the same thread in which an observer registered itself."
    So, again, I don't see how one thread can post a notification in such a way that the observer's registered method is executed in another thread (posting notifications "across threads"). This probably isn't a big deal if you are using mutexes (assuming you don't actually care which thread carries out the task associated with the notification posting), but as I said before, this is not what I'm after.
    I don't know what you are really after.
    Allow me to attempt to explain a second time, in a more concise fashion.
    My app will have multiple, persistent TCP connections open, one connection per remote device. The user will be able to select a task to execute on a particular device that we have a connection open to, and get back from the application real-time updates as to the progress or results of the execution of that task. In certain cases, the length of the task is infinite; it will keep executing forever and sending back results to my application which will update its display of the results every second that ticks by until the user STOPS that particular task.
    This can be done simply using async I/O in the main runloop, sure. But if I were going to thread this so that I could be processing the results I've received back from one *or more* remote devices while also doing something else, given that I will only have one (persistent) connection open to any given remote device that I'm interacting with (that is to say, I won't be opening up a separate TCP session for every single task I want to execute on a single device simultaneously), it makes sense _to me_ to implement this as I've described: with every connection to each remote device getting its own thread that lasts for the lifetime of the TCP session (which could be the entire time the application is running, times however many devices the user wishes to be connected to while in the app). I won't be spawning a new thread for every task the user wishes to ask a remote device to do.
    This is why (I think) I need bi-directional messaging between the main thread and each of these threads dedicated to a given remote device that we have an active session with/connection to. The main thread needs to be able to tell remote device X (which already has a running thread dedicated to it) to do task A, and then get real-time feedback from that remote device so that the main thread can be displaying it to the user as it is coming back. Same with remote device Y running task B, simultaneously. At any time during the execution of these tasks, the user needs to be able to tell my app to stop one of these tasks, and the main thread needs to send that message to one of the remote devices via that device's dedicated thread.
    This is why I am talking about this in terms of the "actor model," and not the "worker thread model," because the former model seems to fit what I want to do.
    -- Nathan

Maybe you are looking for

  • I spilt milk on MacBook Pro, it won't start - what can I do? (I've left it alone for awhile)

    A small amount of milk spilt on the top of my MacBook Pro (I bought it new about three months ago). It almost immediately shut off and it refuses to start, even having left it for 30 hours in an attempt to allow it to dry out. My question really is w

  • Dynamic Text Field Scrolling

    I have a dynamic text field that I want to add a UIScrollBar to. The dynamic text field has an rssreader attatched to it so it is reading from an xml file on the same server. When I attatch it and go to preview my movie, it doesn't work. There is jus

  • Macbook Pro Harddrive Broken?

    Hi all, I appreciate you're all busy people - but if you had a second, some advice would be brilliant. (Also - apologies in advance for being a hardly a tech genius). I have a MacBook Pro (2010), not sure of which version of OS X, and during normal i

  • Software Duplicate in Report

    Hi everbody I have a doubt with software report. When a run a report for specific computer, visual studio appear twice like visual studio 2013 professional and visual studio premium 2013. But looking in add\remove programs that is only visual studio

  • CSWAdmin.publishRecordType   Exception

    Hi! I want to set up CSW. But when I'm running compileAndRunClient.bat runcswct from wsclient.jar, following Exception is thrown (Stacktrace): java.sql.SQLException: ORA-24344: success with compilation error ORA-06512: in "MDSYS.SDO_CSW_PROCESS", Zei