基于TCP的Socket通信

这里的例程跟前面“基于TCP的Socket”类似,前面是客户端给服务器端发信息,这里是服务器端给客户端发信息

TCP通信模式:

TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信两端之间形成网络虚拟链路。

一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。

Java使用Socket对象来代表两端的通信接口,并通过Socket产生I/O流来进行网络通信。

SimpleServer.java  服务器程序,不需要建立Android项目,在PC机的cmd下直接运行即可

public class SimpleSever {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		ServerSocket ss = new ServerSocket(3002);
		while(true){
			Socket s = ss.accept();
			OutputStream os = s.getOutputStream();
			os.write("您好,圣诞节快乐~\n".getBytes("utf-8"));
			os.close();
			s.close();
		}

	}

}

SimpleClient.java 客户端程序,需要建立Android项目,一个文本框显示内容,一个按钮更新内容

public class SimpleClient extends Activity {

	private static final int COMPLETED = 0;
	private EditText show;
	private Button updateButton;

	private Handler handler = new Handler(){
		public void handleMessage(Message msg) {
			if (msg.what == COMPLETED){
				show.setText("来自服务器的问候:\n\n"+msg.obj.toString());
			}
		}

	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		show = (EditText) findViewById(R.id.show);
		updateButton = (Button) findViewById(R.id.button);
		updateButton.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				show.setText("");
				new WorkThread().start();

			}
		});

	}
	private class WorkThread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			try{
				Socket socket = new Socket("222.199.230.116",3002);
				BufferedReader br = new BufferedReader(
						new InputStreamReader(socket.getInputStream()));
				Message msg = new Message();
				msg.what = COMPLETED;
				msg.obj = br.readLine();
				handler.sendMessage(msg);
				br.close();
				socket.close();
			}catch(IOException e){
				e.printStackTrace();
			}

		}

	}

}

在AndroidManifest需配置访问互联网的权限

<uses-permission android:name="android.permission.INTERNET"/>

注意:

1、上面程序的IP地址是服务器端所在主机的IP地址

在Android模拟器测试没有问题,在真机测试需保证网络稳定(用2G/3G通信易出现接收不到信息的情况,需要开WiFi)

2、在开始时,更新文本框内容的程序是写在WorkThread线程里,出现错误

Only the original thread that created a view hierarchy can touch its view

请教度娘,原因在于Android系统中的视图组件并不是线程安全的,如果要更新视图,必须在主线程中更新,不可以在子线程中执行更新的操作。

所以我们应该是在子线程中通知主线程,让主线程做更新操作吧。那么,我们如何通知主线程呢?我们需要使用到Handler对象,就如SimpleClient.java所用的方式

通过上面这种方式,我们就可以解决线程安全的问题,把复杂的任务处理工作交给子线程去完成,然后子线程通过handler对象告知主线程,

由主线程更新文本框内容,这个过程中Android消息机制起着重要的作用。新技能get,解决问题加深了理解~

在前面“Handler的使用”(http://blog.csdn.net/zhanhong39/article/details/41747199)简单提到了Handler的使用

详情见http://blog.csdn.net/liuhe688/article/details/6407225

时间: 2025-01-04 23:50:03

基于TCP的Socket通信的相关文章

Java Socket应用(五)——编程实现基于 TCP 的 Socket 通信

转载请注明:http://blog.csdn.net/uniquewonderq 思路: 服务器段的测试代码如下: : package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socke

第二十天 TCP 及socket通信原理、http协议及web服务、httpd核心配置详解

一.TCP及socket通信原理详解 二.http协议及web服务原理(一) 三.http协议及web服务原理(二) 四.httpd核心配置详解 1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      众所周知:0-1023:管理员才有权限使用,永久地分配给某应用使用(由IANA分配)      注册端口:1024-41951:只有一部分被注册,分配原则上非特别严格.      动态端口或私有端口:41952-65535:由内核分配临时端口,

[java]基于UDP的Socket通信Demo

java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过将每一个Socket客户端的IP存入Set集合,每次接受到数据后都向当前所有的IP转发.但是本机演示的时候所有开的ChatClient客户端都是同一IP,怎么测试呢? 解决办法就是本机测试时候服务端向多个不同的端口转发就好了,这样跑起来的客户端是在不同端口上进行监听的(只是为了实现广播,实际应用下还

recv原理、高阶版黏包解决方案、基于UDP的socket通信

recv原理.高阶版黏包解决方案.基于UDP的socket通信 recv原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the optional flags argument, see the Unix manual. 对于这些设置的参数,可以查看Unix手册. When no data is available, block untilat least one byte is av

TCP及socket通信原理

一.网络互联模型 因特网在刚面世时,只有同一制造商生产的计算机才能彼此通信,制定网络互联模型的目的就是为异种的计算机互连提供一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供共同的参考. 互联参考模型: OSI七层模型(Open System Interconnect):应用层.表示层.会话层.传输层.网络层.数据链路层.物理层 DoD四层模型:是OSI七层模型的浓缩版,包括 进程/应用层.主机到主机层.因特网层.网络接入层 以上两种模型是层次型的,分层模型的优点主要在于: ①将网络

基于android的Socket通信

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

马哥教育第二十天TCP及socket通信原理详解、http协议、httpd

1.tcp.udp是一种传输协议,实现进程地址标记,套接字是一个虚拟设备,用来表明主机上的某个进程      常用端口:0-1023:管理员才有权限使用,永久地分配给某应用使用      注册端口:1024-41951:只有一部分被注册,只要确保主机上没有进程使用该端口.      动态端口或私有端口:41952-65535:由内核分配临时端口,如果临时端口不够可以通过修改内核参数修改临时端口范围       /proc/sys/net/ipv4/ip_local_port_range:定义两个

python中基于tcp协议的通信(数据传输)

tcp协议:流式协议(以数据流的形式通信传输).安全协议(收发信息都需收到确认信息才能完成收发,是一种双向通道的通信) tcp协议在OSI七层协议中属于传输层,它上承用户层的数据收发,下启网络层.数据链路层.物理层.可以说很多安全数据的传输通信都是基于tcp协议进行的. 为了让tcp通信更加方便需要引入一个socket模块(将网络层.数据链路层.物理层封装的模块),我们只要调用模块中的相关接口就能实现传输层下面的繁琐操作. 简单的tcp协议通信模板:(需要一个服务端和一个客户端) 服务端: fr

Java系列讲座一:TCP方式Socket通信案例讲解

开发网络通信软件,如QQ,阿里旺旺等即时通讯软件时,Socket通信是必备的基础知识,今天跟大家谈谈Socket通信中TCP方式通信的软件开发步骤及主要代码讲解: 第一步:开发服务器端程序Server.java,源代码如下: package T16; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; imp