Socket通信1——Android手机客户端和电脑服务器通信小例子
TCP Socket 通信 主要实现客户端和服务器的连接以及发送一条消息:
前提:电脑端当做服务器,Android手机作为客户端,在同一个局域网内
流程:
1.电脑端服务器打开,监听端口号:9998
2.当手机连上服务器,发送 "您好,服务器!"的消息,服务器通过DataInputStream接收之后,打印出来
3.服务器接收并打印消息之后,随机发送“您好,客户端!”的消息给手机客户端
手机刚打开客户端的界面:
刚打开客户端
手机点击"连接服务器"之后,服务器收到消息:
手机点击"连接服务器"之后,服务器收到消息
服务器返回给客户端的消息:
服务器返回给客户端的消息
电脑服务器:
复制代码
1 package TestSocket;
2
3 import java.io.DataInputStream;
4 import java.io.DataOutputStream;
5 import java.io.IOException;
6 import java.net.*;
7
8 import javax.net.ssl.SSLContext;
9
10 public class TcpServer {
11
12 /**
13 * 电脑服务器端,监听端口号9998,接收消息之后,再回复消息
14 *
15 * @param args
16 * @throws IOException
17 */
18 public static void main(String[] args) throws IOException {
19 while (true) {
20 ServerSocket ss = new ServerSocket(9998);// 监听9998端口
21 Socket socket = ss.accept();
22 //等待客户端连上,并等待接收数据
23 DataInputStream dis = new DataInputStream(socket.getInputStream());
24 System.out.println(dis.readUTF()); //打印出客户端发来的数据
25 //回复消息给客户端
26 DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
27 dos.writeUTF(“您好,客户端!”);
28 ss.close();//通信完之后要关闭,不然下次会报错
29 dos.close();
30 dis.close();
31 }
32 }
33
34 }
复制代码
Android手机客户端程序
main.xml
复制代码
1 <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
2 xmlns:tools=“http://schemas.android.com/tools”
3 android:layout_width=“fill_parent”
4 android:layout_height=“fill_parent” >
5
6 <TextView
7 android:id="@+id/tv"
8 android:layout_width=“wrap_content”
9 android:layout_height=“wrap_content”
10 android:layout_centerHorizontal=“true”
11 android:layout_centerVertical=“true”
12 android:text="@string/hello_world"
13 />
14
15 <Button
16 android:id="@+id/btnconnect"
17 android:layout_width=“wrap_content”
18 android:layout_height=“wrap_content”
19 android:text=“连接服务器” />
20
21
复制代码
MainActivity.java 文件
复制代码
1 package com.example.socketclient;
2
3 import android.os.Bundle;
4 import android.os.Handler;
5 import android.os.Looper;
6 import android.os.Message;
7 import android.app.Activity;
8 import android.content.DialogInterface;
9 import android.util.Log;
10 import android.view.View;
11 import android.view.View.OnClickListener;
12 import android.view.Menu;
13 import android.widget.Button;
14 import android.widget.TextView;
15 import android.widget.Toast;
16
17 import java.io.DataInputStream;
18 import java.io.DataOutputStream;
19 import java.io.IOException;
20 import java.net.*;
21
22 public class MainActivity extends Activity {
23 TextView tv;// 用来显示服务器返回的消息 :“您好,客户端!”
24 Handler mHandler;
25
26 @Override
27 public void onCreate(Bundle savedInstanceState) {
28 super.onCreate(savedInstanceState);
29 setContentView(R.layout.main);
30 Button btn = (Button) findViewById(R.id.btnconnect);// 连接服务器的按钮
31 btn.setOnClickListener(listener);
32 tv = (TextView) findViewById(R.id.tv);
33 mHandler = new MessageHandler();
34 }
35
36 OnClickListener listener = new OnClickListener() {
37
38 @Override
39 public void onClick(View v) {
40 new ReceiveMessageThread().start();// 开启客户端线程
41 }
42 };
43
44 /**
45 * 异步操作,TextView显示服务器发来的消息
46 *
47 * @author S.Rain
48 *
49 /
50 class MessageHandler extends Handler {
51
52 @Override
53 public void handleMessage(Message msg) {
54 tv.setText(msg.obj.toString());//接收客户端线程发来的Message对象,用来显示
55 }
56
57 }
58
59 /*
60 * 客户端线程。连到服务器:192.168.1.102:9998 发送消息,之后接收服务器消息,并在TextView显示
61 *
62 * @author S.Rain
63 *
64 */
65 class ReceiveMessageThread extends Thread {
66
67 public void run() {
68 try {
69 Socket socket = new Socket(“192.168.1.104”, 9998);
70 DataOutputStream dos = new DataOutputStream(
71 socket.getOutputStream());
72 dos.writeUTF(“您好,服务器!”);
73
74 DataInputStream dis = new DataInputStream(
75 socket.getInputStream());
76 Message msg = mHandler.obtainMessage();
77 msg.obj = dis.readUTF();
78 mHandler.sendMessage(msg);
79 socket.close();
80 dos.close();
81 dis.close();
82 } catch (IOException e) {
83 // TODO Auto-generated catch block
84 e.printStackTrace();
85 }
86
87 }
88 }
89
90 @Override
91 public boolean onCreateOptionsMenu(Menu menu) {// 没用,工程创建时自己生成的
92 getMenuInflater().inflate(R.menu.main, menu);
93 return true;
94 }
95 }