C# tcp 服务器端 + 安卓TCP客户端- 简单例子

都是网上找的简答的例子,实现自己想要的功能。留着以后备用。

C#:服务器端,使用的是简单地TcpListener :

 

       static void Main(string[] args)
        {
            TcpListener server = null;
            Console.Write("请输入监听的端口号:");
            string strPort = Console.ReadLine();
            try
            {
                int port = Convert.ToInt32(strPort);
                IPEndPoint listenPort = new IPEndPoint(IPAddress.Any, port);
                server = new TcpListener(listenPort);//初始化TcpListener的新实例
                server.Start();//开始监听客户端的请求
                Byte[] bytes = new Byte[256];//缓存读入的数据
                String data = null;
                while (true)//循环监听
                {
                    Console.Write("服务已启动");
                    TcpClient client = server.AcceptTcpClient();
                    Console.WriteLine("已连接!");
                    data = null;
                    NetworkStream stream = client.GetStream();//获取用于读取和写入的流对象
                    int i;
                    while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                    {
                        //将借宿字节的数据转换成一个UTF8字符串
                        data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
                        Console.WriteLine("接收消息:{0}", data);
                        Console.Write("发送消息:");
                        data = Console.ReadLine();//服务器发送消息
                        byte[] msg = System.Text.Encoding.UTF8.GetBytes(data);
                        stream.Write(msg, 0, msg.Length);
                    }
                    client.Close();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            finally
            {
                server.Stop();
            }
            Console.WriteLine("\n按任意键退出...");
        }

 

Android端:

记得加权限:

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

简单的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:inputType="textPersonName"
         />

    <Button
        android:id="@+id/connectBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="建立连接" />

    <Button
        android:id="@+id/sendBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送消息" />
</LinearLayout>
MainActivity:
public class MainActivity extends AppCompatActivity {
    Button connect ;
    Button send;
    EditText msg;

    String sendData = "";
    boolean RD = false;//用于控制读数据线程是否执行

    OutputStream OutputStream = null;     //定义数据输出流,用于发送数据
    InputStream InputStream = null;          //定义数据输入流,用于接收数据
    Socket Socket = null;//Socket
    String TAG = "TCPtest";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        connect = findViewById(R.id.connectBtn);
        send = findViewById(R.id.sendBtn);
        msg = findViewById(R.id.editText);

        connect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Connect_Thread Connect_thread = new Connect_Thread(); //并创建一个新的线程,用于初始化socket
                Connect_thread.start();
                Log.d(TAG, "连接服务器");
            }
        });
        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendData = msg.getText().toString();
                ThreadSendData t2 = new ThreadSendData();   //启动一个新的线程,用于发送数据
                t2.start();
            }
        });
    }

    class Connect_Thread extends Thread    //用线程创建Socket连接
    {
        public void run()
        {
            try {

                if (Socket == null)                //判断socket的状态,防止重复执行
                {
                    Socket = new Socket("192.168.1.100", 2029);; //如果socket为空则执行新建一个socket
                    InputStream = Socket.getInputStream();//获取socket的输入流和输出流
                    OutputStream = Socket.getOutputStream();
                    ThreadReadData t1 = new ThreadReadData();//新建一个线程读数据
                    t1.start();
                }
            }
            catch (Exception e) //如果有错误则在这里返回
            {
                e.printStackTrace();
            }
        }
    }

    class ThreadReadData extends Thread    //用线程执行读取服务器发来的数据
    {
        public void run()
        {
            String textdata;      //定义一个变量用于储存服务器发来的数据
            while (RD)             //根据RD变量的值判断是否执行读数据
            {
                try
                {
                    final byte[] ReadBuffer = new byte[2048];  //定义一个字节集,存放输入的数据,缓存区大小为2048字节
                    final int ReadBufferLengh;     //用于存放数据量

                    //从输入流获取服务器发来的数据和数据宽度
                    //ReadBuffer为参考变量,在这里会改变为数据
                    //输入流的返回值是服务器发来的数据宽度
                    ReadBufferLengh = InputStream.read(ReadBuffer);
                    if (ReadBufferLengh == -1)  //验证数据宽度,如果为-1则已经断开了连接
                    {
                        RD = false;//重新归位到初始状态
                        Socket.close();
                        Socket = null;
                        Log.d(TAG, "run: 连 接 服 务 器");
                    } else {
                        //如果有数据正常返回则进行处理显示
                        textdata = new String(ReadBuffer,0,ReadBufferLengh,"GB2312");//原始编码数据
                        Log.d(TAG,new String(textdata.getBytes(),"UTF-8"));//转为UTF-8编码后显示在编辑框中
                    }
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

    class ThreadSendData extends Thread      //用线程发送数据
    {
        public void run()
        {
            try
            {
                OutputStream.write(sendData.getBytes());                //用输出流发送数据
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值