C#服务器和Android客户端

C#服务器和Android客户端,c#,android,eclipse,sockets,tcp,C#,Android,Eclipse,Sockets,Tcp,我正在开发两个程序,一个是运行服务器时的Microsoft visual studio 2010软件,另一个是Eclipse ADT(安卓设备开发环境),我假设在其中运行客户端。目标是在C#中的服务器和Android客户端之间建立连接。这应该不是一个问题,我在TCP和UDP上进行了尝试,它落在对象创建上下文上(在落在对象套接字上的TCP和落在数据报对象创建上的UDP套接字中),在我看来问题是:activitythread.performlaunchactivity(activitythread$

我正在开发两个程序,一个是运行服务器时的Microsoft visual studio 2010软件,另一个是Eclipse ADT(安卓设备开发环境),我假设在其中运行客户端。目标是在C#中的服务器和Android客户端之间建立连接。这应该不是一个问题,我在TCP和UDP上进行了尝试,它落在对象创建上下文上(在落在对象套接字上的TCP和落在数据报对象创建上的UDP套接字中),在我看来问题是:activitythread.performlaunchactivity(activitythread$activityclientreco rd intent)第2247行

据我所知,问题不在我的代码片段中,而在Eclipse内置软件的套接字补充中,我尝试重新安装,添加最新的插件。关于你的下一个问题,我做了Android设备和互联网的许可。我不知道该如何解决这个问题,我要解决这个问题一个多月

此外,我将在android客户端中添加我的代码:

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

import java.io.BufferedReader;
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream;
import java.io.OutputStreamWriter; 
import java.io.InputStreamReader;
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import android.util.Log; 

public class MainActivity extends Activity { 
private TextView txt;
private Button b;

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    b = (Button)findViewById(R.id.button1);
    txt = (TextView)findViewById(R.id.textView1);


    b.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
        connectSocket("Hello");

        }
    });
} 

private void connectSocket(String a){ 

    try { 
        InetAddress serverAddr = InetAddress.getByName("10.0.0.8"); 
        Log.d("TCP", "C: Connecting..."); 
        **Socket socket = new Socket(serverAddr, 4444);** 

        String message = "1";

        PrintWriter out = null;
        BufferedReader in = null;

        try { 
            Log.d("TCP", "C: Sending: '" + message + "'"); 
            out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); 
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));                

            out.println(message);
            while ((in.readLine()) != null) {
                txt.append(in.readLine());
            }

            Log.d("TCP", "C: Sent."); 
            Log.d("TCP", "C: Done.");               

        } catch(Exception e) { 
            Log.e("TCP", "S: Error", e); 
        } finally { 
            socket.close(); 
        } 

    } catch (UnknownHostException e) { 
        // TODO Auto-generated catch block 
        Log.e("TCP", "C: UnknownHostException", e); 
        e.printStackTrace(); 
    } catch (IOException e) { 
        // TODO Auto-generated catch block 
        Log.e("TCP", "C: IOException", e); 
        e.printStackTrace(); 
    }       
} 
} 
我的服务器是C#:

使用系统;
使用系统文本;
使用System.Collections.Generic;
使用System.Linq;
Net系统;
使用System.Net.Sockets;
公共类TestTCP
{
公共静态void Main()
{
尝试
{
IPAddress ipAd=IPAddress.Parse(“127.0.0.1”);
//使用本地m/c IP地址,以及
//在客户端中使用相同的方法
/*初始化侦听器*/
TcpListener myList=新的TcpListener(ipAd,11000);
/*在指定的端口开始侦听*/
myList.Start();
WriteLine(“服务器正在端口11000处运行…”);
Console.WriteLine(“本地端点是:”+
myList.LocalEndpoint);
WriteLine(“等待连接…”);
m:
套接字s=myList.AcceptSocket();
Console.WriteLine(“从“+s.RemoteEndPoint”接受连接);
字节[]b=新字节[100];
int k=s.Receive(b);
char cc='';
字符串测试=null;
Console.WriteLine(“接收…”);
对于(int i=0;i

谢谢。

首先,您不能在UI线程中运行
connecSocket
方法。你必须这样做:

b.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        Thread stackOverflow = new Thread(new Runnable() {

           @Override
           public void run() {
               connectSocket("Hello");

           }});

        stackOverflow.start();
    }
});
否则会出现以下异常:

android.os.NetworkOnMainThreadException
其次,您必须连接到服务器正在侦听的同一端口和接口:

IPAddress ipAd = IPAddress.Parse("127.0.0.1");
Socket socket = new Socket(serverAddr, 11000);
应与您在Android应用程序中使用的地址相同:

IPAddress ipAd = IPAddress.Parse("10.0.0.8");
您的Android应用程序必须连接到服务器正在侦听的同一端口:

IPAddress ipAd = IPAddress.Parse("127.0.0.1");
Socket socket = new Socket(serverAddr, 11000);
最后,不要忘记Android权限:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


小心使用防火墙之类的东西,它们也可能会断开你的连接。

好的,所以在C#中我没有做任何更改,但在android中我设置了权限,将ipAdrr更改为10.0.0.8,并像你一样执行b.click线程。现在,它不起作用,但它不会把我踢出这个项目。怎么办?没有错误或什么的。非常感谢!!:)@BenTubul C#代码必须更改为
IPAddress ipAd=IPAddress.Parse(“10.0.0.8”)和Android应用程序到
Socket Socket=new Socket(serverAddr,11000)(Android应用程序必须连接到您的C#服务器正在侦听的同一端口和地址)如果您这样做,它应该可以工作(至少对我来说是这样)别忘了,Android应用程序和您的C#服务器之间的某些东西可能会中断连接尝试。检查您是否启用了防火墙或防病毒程序以避免连接。如您所见:这是错误的,该程序不允许我运行它。再次感谢你的帮助,伙计:)@BenTubul你必须找出你的C#server要运行的机器的IP地址。在Windows中,您可以从
cmd.exe
控制台运行此命令:
ipconfig/all
查找已启用的接口及其IP地址读取名为
IP address
的条目,然后将其值用于C#
IPAddress ipAd=IPAddress.Parse(已启用的\u接口\u地址)对于Android:
inetAddressServerAddr=InetAddress.getByName(您的\u启用的\u接口\u地址)当我键入ipconfig时,它允许我在这个ip上运行,但它也不起作用(我的意思是使用我从cmd获得的新ip)。嗯,我希望你能给我力量,这对我来说非常重要,我明天有一件大事要做再次感谢!!