网络通信——与Socket交换数据(三十一)

1. 与Socket交换数据

1.1 知识点

(1)通过Android与Socket完成基本的Echo程序实现;

(2)通过对象序列化进行大数据的传输;

1.2 具体内容

对于网络的开发而言,最常使用的交互模式:WEB Service、WebServer、Socket程序,一些Socket程序的使用是绝对要比JSP/Servlet更加安全的,所有许多android程序手机端会使用Socket进行数据交换。

服务端:(JavaSE项目)

package com.SocketServer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
      public static void main(String[] args) throws Exception{
    	  ServerSocket server = new ServerSocket(2012); 	// 在8888端口上监听
  		Socket client = server.accept(); 		// 接收客户端请求
  		PrintStream out = new PrintStream(client.getOutputStream()); // 取得客户端输出流
  		BufferedReader buf = new BufferedReader(new InputStreamReader(client
  				.getInputStream()));	// 字符缓冲区读取
  		StringBuffer info = new StringBuffer(); 	// 接收客户端的信息
  		info.append("Android : ");		// 回应数据
  		info.append(buf.readLine()); 	// 接收数据
  		out.print(info);		// 发送信息
  		out.close();		// 关闭输出流
  		buf.close(); 		// 关闭输入流
  		client.close();		// 关闭客户端连接
  		server.close();		
	}
}

客户端布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".SocketConnetionActivity" >
    
    <Button
        android:id="@+id/but"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Echo回应程序"
        />

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="等待服务端发送回应信息。。。。" />

</LinearLayout>

客户端:

package com.example.socketconnectionproject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class SocketConnetionActivity extends Activity {
	Button but = null;
	TextView tv = null;
	String response = null;
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				SocketConnetionActivity.this.tv.setText(msg.obj.toString());// 接收子线程消息
				break;
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_socket_connetion);
		this.but = (Button) super.findViewById(R.id.but);
		this.tv = (TextView) super.findViewById(R.id.tv);
		but.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				new Thread(new Runnable() {

					@Override
					public void run() {
						try {
							Socket client = new Socket("172.26.64.60", 2012); // 指定服务器
							PrintStream out = new PrintStream(client
									.getOutputStream()); // 打印流输出
							BufferedReader buf = new BufferedReader(
									new InputStreamReader(client
											.getInputStream()));
							out.println("华万通科技有限公司");// 发送数据
							response = buf.readLine();
							out.close(); // 关闭输出流
							buf.close(); // 关闭输入流
							client.close();// 关闭连接

						} catch (Exception e) {
							e.printStackTrace();
						}
						Message mag = new Message();
						mag.what = 1;
						mag.obj = response;
						SocketConnetionActivity.this.handler.sendMessage(mag);// 向主线程发送信息
					}
				}).start();

			}
		});
	}

}

以下实现利用Socket进行登录验证:

服务端:

package com.SocketServer;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServer {
      public static void main(String[] args) throws Exception{
    	ServerSocket server = new ServerSocket(2012); 	// 在8888端口上监听
  		Socket client = server.accept(); 		// 接收客户端请求
  		PrintStream out = new PrintStream(client.getOutputStream()); // 取得客户端输出流
  		BufferedReader buf = new BufferedReader(new InputStreamReader(client
  				.getInputStream()));	// 字符缓冲区读取
  		String userInfo = buf.readLine();
  		System.out.println(userInfo);
  		String userStr[] = userInfo.split(",");
  		DH10User user = new DH10User(userStr[0],userStr[1]);
  		boolean bool=new LoginDAOImpl(GetConnection.getConn()).login(user);
  		if(bool){
  			
  			out.print("LoginSuccess");		// 发送信息
  		}else{
  			out.print("LoginFail");
  		}
  		out.close();		// 关闭输出流
  		buf.close(); 		// 关闭输入流
  		client.close();		// 关闭客户端连接
  		server.close();		
	}
}

客户端:

package com.example.socketconnectionproject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class SocketConnetionActivity extends Activity {
	EditText username,password=null;
	Button but = null;
	String response = null;
	private Handler handler = new Handler() {

		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				Toast.makeText(SocketConnetionActivity.this, msg.obj.toString(), 0).show();// 接收子线程消息
				break;
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_socket_connetion);
		this.but = (Button) super.findViewById(R.id.login);
		this.username = (EditText) super.findViewById(R.id.username);
		this.password = (EditText) super.findViewById(R.id.password);
		but.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				new Thread(new Runnable() {

					@Override
					public void run() {
						try {
							Socket client = new Socket("172.26.64.60", 2012); // 指定服务器
							PrintStream out = new PrintStream(client
									.getOutputStream()); // 打印流输出
							BufferedReader buf = new BufferedReader(
									new InputStreamReader(client
											.getInputStream()));
							out.println(SocketConnetionActivity.this.username.getText().toString()
									+","+SocketConnetionActivity.this.password.getText().toString());// 发送数据
							response = buf.readLine();
							out.close(); // 关闭输出流
							buf.close(); // 关闭输入流
							client.close();// 关闭连接

						} catch (Exception e) {
							e.printStackTrace();
						}
						Message mag = new Message();
						mag.what = 1;
						mag.obj = response;
						SocketConnetionActivity.this.handler.sendMessage(mag);// 向主线程发送信息
					}
				}).start();

			}
		});
	}

}

1.3 小结

(1)使用Android可以与Socket程序进行通信;

(2)上传文件可以采用序列化的方式简单完成,但是程序不具备通用性;

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毛栗子201105

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值