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