【问题标题】:sending and recieving data through sockets in the same activity在同一个活动中通过套接字发送和接收数据
【发布时间】:2015-07-12 04:28:16
【问题描述】:

我正在使用 TCP 套接字通过客户端服务器线程在同一活动中从同一套接字发送和接收数据,其目的是将字符串发送到其他设备,并且该字符串将在其他设备时触发通知接收它然后该设备将重播诸如关闭或接受之类的内容,我遇到的问题是在发送字符串后其他设备接收它并发送关闭或接受的字符串但我的设备没有收到该字符串我猜那里是我的ServerThread 中的一个问题,请注意服务器线程和客户端线程在同一个活动中用作内部类并在按钮中被调用。 代码:

客户端线程

private class ChatClientThread extends Thread {








          @Override
          public void run() {
           Socket socket = null;
           DataOutputStream dataOutputStream = null;




           try {

            socket = new Socket("192.168.0.113", 23);
            dataOutputStream = new DataOutputStream(
              socket.getOutputStream());



            dataOutputStream.writeUTF("  "+"SolveProblemOrder_2");
            dataOutputStream.flush();

            ServerThread serv =new ServerThread();
            serv.start();

           } catch (UnknownHostException e) {
            e.printStackTrace();
            final String eString = e.toString();
            TicketDetails.this.runOnUiThread(new Runnable() {

             @Override
             public void run() {
              Toast.makeText(TicketDetails.this, eString, Toast.LENGTH_LONG).show();
             }

            });
           } catch (IOException e) {
            e.printStackTrace();
            final String eString = e.toString();
            TicketDetails.this.runOnUiThread(new Runnable() {

             @Override
             public void run() {
              Toast.makeText(TicketDetails.this, eString, Toast.LENGTH_LONG).show();
             }

            });
           } finally {
            if (socket != null) {
             try {
              socket.close();
             } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }
            }

            if (dataOutputStream != null) {
             try {
              dataOutputStream.close();
             } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
             }
            }



            TicketDetails.this.runOnUiThread(new Runnable() {

             @Override
             public void run() {

             }

            });
           }

          }


         }

服务器线程

public class ServerThread extends Thread {

          private ServerSocket serverSocket;
          private Socket clientSocket;


          public void run(){

            try{
              // Open a server socket listening on port 23
              InetAddress addr = InetAddress.getByName(getLocalIpAddress());
              serverSocket = new ServerSocket(23, 0,addr);
              try{
              clientSocket = serverSocket.accept();
             DataInputStream dataInputStream = new DataInputStream(clientSocket.getInputStream());
             String newMsg = null;
             Toast.makeText(getApplicationContext(), newMsg, Toast.LENGTH_LONG).show();
              // Client established connection.
              // Create input and output streams
              while (true) {
                     if (dataInputStream.available() > 0) {
                      newMsg = dataInputStream.readUTF();
                              }

              }}catch(Exception e){
                     e.printStackTrace();
                 }
              // Perform cleanup



            } catch(Exception e) {
              // Omitting exception handling for clarity
            }
          }

          private String getLocalIpAddress() throws Exception {
            String resultIpv6 = "";
            String resultIpv4 = "";

              for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); 
                en.hasMoreElements();) {

                NetworkInterface intf = en.nextElement();
                for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); 
                    enumIpAddr.hasMoreElements();) {

                    InetAddress inetAddress = enumIpAddr.nextElement();
                    if(!inetAddress.isLoopbackAddress()){
                      if (inetAddress instanceof Inet4Address) {
                        resultIpv4 = inetAddress.getHostAddress().toString();
                        } else if (inetAddress instanceof Inet6Address) {
                          resultIpv6 = inetAddress.getHostAddress().toString();
                        }
                    }
                }
            }
            return ((resultIpv4.length() > 0) ? resultIpv4 : resultIpv6);
          }
        }

我在一个按钮点击监听器中启动这两个线程:

ChatClientThread chatClient=new ChatClientThread();
                        chatClient.start();
ServerThread serv =new ServerThread();
        serv.start();

如果在使用相同端口的相同活动中使用服务器/客户端无法正常工作,是否有任何其他方法可以监听套接字,例如是否有内置监听器或类似的东西。 任何帮助表示赞赏

【问题讨论】:

    标签: java android multithreading sockets tcp


    【解决方案1】:

    您通过 socket.getOutputStream() 写入套接字,并且必须从 socket.getInputStream() 的 InputStream 中读取; 您可以调整您的代码。 您的服务器使用来自套接字的 InputStream 读取数据,因此您必须在客户端代码中也这样做,因为您还希望接收数据而不仅仅是发送。

    检查一下刚才读的很简单。

    https://systembash.com/a-simple-java-tcp-server-and-tcp-client/

    查看从套接字读取的代码,开头为:

    BufferedReader inFromClient =
                   new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
    

    以及写入套接字的代码:

       DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
    

    或搜索谷歌:java客户端服务器。

    想法是你将数据发送到套接字输出流,你可以从同一个套接字输入流中读取它。

    您在这里看到示例,它从套接字输入读取数据并通过套接字输出将数据发送到服务器

    String sentence;
      String modifiedSentence;
      BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
      Socket clientSocket = new Socket("localhost", 6789);
      DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
      sentence = inFromUser.readLine();
      outToServer.writeBytes(sentence + '\n');
      modifiedSentence = inFromServer.readLine();
      System.out.println("FROM SERVER: " + modifiedSentence);
      clientSocket.close();
    

    【讨论】:

    • 你能不能通过一段代码来解释一下,因为我真的不明白你在说什么!
    • k 但是您要发送到服务器的消息在哪里?
    • outToServer.writeBytes(sentence + '\n'); ,将String语句写入服务器。你可以使用它向服务器发送数据或在你的服务器向clinet发送数据。并且modifiedSentence = inFromServer.readLine();从服务器读取一些数据,或者您也可以在您的服务器中使用它,从客户端读取数据。您在服务器和客户端都需要这 2,因为您想在客户端和服务器类中发送和接收数据
    • 它不起作用,顺便说一句,您必须知道,在该设备的用户按确定或忽略通知之前,不会从其他设备发送解雇和接受
    • 你所需要的一切都在那里,你必须玩代码。由你来定制。我认为你必须完整阅读 Java 套接字编程,因为你错过了重要的事情
    猜你喜欢
    • 2012-10-05
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2014-07-25
    • 1970-01-01
    相关资源
    最近更新 更多