Android网络编程之TCP通信----简单客户端与服务端通信

来源:互联网 发布:head设计模式不会java 编辑:程序博客网 时间:2024/06/05 18:52

由于工作的性质,Android网络编程用的很少(基本不用),再加上比较懒,也就一直没怎么看Android中网络编程。最近觉悟稍有提高,打算一步一步理清或者说是熟悉网络编程。                

今天主要是对TCP通信的步骤做了解以及写一个简单的demo:简单客户端与服务端通信。

TCP通信步骤

1.服务端:

1).创建ServerSocket对象

ServerSocket()
ServerSocket(int port)
ServerSocket(int port, int backlog)
ServerSocket(int port, int backlog, InetAddress localAddress)
其中ServerSocket(int port)    最为常用。

2).读取和发送数据
在ServerSocket类中最重要的两个方法就是getInputStream和getOutputStream,分别用来获取用于读取和写入数据的InputStream和OutputStream对象。在这里InputStream读取的是客户端发送过来的消息,OutputStream是向客户端发送的数据。

3).关闭连接
对于服务端来说,需要分别调用Socket.close和ServerSocket.close方法来关闭客户端和服务端Socket。

2.客户端
1).连接服务器
两种方式:一种是通过IP的方式来连接服务器,另一种是通过域名方式来连接服务器。本质都是通过IP连接。
通过Socket类连接服务器最常用的方法就是通过Socket类的构造方法将IP或域名以及端口号作为参数传入Socket类中。
Socket socket = new Socket("172.16.30.158", 30000);

2).发送和接受数据
在Socket类中最重要的两个方法就是getInputStream和getOutputStream,分别用来获取用于读取和写入数据的InputStream和OutputStream对象。在这里InputStream读取的是服务器向客户端发送过来的消息,OutputStream是客户端像服务器端发送的数据。
 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); String line = br.readLine(); System.out.println("来自服务器的数据:"+line); br.close(); socket.close();

3).关闭网络连接
socket.close();

实例:
客户端是直接使用Java程序,运行在电脑上:
public class MainServer {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubtry {ServerSocket serverSocket = new ServerSocket(30001);while(true){System.out.println("zmq Server");Socket socket = serverSocket.accept();System.out.println("zmq Server accept");OutputStream outputStream = socket.getOutputStream();outputStream.write("zhou hao yu shi  sha bi ~".getBytes());outputStream.close();socket.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

客户端是Android简单的apk,运行在手机上:
public class MainActivity extends Activity {private TextView showText;    //用于显示接收到的数据@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);showText = (TextView) findViewById(R.id.showText);new Thread() {@Overridepublic void run() {// TODO Auto-generated method stubtry {System.out.println("zmq accept");Socket socket = new Socket();socket.connect(new InetSocketAddress("172.16.11.152",30001));BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String line = bufferedReader.readLine();System.out.println("zmq line = "+line);Message msg = myHandler.obtainMessage();msg.what = 8;Bundle b = new Bundle();b.putString("zmq", line);msg.setData(b);myHandler.sendMessage(msg);bufferedReader.close();socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}.start();}Handler myHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);Bundle bundle = msg.getData();showText.setText(bundle.getString("zmq"));}};@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}

分别运行中两个程序,在手机的apk中可以看到,显示为:zhou hao yu shi  sha bi ~

在运行的过程中也遇连接不上的问题,主要是ip在捣鬼。
之前自己也总结过关于tomcat中IP的写法,跟这个是一样的,贴出来:
1.若是在模拟器中运行,例如Genymotion,则通过ipconfig命令,得到VirtualBox主机的IP,如图所示:

使用的时候:
private String rootUrl = "http://192.168.56.1:8080/test/";  

2.使用手机模拟器,需要连接网络,在同一个局域网内,则可以访问到。
webView.loadUrl("http://172.16.10.184:8080/test/zhangmq.txt");

原则是:始终在访问电脑的IP。




0 0