简体   繁体   中英

Socket - Address already in use

I'm new to Socket and I try to code an Server and Client on the same application just to see how it work.

Code:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ((Button)this.findViewById(R.id.bouton1)).setOnClickListener(this);

}


public void onClick(View v) {
    TCPServer server = new TCPServer();
    TCPClient client = new TCPClient();
    server.start();
    client.start();     
}

public class TCPServer extends Thread {
    @Override public void run() {

        try {

            ServerSocket s = new ServerSocket(8080,0,InetAddress.getLocalHost());
            Socket cli = s.accept();

            byte[] b = new byte[512];
            int n;

            InputStream is = cli.getInputStream();
            while((n=is.read(b))>0){
                Log.d("TCPServer",new String(b));
                if(new String(b).contains("\r\n\r\n"))break;
                b = new byte[512];
            }

            OutputStream os = cli.getOutputStream();
            os.write("Hello".getBytes());

        } catch (Exception e) { 
            e.printStackTrace();
        } 



    }
}
public class TCPClient extends Thread {     
    @Override public void run() {

        try {
            Socket s = new Socket(InetAddress.getLocalHost().getHostAddress(),8080);
            //Socket s = new Socket("www.google.com",80);                               
            //Log.i("",s.getLocalAddress().getHostAddress());

            byte[] b = new byte[512];
            int n;

            if (s.isConnected()) {

                OutputStream os = s.getOutputStream();
                os.write("Hi How are you \r\n\r\n".getBytes());

                InputStream is = s.getInputStream();
                while((n=is.read(b))>0){
                    Log.d("TCPClient",new String(b));
                    b = new byte[512];
                }

            }

            s.close();

        } catch (Exception e) { 
            e.printStackTrace();
        } 


    }
}

The code work fine but just for the first time I click my button. the error is java.net.BindException: Address already in use .

If it works the first time, but not after that it sounds like you aren't closing your socket correctly before your program exits.

You can check to see if it's still open by running

netstat

pending your not on a windows machine. I'm sure they have something similar.

对不起,我只是忘了打开ServerSocket之后将其关闭

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM