标签:
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();//关闭服务端,可选操作 } } }
安卓代码(安卓版):
后台代码:
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(); } } } } }
前台代码:
<?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>
权限代码:
<?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>
效果:
问题:乱码问题还没有解决掉~
标签:
原文地址:http://www.cnblogs.com/shuqingstudy/p/4964057.html