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

由于工作的性质,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.使用手机模拟器,需要连接网络,在同一个局域网内,则可以访问到。

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值