服务器/ Android客户端仅接收/发送一次

时间:2015-09-20 11:24:00

标签: java sockets

我想从我的Android手机上发送一串文字到我的电脑上运行的Java服务器上它只能运行一次,它会收到第一个字符串,但当我在手机上输入另一个字符串时我按按钮,服务器没有收到任何东西,(这是我的Android应用程序的代码):

button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            messsage = etMsg.getText().toString();
            etMsg.setText("");

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try
                    {
                        client = new Socket(etIP.getText().toString(), port);
                        printwriter = new PrintWriter(client.getOutputStream());
                        printwriter.write(messsage);
                        printwriter.flush();
                        printwriter.close();
                        client.close();
                    }
                    catch (UnknownHostException e)
                    {
                        e.printStackTrace();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    });

以下是Java服务器的代码:

package src;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class VRS {

public static void main(String[] args) throws IOException {
    Socket clientSocket = null;
    ServerSocket serverSocket = null;
    try{
        serverSocket = new ServerSocket(4444);
        System.out.println("server started on port 4444");
        clientSocket = serverSocket.accept();
    }catch(Exception e){} //read & display the message
        //BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputS­tream()));
        Scanner in1 = new Scanner(clientSocket.getInputStream());
        String mes; 
        while(true){
            if (in1.hasNext())
            {
                mes=in1.nextLine();
                System.out.println("Client message :"+mes + System.lineSeparator());
            }
        }
    }
}

任何人都可以帮助我找到问题,因为我是Java的初学者。

1 个答案:

答案 0 :(得分:0)

服务器上的扫描程序正在等待带有终结符的完整令牌,而您没有从客户端发送一个令牌。尝试在客户端添加一行终止字符,例如

printwriter.println(messsage);

除此之外,似乎客户端的每次点击都会创建一个新的Socket对象。但是服务器没有等待新的连接。你可以:

  1. 在客户端重用Socket,而不是为每次点击创建一个新的client。例如使您的clientSocket = serverSocket.accept();变量成为类成员。
  2. 在每封邮件再次调用Socket后,在服务器端创建新的Socket。这个新的服务器端<link rel="stylesheet" type="text/css" href="/episerver/Shell/8.5.1.0/ClientResources/epi/themes/legacy/ShellCore.css"> <link rel="stylesheet" type="text/css" href="/episerver/Shell/8.5.1.0/ClientResources/epi/themes/legacy/ShellCoreLightTheme.css"> 将对应于客户端上的新Socket。
  3. 第一个选项被认为更有效,特别是当您想要处理的连接和消息数量增加时。