安卓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+"...连接成功" );//内容:获取客户端发送过来的数据,那么要使用客户端对象sInputStream 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;@Overrideprotected 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{@Overridepublic void onClick(View v) {new ServerThread().start();} }class ServerThread extends Thread{// TCP 协议
        @Overridepublic 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建立连接到远程服务器的Socketsocket = 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对应的输入流包装成BufferedReaderBufferedReader 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">
<!-- 获取输入框信息并发送出去 --><EditTextandroid:id="@+id/mEditText"android:layout_width="fill_parent"android:layout_height="40dp"android:cursorVisible="false"android:editable="true" android:ems="10" ></EditText><TextViewandroid:id="@+id/mTextView"android:layout_width="fill_parent"android:layout_height="50dp"android:ems="10" ></TextView><Buttonandroid: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-sdkandroid:minSdkVersion="14"android:targetSdkVersion="19" /><uses-permission android:name="android.permission.INTERNET"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid: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

效果:

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

转载于:https://www.cnblogs.com/shuqingstudy/p/4964057.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)

32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度; 但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度! 如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存&…

常用Jquery前端操作

input只能输入正整数 οnkeyup"this.valuethis.value.replace(/\D/g,)"if(!confirm("删除后无法恢复&#xff0c;确认继续&#xff1f;")){return false;}//判断字符串里是否存在指定字符 if(str.indexOf("abc") ! -1){//表示存在}1.双引号替换…

【Linux/Ubuntu学习 10】unbuntu 下 eclipse 中文乱码的解决

wangddwdd-pc:~$ gedit /var/lib/locales/supported.d/local 添加&#xff1a; zh_CN.GBK GBKzh_CN.GB2312 GB2312 终端执行命令&#xff1a; sudo dpkg-reconfigure --force localesGenerating locales... en_AG.UTF-8... done en_AU.UTF-8... done en_BW.UTF-8... done …

Win32ASM学习[6]: PTR、OFFSET、ADDR、THIS

PTR: 指定要操作的数据尺寸 ------------------------------------------------------------------------------------------------------------------------------------------ .386 .model flat, stdcall include windows.inc include kernel32.inc include masm…

简述WebService的使用(一)

环境&#xff1a; vs版本&#xff1a;vs2013 windows版本&#xff1a;win7 IIS版本&#xff1a;IIS7.0 &#xff08;如果觉得对您有用&#xff0c;请点击右下角【推荐】一下&#xff0c;让更多人看到&#xff0c;谢谢&#xff09; 配置环境&#xff1a; 主要针对于IIS 首先&…

【Java基础】用LinkedList实现一个简单栈的功能

栈的基本功能 栈的最基本功能是保障后进先出&#xff0c;然后在此基础上可以对在栈中的对象进行弹入弹出&#xff0c;此外&#xff0c;在弹出时&#xff0c;如果栈为空&#xff0c;则会报错&#xff0c;所以还需要提供获取当前栈大小的方法。 构造存储对象Student /*** Created…

Win32汇编学习[7]: 定义符号常量(=、EQU、TEXTEQU)

关于符号常量 的例子 .386 .model flat,stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data n 1 ; 伪指令只能定义整数或整数表达式…

oracle 删除表中重复记录,并保留一条

1、查找表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;Id&#xff09;来判断 select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1) 2、删除表中多余的重复记录&#xff0c;重复记录是根据单个字段&#xff08;Id&#x…

透过WinDBG的视角看String

摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的. 本文将侧重在通过WinDBG来观察String在进程内的布局, 以此来解释C# String的一些特性. 问题 C# Stri…

Win32ASM学习[8]: 进制转换的库函数

在 masm32.inc 中有这样几个函数的声明: byt2bin_ex PROTO :BYTE, :DWORD wrd2bin_ex PROTO :WORD, :DWORD dw2bin_ex PROTO :DWORD, :DWORD dw2hex_ex PROTO :DWORD, :DWORD bin2byte_ex PROTO :DWORD -------------------------------------------------------------…

SOJ 2800_三角形

真的是O不是0【看了discuss才发现。。。。。一个大写的蠢 【题意】多个黑白三角形组成的倒三角&#xff0c;求白三角形组成的最大倒三角的面积 【分析】由于问的是倒三角个数&#xff0c;所以只需看与行数奇偶性相同的白色倒三角形&#xff0c;设v[i][j]为以第i行第j列的倒三角…

ueditor富文本编辑器 修改框宽度和高度的方法

在使用ueditor的时候&#xff0c;用的textarea <textarea name"content" id"myEditor">这里写这条规则的回复内容</textarea> 给它加style"width:300" 属性的时候&#xff0c;发现不起作用。 正确的方法应该是&#xff1a; <scri…

Win32ASM学习[9]: 标志寄存器

TF(Trap Flag)——位8&#xff0c;跟踪标志。置1 则开启单步执行调试模式&#xff0c;置0 则关闭。在单步执行模式下&#xff0c;处理器在每条指令后产生一个调试异常&#xff0c;这样在每条指令执行后都可以查看执行程序的状态。如果程序用POPF、POPFD 或者ET 指令设置TF 标志…

TCP多进程并发服务端 Linux socket编程入门(2)

这里很简单的使用了fork()函数&#xff0c;在执行了fork()以后的所有代码都会由子进程和父进程同时执行。 他们同时拥有相同的资源&#xff08;两份拷贝&#xff09;&#xff0c;所以在子进程执行的过程中&#xff0c;子进程需要先close掉listenfd&#xff08;监听套接字&#…

ArcEngine 打开shape文件

IWorkspaceFactory wsf new ShapefileWorkspaceFactory(); IWorkspace pWorkspace wsf.Open(filePath, 0) ;//filePath为shapefile所在的文件夹 IFeatureWorkspace pFeatureWorkspace pWorkspace ; IFeatureClass pFeatureClass pFeatureWorkspace.OpenFeatureClass(&quo…

Win32ASM学习[10]:传送指令

汇编指令的一般性要求: 1、两个操作数的尺寸必须一致; 2、操作数不能同为内存. --------------------------------------------------------------------------------------------------------------- ;mov ;该指令不影响 EFlags ;指令格式: (其中的 r、m、i 分别表示: 寄存器、…

SQL Server 中关于 @@error 的一个小误区

SQL Server 中关于 error 的一个小误区 原文:SQL Server 中关于 error 的一个小误区在SQL Server中&#xff0c;我常常会看到有些前辈这样写&#xff1a; if(error<>0)ROLLBACK TRANSACTION T elseCOMMIT TRANSACTION T 一开始&#xff0c;我看见别人这么写&#xff0c;我…

Win32ASM学习[11]:逻辑运算

--------------------------------------------------------------------------------------------------------------------------- 一.逻辑与运算指令 AND 格式: AND OPRD1,OPRD2其中目的操作数OPRD1为任一通用寄存器或存储器操作数.源操作数OPRD2为立即数、任一通用寄存器…

JavaScript消息框

1.警告框 function myTest(){alert("这里的内容会弹出");} 2.确认框 其返回的值是 true 或 false 。 function myTest(){confirm("这里的内容会弹出");} 3.提示框 prompt prompt(参数1&#xff0c;参数2)&#xff1a;其参数1 是显示提示要输入的信息&…

.Net 事务

在分布式应用程序中&#xff0c;不可避免地会经常使用到事务控制。事务有一个开头和一个结尾&#xff0c;它们指定了事务的边界&#xff0c;事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性&#xff0c;事务必须…