由于工作的性质,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 stub
try {
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 block
e.printStackTrace();
}
}
}
客户端是Android简单的apk,运行在手机上:
public class MainActivity extends Activity {
private TextView showText; //用于显示接收到的数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showText = (TextView) findViewById(R.id.showText);
new Thread() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
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 block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Bundle bundle = msg.getData();
showText.setText(bundle.getString("zmq"));
}
};
@Override
public 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。