安卓TCP通信版本2

时间:2021-02-19 22:42:59

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

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

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

 

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

服务器代码(java版):

安卓TCP通信版本2安卓TCP通信版本2
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

安卓代码(安卓版):

后台代码:

安卓TCP通信版本2安卓TCP通信版本2
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

前台代码:

安卓TCP通信版本2安卓TCP通信版本2
<?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

权限代码:

安卓TCP通信版本2安卓TCP通信版本2
<?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

效果:

安卓TCP通信版本2

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