安卓客户端和服务器端的通信(勘误填坑版)

简介: 版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.
版权声明:本文可能为博主原创文章,若标明出处可随便转载。 https://blog.csdn.net/Jailman/article/details/78328405

一个很基础的socket链接示例,仅用作测试和学习使用

首先是服务器端的代码,一个标准的socket server,绑定本地的54321端口

package online.geekgalaxy.test;


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer implements Runnable
{
    public void run()
    {
        try
        {
            //创建ServerSocket
            ServerSocket serverSocket = new ServerSocket(54321);
            while (true)
            {
                //接受客户端请求
                Socket client = serverSocket.accept();
                System.out.println("accept");
                try
                {
                    //接收客户端消息
                    BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                    String str = in.readLine();
                    System.out.println("read:" + str);
                    //向服务器发送消息
                    PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);
                    out.println("server message");
                    //关闭流
                    out.close();
                    in.close();
                }
                catch (Exception e)
                {
                    System.out.println(e.getMessage());
                    e.printStackTrace();
                }
                finally
                {
                    //关闭
                    client.close();
                    System.out.println("close");
                }
            }
        }
        catch (Exception e)
        {
            System.out.println(e.getMessage());
        }
    }
    //main函数,开启服务器
    public static void main(String a[])
    {
        Thread desktopServerThread = new Thread(new SocketServer());
        desktopServerThread.start();
    }
}

附加一个python的服务端

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import socket

s = socket.socket()
host = socket.gethostname()
port = 54321
s.bind((host, port))

s.listen(5)
while True:
    c, addr = s.accept()
    print 'Connect from ', addr
    c.send('Welcome!')
    c.close()




然后是安卓客户端,很简单,但是连接时不能使用127.0.0.1,所以使用了局域网的10段地址

manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="online.geekgalaxy.socketclient">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
mainactivity文件,使用了一种不是特别推荐的方式在新的API基础上运行socket客户端命令

package online.geekgalaxy.socketclient;

import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity implements Runnable{

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

    private final String        DEBUG_TAG   = "MainActivity";

    private TextView    mTextView = null;
    private EditText    mEditText = null;
    private Button      mButton = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        mButton = (Button)findViewById(R.id.Button01);
        mTextView = (TextView)findViewById(R.id.TextView01);
        mEditText = (EditText)findViewById(R.id.EditText01);

        //登陆
        mButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                run();
            }
        });
    }


        @Override
        public void run() {
            Socket socket = null;
            String message = mEditText.getText().toString() + "/r/n";
            try {
                //创建Socket
//                  socket = new Socket("192.168.1.110",54321);
                socket = new Socket("10.9.3.132", 54321); //IP:10.14.114.127,端口54321
                //向服务器发送消息
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                out.println(message);

                //接收来自服务器的消息
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = br.readLine();

                if (msg != null) {
                    mTextView.setText(msg);
                } else {
                    mTextView.setText("数据错误!");
                }
                //关闭流
                out.close();
                br.close();
                //关闭Socket
                socket.close();
            } catch (Exception e) {
                // TODO: handle exception
                Log.e(DEBUG_TAG, e.toString());
            }
        }
}

mainactivity推荐的写法,使用runnable,是上面代码的替代方案

package online.geekgalaxy.socketclient;

//import android.os.StrictMode;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity{

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

    private final String        DEBUG_TAG   = "MainActivity";

    private TextView    mTextView = null;
    private EditText    mEditText = null;
    private Button      mButton = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
//        StrictMode.setThreadPolicy(policy);

        mButton = (Button)findViewById(R.id.Button01);
        mTextView = (TextView)findViewById(R.id.TextView01);
        mEditText = (EditText)findViewById(R.id.EditText01);

        //登陆
        mButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
//                run();
                new Thread(runnable).start();
            }
        });
    }

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Socket socket;
            String message = mEditText.getText().toString() + "/r/n";
            try {
                //创建Socket
//                  socket = new Socket("192.168.1.110",54321);
                socket = new Socket("10.9.3.132", 54321); //IP:10.14.114.127,端口54321
                //向服务器发送消息
                PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                out.println(message);

                //接收来自服务器的消息
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = br.readLine();

                if (msg != null) {
                    mTextView.setText(msg);
                } else {
                    mTextView.setText("数据错误!");
                }
                //关闭流
                out.close();
                br.close();
                //关闭Socket
                socket.close();
            } catch (Exception e) {
                // TODO: handle exception
                Log.e(DEBUG_TAG, e.toString());
            }
        }
    };
}



然后是layout文件,里边的string被提取了出来,自己补全即可

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView
        android:id="@+id/TextView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/servermessage"
        />
    <EditText
        android:id="@+id/EditText01"
        android:text="@string/sendmessage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    </EditText>
    <Button
        android:id="@+id/Button01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/buttonsend"
        />
</LinearLayout>
build.gradle还是贴出来吧

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "online.geekgalaxy.socketclient"
        minSdkVersion 25
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}









目录
相关文章
|
1月前
|
XML 前端开发 JavaScript
探索 XMLHttpRequest:网页与服务器的异步通信之道(上)
探索 XMLHttpRequest:网页与服务器的异步通信之道(上)
|
2月前
|
消息中间件 运维 网络协议
客户端和服务器之间的通信
客户端和服务器之间的通信
32 0
|
2月前
|
监控 关系型数据库 Linux
|
3月前
|
Linux
CentOS7.9服务器一键脚本部署FRP内网穿透服务端与客户端
CentOS7.9服务器一键脚本部署FRP内网穿透服务端与客户端
210 0
|
12天前
|
网络协议 Python
pythonTCP客户端编程连接服务器
【4月更文挑战第6天】本教程介绍了TCP客户端如何连接服务器,包括指定服务器IP和端口、发送连接请求、处理异常、进行数据传输及关闭连接。在Python中,使用`socket`模块创建Socket对象,然后通过`connect()`方法尝试连接服务器 `(server_ip, server_port)`。成功连接后,利用`send()`和`recv()`进行数据交互,记得在通信完成后调用`close()`关闭连接,确保资源释放和程序稳定性。
|
1月前
|
JSON 安全 网络安全
探索 XMLHttpRequest:网页与服务器的异步通信之道(下)
探索 XMLHttpRequest:网页与服务器的异步通信之道(下)
|
2月前
|
网络协议 Java API
【JavaEE初阶】 TCP服务器与客户端的搭建
【JavaEE初阶】 TCP服务器与客户端的搭建
|
2月前
|
自然语言处理 Java 编译器
【JavaEE初阶】 UDP服务器与客户端的搭建
【JavaEE初阶】 UDP服务器与客户端的搭建
|
2月前
|
安全 Shell 网络安全
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
Git学习---Git快速入门、Git基础使用、Git进阶使用、Git服务器使用(IDEA集成GitHub、Gitee、GitLab)、GitHub Desktop客户端
130 0
|
2月前
|
数据采集 网络协议 搜索推荐
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
52 0