安卓TCP通信版本2

PC做服务器,安卓做客户端。

安卓获取输入框的内容并发送,然后等待接收服务器的消息

服务器先行开启,接收到客户端的数据,然后回复消息。

实现了对线程类的封装,通过按钮启动线程发送并接收

服务器代码(java版):

import java.io.*;
import java.net.*;

/*
需求:定义端点接收数据并打印在控制台

服务端:
1.创建服务端serversocket对象并指定端口
  当不指定时,使用connect方法指定
2. 获取连接过来的客户端对象
   通过serversocket的accept方法等待,阻塞式,无连接一直等待
3.客户端如果发过来数据,服务端使用对应连接的读取流获取发过来数据
  打印在服务台
4,关闭服务端(可选)
*/

 class tcpServer
{
    public static void main(String[] args) throws IOException{

     //建立服务端socket服务,并监听端口
     ServerSocket ss =new ServerSocket(30000);
// 采用循环不断接受来自客户端的请求
 while (true)
 {
     //通过accept方法获取链接过来的客户端对象(s中有内容,端口,IP属性)
     Socket s = ss.accept();
     /*接收手机数据*/
     //IP:
     String ip =s.getInetAddress().getHostAddress();
     System.out.println(ip+"...连接成功" );
     //内容:获取客户端发送过来的数据,那么要使用客户端对象s
     InputStream in = s.getInputStream();

     byte[] buf =new byte[1024];
     int len=in.read(buf);
     String content = new String(buf,0,len);
     System.out.println("内容:"+content );
    /*回发给手机数据*/
     OutputStream os = s.getOutputStream();
            os.write("欢迎回来学安卓,您收到了泡泡的祝福!\n"
                .getBytes("utf-8"));
     //s.close();//关闭客户端,服务器可以控制客户
     //ss.close();//关闭服务端,可选操作
}
}
}

tcpServer.java

安卓代码(安卓版):

后台代码:

package com.simpleclient;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
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 Activity {

     private EditText mEditText = null;
     private TextView mTextView = null;
     private Button mButton = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button)findViewById(R.id.mButton);
        mEditText = (EditText)findViewById(R.id.mEditText);
        mTextView = (TextView)findViewById(R.id.mTextView);
        mButton.setOnClickListener(new StartSocketListener());
    }
    //启动按钮监听
    class StartSocketListener implements OnClickListener{
          @Override
          public void onClick(View v) {
            new ServerThread().start();
          }
        }

    class ServerThread extends Thread{
        // TCP 协议
        @Override
        public void run()
        {
            Socket socket=null;
            try
            {
                /* 指定Server的IP地址,此地址为局域网地址,如果是使用WIFI上网,则为PC机的WIFI IP地址
                 * 在ipconfig查看到的IP地址如下:
                 * Ethernet adapter 无线网络连接:
                 * Connection-specific DNS Suffix  . : IP Address. . . . . . . . . . . . : 192.168.1.100
                 */
                // 1建立连接到远程服务器的Socket
                 socket = new Socket("192.168.1.108" , 30000);  //①
                Log.d("TCP", "C: Connecting..."); 

                //2向服务端发送数据
                BufferedWriter bufwriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                // 把用户输入的内容发送给server
                String lineWrite = mEditText.getText().toString();
                Log.d("TCP", "C: Sending: ‘" + lineWrite + "‘");
                bufwriter.write(lineWrite);//向服务端发送数据
                bufwriter.newLine();
                bufwriter.flush();
               //3接收服务器信息
               // 将Socket对应的输入流包装成BufferedReader
                BufferedReader br = new BufferedReader(
                    new InputStreamReader(socket.getInputStream()));
                // 进行普通IO操作,得到服务器信息
                String line = br.readLine();
                mTextView.setText("读取到自服务器的数据:" + line);

                // 关闭输入流、socket
                br.close();
                //socket.close();
            }
            catch(UnknownHostException e) {
                Log.e("TCP errror", "192.168.1.108 is unkown server!");
            } catch(Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    socket.close();
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

MainActivity.java

前台代码:

<?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"
    >
<!-- 获取输入框信息并发送出去 -->
    <EditText
        android:id="@+id/mEditText"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:cursorVisible="false"
        android:editable="true" 

        android:ems="10" >
    </EditText>
     <TextView
        android:id="@+id/mTextView"
        android:layout_width="fill_parent"
        android:layout_height="50dp"

        android:ems="10" >

    </TextView>
    <Button
        android:id="@+id/mButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="TCP客户端---发送" />

</LinearLayout>

activity_main.xml

权限代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.simpleclient"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.INTERNET"/>

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

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

</manifest>

use_permisson

效果:

问题:乱码问题还没有解决掉~

时间: 2024-10-15 03:38:38

安卓TCP通信版本2的相关文章

安卓TCP通信

tCPServer.java 服务器的两个socket都没有关闭:s,ss.两个都是一直开启,然后数据才有显示 class tcpServer { public static void main(String[] args) throws IOException{ //建立服务端socket服务,并监听端口 ServerSocket ss =new ServerSocket(30000); // 采用循环不断接受来自客户端的请求 while (true) { //通过accept方法获取链接过来

【c#源码】安卓客户端通过TCP通信与Windows服务器进行文件传输

APK文件  (对应的windows服务器端已经架设好,可以直接下载进行测试) 源码     数据库文件 在前面一篇文章:[源码]c#编写的安卓客户端与Windows服务器程序进行网络通信 中我们探讨了,如何通过xamarin技术,完成安卓客户端与Windows服务器的通信,这篇文章,我们探讨一下使用场景非常多的文件传输. 先谈一下为什么使用xamarin.android技术吧,之前有开发过一个公文系统,c#语言开发,服务器部署在Windows Server 2003上,客户端采用Winform

NetworkComms V3 使用TCP通信传递IList&lt;T&gt;类型的数据

客户端从服务器获取一组IList<T>类型的数据非常常见(通常从数据库中获取) 我们用NeworkComms V3来演示一下(NetworkcommsV2.x版本也同样支持) [ 使用protobuf.net序列化器] 第一步创建相关的工程文件: MessageContract中的 User类为契约类,使用protobuf.net进行序列化 写法如下: using System; using System.Collections.Generic; using System.Text; usin

C# 实现TCP通信

1.TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本相同的系统级TCP/IP应用以及应用协议,也有许多的企业应用和互联网应用.http协议在应用层运行. 02,传输层(Tanspot):传输层包括UDP和TCP,UDP几乎不对报文进行检查,而TCP提供传输保证. 03,网络层(Netwok):网络层协议由一系列协议组成,包括ICMP.IGMP.RIP.OSPF.IP(v4,v6)等. 04,链路层(Link):又称为物

异步tcp通信——APM.Core 解包

TCP通信解包 虽说这是一个老生长谈的问题,不过网上基本很少见完整业务:或多或少都没有写完或者存在bug.接收到的数据包可以简单分成:小包.大包.跨包三种情况,根据这三种情况作相对应的拆包处理,示例如下: 1 /***************************************************************************************************** 2 * 本代码版权归@wenli所有,All Rights Reserved (C)

客户端通过TCP通信分页从服务器获取数据

本文主要探讨,客户端如何通过TCP通信,根据分页信息从服务器获取到相关数据 通常情况下,数据可能很多,比如几千或者几万条,并不适合一次性从服务器获取. 我们只从服务器获取当前页的数据 和数据库中记录总数以便我们可以在客户端计算出页数 ,当用户点击"上一页"或者"下一页"时,再获取相应页的数据 如下图: 双击上图中的某一项,再打开详细页面,如下图: 下面我们从头开始创建一个分页显示的Demo 通信框架采用来自英国开源的networkcomms2.3.1版本 数据库为s

qt 之 TCP 通信代码及解释

服务器: #include "server.h" #include "ui_server.h" Server::Server(QWidget *parent) :     QWidget(parent),     ui(new Ui::Server) {     m_tcpServer = new QTcpServer(this);     //注意,这里的变量是在.h文件中声明的,是一个指针,在头文件中应该包含QTcpServer 这个类,而且在工程文件中应该加入

清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)

目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程,与TCP和UDP相关的有: 1.http://www.cnblogs.com/xiaozhi_5638/p/3167794.html 2.http://www.cnblogs.com/xiaozhi_5638/p/3169641.html 3.http://www.cnblogs.com/xiaoz

基于MicroPython结合ESP8266模块实现TCP通信(AT指令版)

实验目的 学习ESP8266模块(ESP-01)的使用. 进一步学习TPYBoardv10x中UART模块的使用. 结合ESP-01模块完成局域网内的TCP通信实验. 所需元器件 ESP-01 WIFI模块 1个 TPYBoard v102板子 1块 USB转TTL 1个 micro USB数据线 1条 杜邦线 若干 本实验采用TPYBoardv102串口AT指令的方式,去连接控制ESP8266模块(型号ESP-01). 第一步:烧写AT指令的固件下载AT指令相应固件 这里我下载了一个AiClo