从android到PC的TCP无法使用java

从android到PC的TCP无法使用java,java,android,tcp,Java,Android,Tcp,我正试图通过TCP从我的android手机(使用java应用程序)向我的计算机发送一条简单的消息。我的电脑上有一个正在监听的套接字,但一旦我运行这个应用程序,它就会崩溃。我真的是新的Android开发,所以请容忍我 这是我的Java代码: package com.scorekeep.clienttcp; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.M

我正试图通过
TCP
从我的android手机(使用java应用程序)向我的计算机发送一条简单的消息。我的电脑上有一个正在监听的套接字,但一旦我运行这个应用程序,它就会崩溃。我真的是新的Android开发,所以请容忍我

这是我的Java代码:

package com.scorekeep.clienttcp;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class MainActivity extends Activity {

    EditText textOut;


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

        Socket socket = null;
        try {
            socket = new Socket("10.0.0.10",5000);
            DataOutputStream DOS = new DataOutputStream(socket.getOutputStream());
            DOS.writeUTF("HELLO_WORLD");
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

无法在ui线程中执行套接字连接之类的后台任务。您应该使用AsyncTask

示例

import android.app.*;
import android.os.*;
import android.util.*;
import java.io.*;
import java.net.*;

public class MainActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new connection().execute();
    }
}

class connection extends AsyncTask<String,String,String> {

    @Override
    protected String doInBackground(String... message) {

        try
        {
            InetAddress serverAddr = InetAddress.getByName("ip here");
            Socket socket = new Socket(serverAddr, 5000); //port here
    // send the message to the server
        PrintWriter out = new PrintWriter(new BufferedWriter(
                              new OutputStreamWriter(socket.getOutputStream())), true);
        out.println("hi");
        out.flush(); //optional
        socket.close();
        }
        catch (Exception e)
        {}

        return null;
    }
}
导入android.app.*;
导入android.os.*;
导入android.util.*;
导入java.io.*;
导入java.net。*;
公共类MainActivity扩展了活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
新建连接().execute();
}
}
类连接扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…消息){
尝试
{
inetAddressServerAddr=InetAddress.getByName(“此处的ip”);
Socket Socket=新套接字(serverAddr,5000);//此处的端口
//将消息发送到服务器
PrintWriter out=新的PrintWriter(新的BufferedWriter(
新的OutputStreamWriter(socket.getOutputStream()),true);
out.println(“hi”);
out.flush();//可选
socket.close();
}
捕获(例外e)
{}
返回null;
}
}

注意未经测试。可能包含错误。

根据请求扩展示例:

import android.app.*;
import android.os.*;
import android.util.*;
import java.io.*;
import java.net.*;

public class MainActivity extends Activity 
{
    @Override
     protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new connection().execute();
    }
}

 class connection extends AsyncTask<String,String,String> {
public static PrintWriter out;
BufferedReader in;
public static boolean running = true;
    @Override
    protected String doInBackground(String... message) {

        try
        {
            InetAddress serverAddr = InetAddress.getByName("localhost");
            Socket socket = new Socket(serverAddr, 8008);
            // send the message to the server
            out = new PrintWriter(new BufferedWriter(
                              new OutputStreamWriter(socket.getOutputStream())), true);

            in = new BufferedReader(new InputStreamReader(
                                    socket.getInputStream()));

        while(running) {
            String msgfromserver = in.readLine();
        }
        }
        catch (Exception e)
        {}

        return null;
    }

    public static void sendmsg(String msg){
        if(out!=null){
            out.println(msg);
            out.flush();
        }
    }
}
导入android.app.*;
导入android.os.*;
导入android.util.*;
导入java.io.*;
导入java.net。*;
公共类MainActivity扩展了活动
{
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
新建连接().execute();
}
}
类连接扩展了异步任务{
公共静态打印输出;
缓冲读取器;
公共静态布尔运行=true;
@凌驾
受保护的字符串doInBackground(字符串…消息){
尝试
{
inetAddressServerAddr=InetAddress.getByName(“localhost”);
插座=新插座(serverAddr,8008);
//将消息发送到服务器
out=新的PrintWriter(新的BufferedWriter(
新的OutputStreamWriter(socket.getOutputStream()),true);
in=新的BufferedReader(新的InputStreamReader(
getInputStream());
(跑步时){
字符串msgfromserver=in.readLine();
}
}
捕获(例外e)
{}
返回null;
}
公共静态void sendmsg(字符串msg){
if(out!=null){
out.println(msg);
out.flush();
}
}
}
用法: 调用
connection.sendmsg(“一些文本”)从按钮的OnClick方法


并设置
connection.running=false反压。(或在完成活动之前)

代码中有两处更改
public static void sendmsg
和public
public static PrintWriter out
在AsyncTask类开始时

服务器的代码是什么?到底是什么?服务器还是客户端?客户端/android应用程序崩溃@你能给我举个例子吗@USER6657161等等,我正在为您编写一个示例。谢谢@USER6657161谢谢,这个示例很有效。您可以告诉我如何在每次按下按钮时向服务器发送消息,而不必每次关闭和打开服务器。一个问题是,在添加
连接时。sendmsg(“某些文本”)
编辑器会给出错误,并告诉met将sendmsg设为静态。我该如何解决这个问题?错误:
错误:(22,19)错误:无法从静态上下文引用非静态方法sendmsg(字符串)
错误地将其添加为答案。我无法删除我的答案,因为我在android上。唉!