Android应用程序使用的Socket来发送和接收消息: [英] Android application using Socket to send and receive messages:

查看:147
本文介绍了Android应用程序使用的Socket来发送和接收消息:的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有我尝试使用使用套接字连接来发送和接收消息的服务器的Andr​​oid应用程序。

我曾经有过发送和接收的问题,所有的方式。我已经能够做一个或另一个,在任何时候两者。

我在想,如果有人可以帮助我用一个简单的运动,我可以使用的BufferedReader 的PrintWriter 编译就这么做。

我AP preciate任何帮助,因为我在放弃的地步。

在此先感谢....下面是什么,我已经尝试了几枪(尽管它们是不相关的这个问题,我希望它表明我问这里以前都试过)。

 私人OnClickListener sendClickListener =新OnClickListener(){
    公共无效的onClick(查看为arg0){

        螺纹cThread =新主题(新ClientThread());
        cThread.start();
}};

公共类ClientThread实现Runnable {
    公共无效的run(){
        尝试 {
            EditText上dstAddress =(EditText上)findViewById(R.id.destinationAddress);
            EditText上dstMessage =(EditText上)findViewById(R.id.messageToTranslate);
            EditText上dstPort =(EditText上)findViewById(R.id.destinationPort);
            。字符串地址= dstAddress.getText()的toString();
            字符串消息= dstMessage.getText()的toString()。
            INT端口=的Integer.parseInt(dstPort.getText()的toString());

            InetAddress类serverAddr = InetAddress.getByName(地址);
            Log.d(课程作业,C:连接...);

            Socket套接字=新的Socket(serverAddr,口);
            连接=真正的;
                而(已连接){
                    尝试 {
                        EditText上dstTranslation =(EditText上)findViewById(R.id.returnedTranslation);
                        dstTranslation.setText(帮我);
                        Log.d(课程作业,C:发送命令。);
                        PrintWriter的了;
                        OUT =的新PrintWriter(新的BufferedWriter(新OutputStreamWriter(socket.getOutputStream())),TRUE);
                        通过out.println(语言);
                        通过out.println(消息);
                        Log.d(ClientActivity,C:发送。);
                        // BufferedReader类的;
                        //在=新的BufferedReader(新的InputStreamReader(socket.getInputStream()));
                        //字符串翻译= in.readLine();


                    }赶上(例外五){
                        Log.e(ClientActivity,S:错误,E);
                    }
                }
                socket.close();
                Log.d(ClientActivity,C:关闭。);
        }赶上(例外五){
            Log.e(ClientActivity,C:错误,E);
            连接= FALSE;
        }

    }
 


 公共类ClientConnection {

字符串的地址,语言,信息;
INT端口号;
插座ClientSocket的= NULL;

公共ClientConnection(LAN字符串,字符串MES,字符串添加,INT PN)抛出IOException异常{
    地址=增加;
    端口号= PN;
    语言=兰;
    消息= MES;
}
公共字符串createAndSend()抛出IOException异常{
    //创建并连接套接字
    插座ClientSocket的= NULL;
    ClientSocket的=新的Socket(地址,端口号);
    PrintWriter的PW =的新PrintWriter(clientSocket.getOutputStream(),TRUE);
    的BufferedReader BR =新的BufferedReader(新的InputStreamReader(clientSocket.getInputStream()));

    //发送第一个消息 - 消息被正确接收
    pw.write(语言+\ N);
    pw.flush();
    //发送断数据

    //发送第二条消息 - 消息被正确接收
    pw.write(信息+\ N);
    pw.flush();
    pw.close();
    //发送断数据

    //注:无论是我无法接收消息正确与否,我不从服务器发送得当。
    串translatedMessage = br.readLine();
    System.out.print(translatedMessage);
    br.close();
    //Log.d("application_name",translatedMessage);试图检查内容开始从服务器返回。
    返回说什么?;
}
 


 进口java.io.BufferedOutputStream;
进口java.io.BufferedReader中;
进口java.io.IOException异常;
进口java.io.InputStreamReader中;
进口的java.io.PrintWriter;
进口java.net.ServerSocket的;
进口的java.net.Socket;

公共类ServerConnection {

    公共静态无效的主要(字串[] args)抛出异常{
        //删除 - 使用whil​​e循环来保持连接打开永久。
        布尔值状态= FALSE;
        而(!状态){
            ServerSocket的ServerSocket的= NULL;
            尝试 {
                ServerSocket的=新的ServerSocket(4444);
            }赶上(IOException异常E){
                通信System.err.println(无法监听端口:4444);
                System.exit(1);
            }
            插座ClientSocket的= NULL;
            尝试 {
                ClientSocket的=的ServerSocket.accept();
            }赶上(IOException异常E){
                通信System.err.println(接受失败。);
                System.exit(1);
            }
            //删除 - 作为工作在这里,连接建立和程序运行在4444等待连接
            的BufferedReader BR =新的BufferedReader(新的InputStreamReader(clientSocket.getInputStream()));
            String语言= br.readLine();
            字符串消息= br.readLine();
            //测试 - 工程
            的System.out.println(语言);
            //测试 - 工程
            的System.out.println(消息);
            //删除 - 作为工作在这里,无论是消息传递和应用。从客户端发送的消息被接收。
            的TranslateMessage TM =新的TranslateMessage();
            字符串translatedMessage = tm.translateMessage(语言,消息);

            //注:这似乎是我要去的地方错了,要么我不发送消息正确与否我不能正确接受它..
            // PrintWriter的作家=的新PrintWriter(新的BufferedOutputStream(clientSocket.getOutputStream()));
            PrintWriter的PW =的新PrintWriter(clientSocket.getOutputStream(),TRUE);
            //发送翻译回
            的System.out.println(translatedMessage);
            pw.write(translatedMessage +\ N);
            pw.write(回归测试的\ n); //测试消息!
            pw.flush();
            //发送断数据
            pw.close();
            br.close();
            clientSocket.close();
            serverSocket.close();
        }
    }
}
 

解决方案

我只是忘了关闭在客户端的socket连接。因此,虽然我怀疑什么,我所做的是一个标准答案,以我自己的问题是作品包括

I have an android application that I am attempting to use to send and receive messages to a server using socket connection.

I have had all manner of problems sending and receiving. I have been able to do one or the other, at no point both.

I was wondering if someone could help me with a simple exercise that I can compile using BufferedReader and PrintWriter to do so.

I appreciate any help as I am at the point of giving up.

Thanks in advance.... Below are a few shots of what I have tried (Though they are irrelevant to this question, I hope it shows that I have tried before asking here).

    private OnClickListener sendClickListener = new OnClickListener(){
    public void onClick(View arg0) {

        Thread cThread = new Thread(new ClientThread());  
        cThread.start();  
}};    

public class ClientThread implements Runnable {  
    public void run() {  
        try {  
            EditText dstAddress = (EditText) findViewById(R.id.destinationAddress);
            EditText dstMessage = (EditText) findViewById(R.id.messageToTranslate);
            EditText dstPort = (EditText) findViewById(R.id.destinationPort);
            String address = dstAddress.getText().toString();   
            String message = dstMessage.getText().toString();
            int port = Integer.parseInt(dstPort.getText().toString());

            InetAddress serverAddr = InetAddress.getByName(address);  
            Log.d(".Coursework", "C: Connecting...");  

            Socket socket = new Socket(serverAddr, port);  
            connected = true;  
                while (connected) {  
                    try {  
                        EditText dstTranslation = (EditText) findViewById(R.id.returnedTranslation);
                        dstTranslation.setText("help me");
                        Log.d(".Coursework", "C: Sending command.");  
                        PrintWriter out;
                        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);  
                        out.println(language);
                        out.println(message);
                        Log.d("ClientActivity", "C: Sent.");  
                        //BufferedReader in;
                        //in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
                        //String translation = in.readLine();


                    } catch (Exception e) {  
                        Log.e("ClientActivity", "S: Error", e);  
                    }  
                }  
                socket.close();  
                Log.d("ClientActivity", "C: Closed.");  
        } catch (Exception e) {  
            Log.e("ClientActivity", "C: Error", e);  
            connected = false;  
        }  

    }


public class ClientConnection {

String address, language, message;
int portNumber;
Socket clientSocket = null;

public ClientConnection(String lan, String mes, String add, int pn) throws IOException{
    address = add;
    portNumber = pn;
    language = lan;
    message = mes;
}
public String createAndSend() throws IOException{
    // Create and connect the socket
    Socket clientSocket = null;
    clientSocket = new Socket(address, portNumber);
    PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true);
    BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));     

    // Send first message - Message is being correctly received
    pw.write(language+"\n"); 
    pw.flush(); 
    // Send off the data  

    // Send the second message - Message is being correctly received
    pw.write(message+"\n"); 
    pw.flush();
    pw.close();
    // Send off the data

    // NOTE: Either I am not receiving the message correctly or I am not sending it from the server properly.
    String translatedMessage = br.readLine();   
    System.out.print(translatedMessage);
    br.close();
    //Log.d("application_name",translatedMessage); Trying to check the contents begin returned from the server.
    return "Say What??";
}


import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerConnection {

    public static void main(String[] args) throws Exception {       
        // Delete - Using while loop to keep connection open permanently.
        boolean status = false;
        while( !status){
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(4444);
            } catch (IOException e) {
                System.err.println("Could not listen on port: 4444.");
                System.exit(1);
            }
            Socket clientSocket = null;
            try {
                clientSocket = serverSocket.accept();
            } catch (IOException e) {
                System.err.println("Accept failed.");
                System.exit(1);
            }
            // Delete - Working as of here, connection is established and program runs awaiting connection on 4444
            BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));     
            String language = br.readLine();
            String message = br.readLine();
            // Test - Works
            System.out.println(language);      
            // Test - Works
            System.out.println(message);
            // Delete - Working as of here, both messages are passed and applied. Messages are received as sent from client.
            TranslateMessage tm = new TranslateMessage();
            String translatedMessage = tm.translateMessage(language, message);

            // NOTE: This seems to be where I am going wrong, either I am not sending the message correctly or I am not receiving it correctly..
            // PrintWriter writer = new PrintWriter(new BufferedOutputStream(clientSocket.getOutputStream()));
            PrintWriter pw = new PrintWriter(clientSocket.getOutputStream(),true);
            // Send translation back 
            System.out.println(translatedMessage);
            pw.write(translatedMessage+"\n"); 
            pw.write("Return test \n"); // Test message!
            pw.flush(); 
            // Send off the data 
            pw.close();
            br.close();
            clientSocket.close();
            serverSocket.close();
        }
    }
}

解决方案

I simply neglected to close the socket connection on the client side. So whilst I doubt what I have done is a model answer to my own question it works of included.

这篇关于Android应用程序使用的Socket来发送和接收消息:的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆