handlersocketsocket实现过程,具体用的方法;怎么实现异步socket

handlersocket  时间:2021-06-21  阅读:()

android做客户端socket如何让点击按钮向服务器发送信息

使用基于TCP协议的Socket 一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。

然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上,在Java中,地址可以由一个字符串来定义,这个字符串可以使数字型的地址(比如192.168.1.1),也可以是主机名()。

而在android 4.0 之后系统以后就禁止在主线程中进行网络访问了,原因是: 主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的操作不能放在主线程里。

放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。

以下是一个android socket客户端的例子: ---------------------------------Java代码--------------------------------------- import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import SocketAddress; import .Socket; import .UnknownHostException; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; public class TCPSocketActivity extends Activity { public static final String TAG = TCPSocketActivity.class.getSimpleName(); /* 服务器地址 */ private String host_ip = null; /* 服务器端口 */ private int host_port = 0; private Button btnConnect; private Button btnSend; private EditText editSend; private EditText hostIP; private EditText hostPort; private Socket socket; private PrintStream output; private String buffer = ""; private Context context; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_socket_test); context = this; initView(); btnConnect.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { host_ip = hostIP.getText().toString(); host_port = Integer.parseInt(hostPort.getText().toString()); new Thread(new ConnectThread()).start(); } }); btnSend.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { new Thread(new SendThread(editSend.getText().toString())).start(); } }); } private void toastText(String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); } public void handleException(Exception e, String prefix) { e.printStackTrace(); toastText(prefix + e.toString()); } public void initView() { btnConnect = (Button) findViewById(R.id.btnConnect); btnSend = (Button) findViewById(R.id.btnSend); editSend = (EditText) findViewById(R.id.sendMsg); hostIP = (EditText) findViewById(R.id.hostIP); hostPort = (EditText) findViewById(R.id.hostPort); } private void closeSocket() { try { output.close(); socket.close(); } catch (IOException e) { handleException(e, "close exception: "); } } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (0x123 == msg.what) { toastText("连接成功!"); } } }; /* 连接socket线程 */ public class ConnectThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub Message msg = Message.obtain(); try { if (null == socket || socket.isClosed()) { socket = new Socket(); socket.connect(new SocketAddress(host_ip,host_port),5000); output = new PrintStream(socket.getOutputStream(), true, "utf-8"); } msg.what = 0x123; handler.sendMessage(msg); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /*发送信息线程*/ public class SendThread implements Runnable { String msg; public SendThread(String msg) { super(); this.msg = msg; } @Override public void run() { // TODO Auto-generated method stub try { output.print(msg); } catch (Exception e) { e.printStackTrace(); } closeSocket(); } } public class SocketThread implements Runnable { public String txt1; public SocketThread(String txt1) { super(); this.txt1 = txt1; } @Override public void run() { // TODO Auto-generated method stub Message msg = Message.obtain(); try { /* 连接服务器 并设置连接超时为5秒 */ if (socket.isClosed() || null == socket) { socket = new Socket(); socket.connect(new SocketAddress(host_ip,host_port),5000); } // 获取输入输出流 PrintStream ou = new PrintStream(socket.getOutputStream(), true, "UTF-8"); BufferedReader bff = new BufferedReader(new InputStreamReader( socket.getInputStream())); // 读取发来服务器信息 String line = null; buffer = ""; while ((line = bff.readLine()) != null) { buffer = line + buffer; } // 向服务器发送信息 ou.print(txt1); ou.flush(); // 关闭各种输入输出流 bff.close(); ou.close(); socket.close(); msg.what = 0x123; handler.sendMessage(msg); } catch (UnknownHostException e) { } catch (IOException e) { } } } } -----------------------------布局文件activity_socket_test.xml-------------------------------------- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/white" android:orientation="vertical" > <EditText android:id="@+id/hostIP" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:hint="服务器ip" android:singleLine="true" android:inputType="text" /> <EditText android:id="@+id/hostPort" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:hint="端口" android:singleLine="true" android:inputType="number" /> <Button android:id="@+id/btnConnect" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical|center_horizontal" android:background="@drawable/style_btn_shape" android:layout_margin="5dip" android:text="@string/connect" android:textColor="@color/white" /> <EditText android:id="@+id/sendMsg" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:hint="需要发送的内容" android:inputType="text" /> <Button android:id="@+id/btnSend" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="5dip" android:background="@drawable/style_btn_shape" android:layout_gravity="center_vertical|center_horizontal" android:text="@string/send" android:textColor="@color/white" /> </LinearLayout> -------------------------样式文件style_btn_shape.xml---------------------------------- <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="/apk/res/android" android:shape="rectangle"> <!-- 填充的颜色 --> <solid android:color="#0465b2" /> <!-- 设置按钮的四个角为弧形 --> <!-- android:radius 弧形的半径 --> <corners android:radius="15dip" /> <!-- padding:Button里面的文字与Button边界的间隔 --> <padding android:left="10dp" ="10dp" android:right="10dp" android:bottom="10dp" /> </shape> ------------------------------END---------------------------------------

什么叫套接字。Socket?

套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程 应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。

多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。

为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口

socket实现过程,具体用的方法;怎么实现异步socket

java编程对于Socket之间的通信过程如下: 服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。

Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入...

台湾CN2云服务器 2核2G 5M 5IP 台湾物理服务器 E5x2 64G 20M 5IP

提速啦(www.tisula.com)是赣州王成璟网络科技有限公司旗下云服务器品牌,目前拥有在籍员工40人左右,社保在籍员工30人+,是正规的国内拥有IDC ICP ISP CDN 云牌照资质商家,2018-2021年连续4年获得CTG机房顶级金牌代理商荣誉 2021年赣州市于都县创业大赛三等奖,2020年于都电子商务示范企业,2021年于都县电子商务融合推广大使。资源优势介绍:Ceranetwo...

Megalayer(159元 )年付CN2优化带宽VPS

Megalayer 商家我们还算是比较熟悉的,商家主要业务方向是CN2优化带宽、国际BGP和全向带宽的独立服务器和站群服务器,且后来也有增加云服务器(VPS主机)业务。这次中秋节促销活动期间,有发布促销活动,这次活动力度认为还是比较大的,有提供香港、美国、菲律宾的年付VPS主机,CN2优化方案线路的低至年付159元。这次活动截止到10月30日,如果我们有需要的话可以选择。第一、特价限量年付VPS主...

咖啡主机22元/月起,美国洛杉矶弹性轻量云主机仅13元/月起,高防云20G防御仅18元/月

咖啡主机怎么样?咖啡主机是一家国人主机销售商,成立于2016年8月,之前云服务器网已经多次分享过他家的云服务器产品了,商家主要销售香港、洛杉矶等地的VPS产品,Cera机房 三网直连去程 回程CUVIP优化 本产品并非原生地区本土IP,线路方面都有CN2直连国内,机器比较稳定。咖啡主机目前推出美国洛杉矶弹性轻量云主机仅13元/月起,高防云20G防御仅18元/月;香港弹性云服务器,香港HKBN CN...

handlersocket为你推荐
sql四舍五入SQL中如何以0.5为单位进行四舍五入计算中国万维网中国互联网之都有哪些?公众号付费阅读怎么利用公众号做知识付费?网络安全密钥网络安全密钥和wifi密码有什么区别sms是什么短信验证是什么?动画分镜头脚本请问什么是动画分镜头脚本,什么是电影分镜头脚本以及什么是广告分镜头脚本?动画分镜头脚本动画分镜头台本的作用?yui3yui 3 月9日 出的专辑的情报东兴证券网站东兴证券开户是假的吗?怎么查微信注册时间怎么查对方的微信号什么时候注册的
cn域名注册 vps租用 rackspace 轻量 北京主机 韩国网名大全 美国十次啦服务器 国外代理服务器软件 河南移动梦网 国外的代理服务器 万网空间 摩尔庄园注册 国外网页代理 cdn服务 存储服务器 上海联通 空间排行榜 linux服务器系统 hosts文件修改 以下 更多