Android网络连接3——基于Socket

Andoird中能够使用java中封装的Socket通信机制。

服务端:

public class SimpleServer {
	public static void main(String[] args) throws IOException {
		// 创建一个ServerSocket,用于监听客户端Socket的连接请求
		ServerSocket ss = new ServerSocket(30000);
		// 采用循环不断接受来自客户端的请求
		while (true) {
			// 每当接受到客户端Socket的请求,服务器端也对应产生一个Socket
			Socket s = ss.accept();
			OutputStream os = s.getOutputStream();
			os.write("Hello , this is Server !\n".getBytes("utf-8"));
			// 关闭输出流,关闭Socket
			os.close();
			s.close();
		}
	}
}

  Android客户端的简单实现 :

public class SimpleClient extends Activity {
	EditText show;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (EditText) findViewById(R.id.show);
		try {
			Socket socket = new Socket("192.168.1.120", 30000);
			BufferedReader br = new BufferedReader(new InputStreamReader(
					socket.getInputStream()));
			String line = br.readLine();
			show.setText("来自服务器的数据:" + line);
			br.close();
			socket.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

 ==========================

加入线程后:

服务端:

public class MyServer {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(30000);
		while (true) {
			Socket s = ss.accept();
			// 每当客户端连接后启动一条ServerThread线程为该客户端服务
			new Thread(new ServerThread(s)).start();
		}
	}
}

public class ServerThread implements Runnable {
	// 定义当前线程所处理的Socket
	Socket s = null;
	// 该线程所处理的Socket所对应的输入流
	BufferedReader br = null;
	public ServerThread(Socket s) throws IOException {
		this.s = s;
		// 初始化该Socket对应的输入流
		br = new BufferedReader(new InputStreamReader(s.getInputStream(),
				"utf-8")); // ②
	}
	public void run() {
		try {
			String content = null;
			while ((content = br.readLine()) != null) {
				OutputStream os = s.getOutputStream();
				os.write((content + "\n").getBytes("utf-8"));
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
扫描二维码关注公众号,回复: 535229 查看本文章

客户端代码:

public class MultiThreadClient extends Activity {
	EditText input, show;// 定义界面上的两个文本框
	Button send;// 定义界面上的一个按钮
	OutputStream os;
	Handler handler;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		input = (EditText) findViewById(R.id.input);
		send = (Button) findViewById(R.id.send);
		show = (EditText) findViewById(R.id.show);
		Socket s;
		handler = new Handler() {
			@Override
			public void handleMessage(Message msg) {
				// 如果消息来自于子线程
				if (msg.what == 0x123) {
					// 将读取的内容追加显示在文本框中
					show.append("\n" + msg.obj.toString());
				}
			}
		};
		try {
			s = new Socket("192.168.1.120", 30000);
			// 客户端启动ClientThread线程不断读取来自服务器的数据
			new Thread(new ClientThread(s, handler)).start(); // ①
			os = s.getOutputStream();
		} catch (Exception e) {
			e.printStackTrace();
		}
		send.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				try {
					os.write((input.getText().toString() + "\r\n")
							.getBytes("utf-8"));
					// 清空input文本框
					input.setText("");
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
}

 客户端处理线程

public class ClientThread implements Runnable {
	private Socket s;
	private Handler handler;
	BufferedReader br = null;

	public ClientThread(Socket s, Handler handler) throws IOException {
		this.s = s;
		this.handler = handler;
		br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	}

	public void run() {
		try {
			String content = null;
			// 不断读取Socket输入流中的内容。
			while ((content = br.readLine()) != null) {
				// 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
				Message msg = new Message();
				msg.what = 0x123;
				msg.obj = content;
				handler.sendMessage(msg);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

猜你喜欢

转载自lydia-fly.iteye.com/blog/2146165