【问题标题】:Android Socket is showing "Connected" when a Client Request connection but "cant send messages"当客户端请求连接但“无法发送消息”时,Android Socket 显示“已连接”
【发布时间】:2017-11-02 03:21:56
【问题描述】:

所以,就像标题说的那样,我创建了一个简单的 android 套接字服务器和通过 Wifi 连接的客户端。两台设备都在同一个 Wifi 网络上。服务器显示它托管连接的 IP 地址....在客户端中您必须编写托管服务器的 IP 地址.....

所以,我的问题是当我在客户端中输入 IP 地址时,服务器显示“已连接”。但是当我开始发送消息时,它不会将消息发送到另一端,既不是服务器到客户端,也不是客户端到服务器。

//#Server Java File
package inc.teckzy.wif_chat;

import android.net.wifi.WifiManager;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Helper extends AppCompatActivity {
    EditText smessage;
    TextView chat,display_status;
    String str,msg="";
    int serverport = 6666;
    ServerSocket serverSocket;
    Socket client;
    Handler handler = new Handler();
    WifiManager wmanager;
    Boolean Alive;
    DataOutputStream out;
    DataInputStream in;
    Button button_sent;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_helper);

        wmanager = (WifiManager) getSystemService(WIFI_SERVICE);
        @SuppressWarnings("deprecation")
        String ip = Formatter.formatIpAddress(wmanager.getConnectionInfo().getIpAddress());
        smessage = (EditText) findViewById(R.id.smessage);
        chat = (TextView) findViewById(R.id.chat);
        display_status = (TextView) findViewById(R.id.display_status);

        Thread serverThread = new Thread(new serverThread());
        serverThread.start();
        Alive = serverThread.isAlive();
        display_status.setText("Hosted on: " + ip);
        button_sent = (Button) findViewById(R.id.button_sent);
        button_sent.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Thread sentThread = new Thread(new sentMessage());
                sentThread.start();
            }
        });
}

    class sentMessage implements Runnable{
        @Override
        public void run() {
            try{
                client = serverSocket.accept();
                out = new DataOutputStream(client.getOutputStream());
                str = smessage.getText().toString();
                msg = msg+"\n Server:" +str;
                handler.post(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        chat.setText(msg);
                    }
                });
                out.writeBytes(str);
                out.flush();
                out.close();
                client.close();

            }catch(IOException e){}
        }
    }

    public class serverThread implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    serverSocket = new ServerSocket(serverport);
                    client = serverSocket.accept();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            display_status.setText("Connected");
                        }
                    });
/*******************************************
 setup i/p streams
 ******************************************/
                    in = new DataInputStream(client.getInputStream());
                    String line = in.readUTF();
                    while (!line.equals("STOP")) {
                        msg = msg + "\n Client : " + line;
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                chat.setText(msg);
                            }
                        });
                    }
                    in.close();
                    client.close();
                }
            } catch (Exception e) {
            }

        }
    }
}

//#Client Side Java File
package reciever;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

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

import inc.teckzy.wif_chat.R;

public class ClientSide extends AppCompatActivity {
    EditText serverIp,smessage;
    TextView chat;
    String serverIpAddress = "",msg = "",str;
    Handler handler = new Handler();
    Button sent,connectPhones;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client_side);
        chat = (TextView) findViewById(R.id.chat);
        serverIp = (EditText) findViewById(R.id.server_ip);
        smessage = (EditText) findViewById(R.id.smessage);
        sent = (Button) findViewById(R.id.sent_button);
        connectPhones = (Button) findViewById(R.id.connect_phones);

        //-----------------------Connecting to IP------------------------------//
        connectPhones.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                serverIpAddress = serverIp.getText().toString();
                if (!serverIpAddress.equals(""))
                {
                    Thread clientThread = new Thread(new
                            ClientThread());
                    clientThread.start();
                }
            }
        });
        //-------------------------------Initializing sent thread----------------//
        sent.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Thread sentThread = new Thread(new sentMessage());
                sentThread.start();
            }
        });

    }
class sentMessage implements Runnable
{
    @Override
    public void run()
    {
        try
        {
            InetAddress serverAddr =
                    InetAddress.getByName(serverIpAddress);
            Socket socket = new Socket(serverAddr, 6666); //
            DataOutputStream os = new DataOutputStream(socket.getOutputStream());
            str = smessage.getText().toString();
            str = str + "\n";
            msg = msg + "Client : " + str;
            handler.post(new Runnable() {
                @Override
                public void run() {
                    chat.setText(msg);
                }
            });
            os.writeUTF(str);
            os.flush();
            os.close();
            socket.close();
        }
        catch(IOException e)
        {
        }
    }
}

    public class ClientThread implements Runnable
    {
        InetAddress serverAddr;
        public void run()
        {
            try
            {
                while(true)
                {
                    serverAddr = InetAddress.getByName(serverIpAddress);
                    Socket socket = new Socket(serverAddr, 6666);
/*******************************************
 setup i/p streams
 ******************************************/
                    DataInputStream in = new
                            DataInputStream(socket.getInputStream());
                    String line = in.readUTF();
                    while (!line.equals("Stop"))
                    {
                        msg = msg + "Server : " + line + "\n";
                        handler.post(new Runnable()
                        {
                            @Override
                            public void run()
                            {
                                chat.setText(msg);
                            }
                        });
                    }
                    in.close();
                    socket.close();
                    Thread.sleep(100);
                }

            }
            catch (Exception e)
            {}
        }
    }
}

【问题讨论】:

  • 你不应该在循环中创建ServerSocket,但如果你要完全忽略IOExceptions,那么你的代码应该如何表现就完蛋了。

标签: java android sockets server clients


【解决方案1】:

每次需要发送消息时,您都在服务器端使用client = serverSocket.accept();。

在客户端,您尝试多次使用new Socket (serverAddr, 6666); 创建一个新的 Socket 连接。

维护单个Socket 连接和单个数据输入/输出流(不要创建多个实例),然后就可以了。

参见示例:

https://github.com/nabinbhandari/android-socket-messaging

【讨论】:

    【解决方案2】:

    我解决了它刚刚删除了“sentMessage”线程并在两个Activity中的“sent.setOnClickListener(new View.OnClickListener()”中实现了输出流也做了一些修改......这是工作代码活动......希望这个会帮助某人

    #Server Activity
    package inc.teckzy.wifi_chat;
    
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.text.format.Formatter;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Helper extends AppCompatActivity {
        EditText smessage;
        TextView chat,display_status;
        String str,Smsg,Cmsg="";
        int serverport = 6666;
        ServerSocket serverSocket;
        Socket client;
        Handler updateConversationHandler =new Handler();
        WifiManager wmanager;
        DataOutputStream out;
        DataInputStream in;
        Button button_sent;
        StringWriter errors = new StringWriter();
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_helper);
    
            wmanager = (WifiManager) getSystemService(WIFI_SERVICE);
            @SuppressWarnings("deprecation")
            String ip = Formatter.formatIpAddress(wmanager.getConnectionInfo().getIpAddress());
            smessage = (EditText) findViewById(R.id.smessage);
            chat = (TextView) findViewById(R.id.chat);
            display_status = (TextView) findViewById(R.id.display_status);
    
    
    
            Thread serverThread = new Thread(new serverThread());
            serverThread.start();
    
            display_status.setText("Hosted on: " + ip);
            button_sent = (Button) findViewById(R.id.button_sent);
    
    
            button_sent.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    try {
                            out = new DataOutputStream(client.getOutputStream());
                            str = smessage.getText().toString();
                            Smsg = "Server:" + str;
                            updateConversationHandler.post(new updateUIThread(Smsg));
                            out.writeUTF(str);
                            out.flush();
                    }catch (Exception e) {
                        e.printStackTrace(new PrintWriter(errors));
                        updateConversationHandler.post(new updateUIThread(errors.toString()));
                    }
                    smessage.getText().clear();
                }
            });
    }
    
        public class serverThread implements Runnable {
            @Override
            public void run() {
                try {
                    serverSocket = new ServerSocket(serverport);
                    while (true) {
                        client = serverSocket.accept();
                        updateConversationHandler.post(new updateUIThread("Connected"));
    /*******************************************
     setup i/p streams
     ******************************************/
                        in = new DataInputStream(client.getInputStream());
                        String line = "";
                        while (!line.equals("STOP")) {
                            line=in.readUTF();
                            Cmsg ="Client: "+ line;
                            updateConversationHandler.post(new updateUIThread(Cmsg));
                        }
                        in.close();
                        client.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace(new PrintWriter(errors));
                    updateConversationHandler.post(new updateUIThread(errors.toString()));
                }
    
            }
        }
    
        class updateUIThread implements Runnable {
            private String msg;
            updateUIThread(String str) {
                this.msg = str;
            }
            @Override
            public void run() {
                chat.setText(chat.getText().toString()+ msg + "\n");
            }
        }
        @Override
        protected void onStop() {
            super.onStop();
            try {
                // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    和

        #Client Activity
    package inc.teckzy.wifi_chat.reciever;
    
    import android.net.wifi.WifiManager;
    import android.os.Bundle;
    import android.os.Handler;
    import android.support.v7.app.AppCompatActivity;
    import android.text.format.Formatter;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import java.io.DataInputStream;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.net.InetAddress;
    import java.net.Socket;
    
    import inc.teckzy.wifi_chat.R;
    
    public class ClientSide extends AppCompatActivity {
        EditText serverIp,smessage;
        TextView chat;
        String serverIpAddress = "",Smsg,Cmsg = "",str;
        Handler updateConversationHandler = new Handler();
        Button sent,connectPhones;
        Socket socket;
        DataInputStream in;
        DataOutputStream out;
        StringWriter errors = new StringWriter();
        WifiManager wmanager;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_client_side);
            chat = (TextView) findViewById(R.id.chat);
            serverIp = (EditText) findViewById(R.id.server_ip);
            wmanager = (WifiManager) getSystemService(WIFI_SERVICE);
            smessage = (EditText) findViewById(R.id.smessage);
            sent = (Button) findViewById(R.id.sent_button);
            connectPhones = (Button) findViewById(R.id.connect_phones);
    
            //-----------------------Connecting to IP------------------------------//
            connectPhones.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    serverIpAddress = serverIp.getText().toString();
                    if (!serverIpAddress.equals(""))
                    {
                        Thread clientThread = new Thread(new
                                ClientThread());
                        clientThread.start();
                    }
                }
            });
            //-------------------------------Initializing sent thread----------------//
            sent.setOnClickListener(new View.OnClickListener()
            {
                @Override
                public void onClick(View v)
                {
                    try {
                        out = new DataOutputStream(socket.getOutputStream());
                        str = smessage.getText().toString();
                        Cmsg = "Client: " + str;
                        updateConversationHandler.post(new updateUIThread(Cmsg));
                        out.writeUTF(str);
                        out.flush();
                    }catch(Exception e){
                        e.printStackTrace(new PrintWriter(errors));
                        updateConversationHandler.post(new updateUIThread(errors.toString()));}
                    smessage.getText().clear();
                }
            });
    
        }
    
        public class ClientThread implements Runnable
        {
            InetAddress serverAddr;
            public void run()
            {
                try
                {
                    serverAddr = InetAddress.getByName(serverIpAddress);
                    socket = new Socket(serverAddr, 6666);
    
                    updateConversationHandler.post(new updateUIThread("Connected"));
                    String ip = socket.getRemoteSocketAddress().toString();
                    updateConversationHandler.post(new updateUIThread(ip));
                    out = new DataOutputStream(socket.getOutputStream());
                    in = new DataInputStream(socket.getInputStream());
    /*******************************************
     setup i/p streams
     ******************************************/
                        String line = "";
                        while (!line.equals("Stop")) {
                            line=in.readUTF();
                            Smsg ="Server: " + line + "\n";
                            updateConversationHandler.post(new updateUIThread(Smsg));
                        }
                        out.close();
                        in.close();
                        socket.close();
    
                }
                catch (IOException e)
                {updateConversationHandler.post(new updateUIThread("IO Error"));}
            }
        }
        class updateUIThread implements Runnable {
            private String msg;
            updateUIThread(String str) {
                this.msg = str;
            }
            @Override
            public void run() {
                chat.setText(chat.getText().toString()+ msg + "\n");
            }
        }
        @Override
        protected void onStop() {
            super.onStop();
            try {
                // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      相关资源
      最近更新 更多