Java Networking

Discussion in 'Java' started by Chase Preuninger, Nov 11, 2007.

  1. I have been having trouble with my file transfer program that I have
    been writing over the past few weeks. It makes p2p to transfer files
    and the two sides update each over based upon string being sent over
    one port (5013) and the actual data being sent over another (5012).
    This works great except for when the user on the receiving side
    accepts the download the update only makes it to the user on the other
    side 20% of the time. Bellow I have provided the class that manages
    the socket.


    //This manages the connection for the receiving side
    package com.cpsoft.filetransfer.net;

    import java.net.*;
    import java.io.*;
    import java.util.*;
    import com.cpsoft.filetransfer.*;
    import java.util.*;

    public class SocketIO
    {
    private Socket s;
    private Writer out;
    private Scanner in;
    private InListener listener;
    public SocketIO(Socket s) throws Exception
    {
    this.s = s;
    try
    {
    s.setTcpNoDelay(true);
    s.setSendBufferSize(5);
    out = new OutputStreamWriter(s.getOutputStream(),
    "UTF-8");
    in = new Scanner(this.s.getInputStream());
    }
    catch(Exception ex)
    {
    throw ex;
    }
    listener = new InListener();
    listener.start();
    }
    public void SendUpdate(Update u)
    {
    try
    {
    out.write(u.toString());
    out.flush();
    }
    catch (IOException ex)
    {
    ex.printStackTrace();
    }
    }
    private ArrayList updateEvents = new ArrayList();
    public void addUpdateListener(UpdateListener l)
    {
    updateEvents.add(l);
    }
    private class InListener extends Thread
    {
    public InListener()
    {
    super();
    setPriority(Thread.MAX_PRIORITY);
    }
    public void run()
    {
    while(!interrupted())
    {
    if(in.hasNext())
    {
    try
    {
    Update u = Update.parseString(in.nextLine());
    if(u.getStatus().equals(Update.ACCEPT))
    {
    for(int i = 0; i < updateEvents.size(); i+
    +)

    ((UpdateListener)updateEvents.get(i)).AcceptUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.CANCEL))
    {
    for(int i = 0; i < updateEvents.size(); i+
    +)

    ((UpdateListener)updateEvents.get(i)).CancelUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.DONE))
    {
    for(int i = 0; i < updateEvents.size(); i+
    +)

    ((UpdateListener)updateEvents.get(i)).DoneUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.REQUEST))
    {
    for(int i = 0; i < updateEvents.size(); i+
    +)

    ((UpdateListener)updateEvents.get(i)).RequestUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.DECLINE))
    {
    for(int i = 0; i < updateEvents.size(); i+
    +)

    ((UpdateListener)updateEvents.get(i)).DeclineUpdateReceieved(u);
    }
    for(int i = 0; i < updateEvents.size(); i++)

    ((UpdateListener)updateEvents.get(i)).UpdateReceieved(u);
    }
    catch(Exception ex)
    {
    continue;
    }
    }
    }
    }
    }
    public void close()
    {
    try
    {
    listener.interrupt();
    if(!s.isClosed())
    s.close();
    }
    catch(Exception ex)
    {

    }
    }
    }



    //Socket used on send side
    package com.cpsoft.filetransfer.net;

    import com.cpsoft.filetransfer.*;
    import java.awt.event.*;
    import java.net.*;
    import java.io.*;
    import java.util.*;

    public class SendUpdateSocket extends Socket
    {
    public PrintWriter out;
    public Scanner in;
    private Thread inbound;

    public SendUpdateSocket(InetAddress host, int port) throws
    IOException
    {
    super(host, port);
    }
    public SendUpdateSocket()
    {
    super();
    }
    private ArrayList updateListeners = new ArrayList();

    public void connect(SocketAddress endpoint) throws IOException
    {
    super.connect(endpoint);
    inbound = new InboundManager();
    out = new PrintWriter(getOutputStream());
    in = new Scanner(getInputStream());
    inbound.start();
    setTcpNoDelay(true);
    }
    public void addUpdateListener(UpdateListener u)
    {
    updateListeners.add(u);
    }
    public void SendUpdate(Update u)
    {
    out.println(u.toString());
    out.flush();
    }
    public void close() throws IOException
    {
    super.close();
    inbound.interrupt();
    }
    private class InboundManager extends Thread
    {
    public InboundManager()
    {
    super();
    setPriority(Thread.MAX_PRIORITY);
    }
    public void run()
    {
    System.out.println("RUNNING");
    while(!interrupted())
    {
    if(in.hasNext())
    {
    try
    {
    Update u = Update.parseString(in.nextLine());
    if(u.getStatus().equals(Update.ACCEPT))
    {
    for(int i = 0; i < updateListeners.size();
    i++)

    ((UpdateListener)updateListeners.get(i)).AcceptUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.CANCEL))
    {
    for(int i = 0; i < updateListeners.size();
    i++)

    ((UpdateListener)updateListeners.get(i)).CancelUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.DONE))
    {
    for(int i = 0; i < updateListeners.size();
    i++)

    ((UpdateListener)updateListeners.get(i)).DoneUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.REQUEST))
    {
    for(int i = 0; i < updateListeners.size();
    i++)

    ((UpdateListener)updateListeners.get(i)).RequestUpdateReceieved(u);
    }
    else if(u.getStatus().equals(Update.DECLINE))
    {
    for(int i = 0; i < updateListeners.size();
    i++)

    ((UpdateListener)updateListeners.get(i)).DeclineUpdateReceieved(u);
    }
    for(int i = 0; i < updateListeners.size(); i+
    +)

    ((UpdateListener)updateListeners.get(i)).UpdateReceieved(u);
    }
    catch(Exception ex)
    {
    ex.printStackTrace();
    }
    }
    }
    }
    }
    }
     
    Chase Preuninger, Nov 11, 2007
    #1
    1. Advertising

  2. Chase Preuninger wrote:
    >I have been having trouble with my file transfer program that I have
    >been writing over the past few weeks. ...


    For the best chance of getting help, I recommend you
    1) Post an SSCCE*. The two classes can be incorporated into
    one source file by reducing the access from public to 'default',
    moving the imports to the top, getting rid of the package
    statement (not entirely necessary, but easier), and fixing
    (shortenning) those dozen lines that line-wrap**.
    2) Ask a specific question.

    * <http://www.physci.org/codes/sscce.html>
    ** A tool to help check line width ..
    <http://www.physci.org/twc.jnlp>
    Try to keep it under 62 chars width for usenet code
    postings.

    --
    Andrew Thompson
    http://www.athompson.info/andrew/

    Message posted via JavaKB.com
    http://www.javakb.com/Uwe/Forums.aspx/java-general/200711/1
     
    Andrew Thompson, Nov 11, 2007
    #2
    1. Advertising

  3. Chase Preuninger wrote:
    >I have been having trouble with my file transfer program that I have
    >been writing over the past few weeks. ...


    As a general tip - never 'swallow' exceptions in code that
    is breaking inexplicably.

    e.g. This..

    catch(Exception ex)
    {

    }

    ..should be..

    catch(Exception ex)
    {
    // be very noisy about what went wrong
    ex.printStackTrace();
    }

    --
    Andrew Thompson
    http://www.athompson.info/andrew/

    Message posted via JavaKB.com
    http://www.javakb.com/Uwe/Forums.aspx/java-general/200711/1
     
    Andrew Thompson, Nov 11, 2007
    #3
  4. On Sat, 10 Nov 2007 17:40:11 -0800, Chase Preuninger wrote:
    > I have been having trouble with my file transfer program that I have
    > been writing over the past few weeks. It makes p2p to transfer files
    > and the two sides update each over based upon string being sent over
    > one port (5013) and the actual data being sent over another (5012).


    > This works great except for when the user on the receiving side
    > accepts the download the update only makes it to the user on the
    > other side 20% of the time.


    Exactly what happens in the other 80%? Does the connection fail? Is
    the file truncated or corrupted by the transfer? Do you get an
    exception? Be specific.

    AFAICT you are using a PrintWriter to send the file. Unless you're
    sending pure text, you really should be using a FileOutputStream.

    At first glance I'm unable to follow the logic in the code you've
    posted, and I'm not even sure I can see where you transfer any data.
    Post a concise example and describe the steps.

    /gordon


    --
     
    Gordon Beaton, Nov 11, 2007
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Rahul Sharma

    Is there Java.Networking group

    Rahul Sharma, Jul 23, 2003, in forum: Java
    Replies:
    6
    Views:
    412
    Jezuch
    Jul 23, 2003
  2. Robert Olofsson

    Re: Java I/O for Networking

    Robert Olofsson, Aug 22, 2003, in forum: Java
    Replies:
    2
    Views:
    407
    Robert Olofsson
    Aug 24, 2003
  3. VisionSet

    java to java networking

    VisionSet, Nov 19, 2003, in forum: Java
    Replies:
    0
    Views:
    281
    VisionSet
    Nov 19, 2003
  4. Steve R. Burrus

    Need help w. Java Networking.

    Steve R. Burrus, Jun 5, 2004, in forum: Java
    Replies:
    12
    Views:
    768
    Bryce
    Jun 7, 2004
  5. John Galt
    Replies:
    1
    Views:
    701
    zzyzx
    Jul 15, 2004
Loading...

Share This Page