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

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

使用基于TCP协议的Socket
一个客户端要发起一次通信,首先必须知道运行服务器端的主机IP地址。然后由网络基础设施利用目标地址,将客户端发送的信息传递到正确的主机上,在Java中,地址可以由一个字符串来定义,这个字符串可以使数字型的地址(比如19216811),也可以是主机名(examplecom)。
而在android 40 之后系统以后就禁止在主线程中进行网络访问了,原因是:
主线程是负责UI的响应,如果在主线程进行网络访问,超过5秒的话就会引发强制关闭,所以这种耗时的 *** 作不能放在主线程里。放在子线程里,而子线程里是不能对主线程的UI进行改变的,因此就引出了Handler,主线程里定义Handler,子线程里使用。
以下是一个android socket客户端的例子:
---------------------------------Java代码---------------------------------------
import javaioBufferedReader;
import javaioIOException;
import javaioInputStreamReader;
import javaioPrintStream;
import javaioUnsupportedEncodingException;
import javanetInetSocketAddress;
import javanetSocket;
import javanetUnknownHostException;
import androidappActivity;
import androidcontentContext;
import androidosBundle;
import androidosHandler;
import androidosMessage;
import androidviewView;
import androidwidgetButton;
import androidwidgetEditText;
import androidwidgetToast;
public class TCPSocketActivity extends Activity {

public static final String TAG = TCPSocketActivityclassgetSimpleName();
/ 服务器地址 /
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) {
superonCreate(savedInstanceState);
setContentView(Rlayoutactivity_socket_test);
context = this;
initView();
btnConnectsetOnClickListener(new ButtonOnClickListener() {
@Override
public void onClick(View v) {
host_ip = hostIPgetText()toString();
host_port = IntegerparseInt(hostPortgetText()toString());
new Thread(new ConnectThread())start();
}
});
btnSendsetOnClickListener(new ButtonOnClickListener() {
@Override
public void onClick(View v) {
new Thread(new SendThread(editSendgetText()toString()))start();
}
});
}
private void toastText(String message) {
ToastmakeText(context, message, ToastLENGTH_LONG)show();
}
public void handleException(Exception e, String prefix) {
eprintStackTrace();
toastText(prefix + etoString());
}
public void initView() {
btnConnect = (Button) findViewById(RidbtnConnect);
btnSend = (Button) findViewById(RidbtnSend);
editSend = (EditText) findViewById(RidsendMsg);
hostIP = (EditText) findViewById(RidhostIP);
hostPort = (EditText) findViewById(RidhostPort);
}
private void closeSocket() {
try {
outputclose();
socketclose();
} catch (IOException e) {
handleException(e, "close exception: ");
}
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
superhandleMessage(msg);
if (0x123 == msgwhat) {
toastText("连接成功!");
}
}
};
/ 连接socket线程 /
public class ConnectThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = Messageobtain();
try {
if (null == socket || socketisClosed()) {
socket = new Socket();
socketconnect(new InetSocketAddress(host_ip,host_port),5000);
output = new PrintStream(socketgetOutputStream(), true,
"utf-8");
}
msgwhat = 0x123;
handlersendMessage(msg);
} catch (UnsupportedEncodingException e) {
eprintStackTrace();
} catch (IOException e) {
eprintStackTrace();
}
}
}

/发送信息线程/
public class SendThread implements Runnable {
String msg;

public SendThread(String msg) {
super();
thismsg = msg;
}
@Override
public void run() {
// TODO Auto-generated method stub
try {
outputprint(msg);
} catch (Exception e) {
eprintStackTrace();
}
closeSocket();
}

}
public class SocketThread implements Runnable {
public String txt1;
public SocketThread(String txt1) {
super();
thistxt1 = txt1;
}
@Override
public void run() {
// TODO Auto-generated method stub
Message msg = Messageobtain();
try {
/ 连接服务器 并设置连接超时为5秒 /
if (socketisClosed() || null == socket) {
socket = new Socket();
socketconnect(new InetSocketAddress(host_ip,host_port),5000);
}
// 获取输入输出流
PrintStream ou = new PrintStream(socketgetOutputStream(),
true, "UTF-8");
BufferedReader bff = new BufferedReader(new InputStreamReader(
socketgetInputStream()));
// 读取发来服务器信息
String line = null;
buffer = "";
while ((line = bffreadLine()) != null) {
buffer = line + buffer;
}
// 向服务器发送信息
ouprint(txt1);
ouflush();
// 关闭各种输入输出流
bffclose();
ouclose();
socketclose();
msgwhat = 0x123;
handlersendMessage(msg);
} catch (UnknownHostException e) {
} catch (IOException e) {
}
}
}
}
-----------------------------布局文件activity_socket_testxml--------------------------------------
<xml version="10" encoding="utf-8">
<LinearLayout xmlns:android=">如下:
该软件采用P2P方式,各个客户端之间直接发消息进行会话聊天,服务器在其中只扮演协调者的角色(混合型P2P)。
1会话流程设计
当一个新用户通过自己的客户端登陆系统后,从服务器获取当前在线的用户信息列表,列表信息包括了系统中每个用户的地址。用户就可以开始独立工作,自主地向其他用户发送消息,而不经过服务器。每当有新用户加入或在线用户退出时,服务器都会及时发消息通知系统中的所有其他用户,以便它们实时地更新用户信息列表。
按照上述思路,设计系统会话流程如下:
(1)用户通过客户端进入系统,向服务器发出消息,请求登陆。
(2)服务器收到请求后,向客户端返回应答消息,表示同意接受该用户加入,并顺带将自己服务线程所在的监听端口号告诉用户。
(3)客户端按照服务器应答中给出的端口号与服务器建立稳定的连接。
(4)服务器通过该连接将当前在线用户的列表信息传给新加入的客户端。
(5)客户端获得了在线用户列表,就可以独立自主地与在线的其他用户通信了。
(6)当用户退出系统时要及时地通知服务器。
2用户管理
系统中,无论是服务器还是客户端都保存一份在线用户列表,客户端的用户表在一开始登陆时从服务器索取获得。在程序运行的过程中,服务器负责实时地将系统内用户的变动情况及时地通知在线的每个成员用户。
新用户登录时,服务器将用户表传给他,同时向系统内每个成员广播“login”消息,各成员收到后更新自己的用户表。
同样,在有用户退出系统时,服务器也会及时地将这一消息传给各个用户,当然这也就要求每个用户在自己想要退出之前,必须要先告诉服务器。
3协议设计
31客户端与服务器会话
(1)登陆过程。
客户端用匿名UDP向服务器发送消息:
login,username,localIPEndPoint
消息内容包括3个字段,各字段之间用“,”分隔:“login”表示请求登陆;“username”为用户名;“localIPEndPoint”是客户端本地地址。
服务器收到后以匿名UDP返回如下消息:
Accept,port
其中,“Accept”表示服务器接受了请求;“port”是服务所在端口,服务线程在这个端口上监听可能的客户连接,该连接使用同步的TCP。
连上服务器,获取用户列表:
客户端从上一会话的“port”字段的值服务所在端口,于是向端口发起TCP连接,向服务器索取在线的用户列表,服务器接受连接后将用户列别传输给客户端。
用户列表格式如下:
username1,IPEndPoint1;username2,IPEndPoint2;;end
username1,username2为用户名,IPEndPoint1,IPEndPoint2为它们对应的端点。每个用户的信息都有个“用户名+端点”组成,用户信息之间以“;”隔开,整个用户列表以“end”结尾。
31服务器协调管理用户
(1)新用户加入通知。
由于系统中已存在的每个用户都有一份当前用户表,因此当有新成员加入时,服务器无需重复给系统中的每个成员再传送用户表,只要将新加入成员的信息告诉系统内的其他用户,再由他们各自更新自己的用户表就行了。
服务器向系统内用户广播发送如下消息:
端点字段写为“remoteIPEndPoint”,表示是远程某个用户终端登陆了,本地客户线程据此更新用户列表。其实,在这个过程中,服务器只是将受到的“login”消息简单地转发而已。
(2)用户退出。
与新成员加入时一样,服务器将用户退出的消息直接进行广播转发:
logout,username,remoteIPEndPoint
其中,“remoteIPEndPoint”为退出系统的远程用户终端的端点地址。
31用户终端之间聊天
用户聊天时,他们各自的客户端之间是以P2P方式工作的,彼此地位对等,独立,不与服务器发生直接联系。
4系统实现
41服务线程
系统运行后,先有服务器启动服务线程,只需单击“启动”按钮即可。
即时聊天软件可以在两名或多名用户之间传递即时消息的网络软件,大部分的即时聊天软件都可以显示联络人名单,并能显示联络人是否在线。使用者发出的每一句话都回即时显示在双方的萤幕上。

配置与Internet的路由1 启用 SMTP 侦听 服务器文档中的“邮递任务”: 邮件邮递、SMTP邮件邮递 服务器文档中的“SMTP侦听任务”: 启用2 配置 SMTP 服务器配置文档: “在本地 Internet 网络域之外发送消息时所用的 SMTP”: 启用“主机名查询”: 动态映射然后本地映射3 限制 SMTP服务器配置文档的“限制和控制”一节4 连接路径① 定义Internet网络域: “配置”-“消息处理”-“网络域” 网络域类型: 外部 SMTP 网络域 Internet 网络域: 网络域名称: TheInternet ② 定义Internet连接: “配置”-“消息处理”-“连接” 连接类型: SMTP 源服务器: PTHub/World 目标服务器: 目标网络域: TheInternet 复制: 禁用 连接时间: 00:00 - 23:59 时间间隔: 30分钟按照这个设置了,还是不能给外网发邮件,实在是不知道什么原因了。之前也设置过,可以给外网发邮件的(不过收不到),现在是既不能发也不能收了

char buff2[102410];
int receiveLen;
/调用accept函数,等待客户端的连接/
client_fd=accept(sockfd,(struct sockaddr )&client_sockaddr,&sin_size
/调用recv函数接收客户端的请求/
recvbytes=recv(client_fd,buf,BUFFER_SIZE,0)
typedef int (WINAPI ICEPUB_TCPSENDANDRECEIVETEXT)(char sendBuff, int sendBuffLen,char recvBuff,int recvMaxLen,char serverIP,int serverPort);
ICEPUB_TCPSENDANDRECEIVETEXT icePub_tcpSendAndReceiveText = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDlldll");
if(hDLLDrv)
{
icePub_tcpSendAndReceiveText=(ICEPUB_TCPSENDANDRECEIVETEXT )GetProcAddress(hDLLDrv,"icePub_tcpSendAndReceiveText");
}
if(icePub_tcpSendAndReceiveText)
receiveLen=icePub_tcpSendAndReceiveText(buf,recvbytes),buff2,102410,"19216812",8000);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox(buff2);

即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传输协议。前者是以数据流的形式,将传输数据经分割、打包后,通过两台机器之间建立起的虚电路,进行连续的、双向的、严格保证数据正确性的文件传输协议。而后者是以数据报的形式,对拆分后的数据的先后到达顺序不做要求的文件传输协议。
    QQ就是使用UDP协议进行发送和接收消息的。当你的机器安装了OICQ以后,实际上,你既是服务端(Server),又是客户端(Client)。当你登录OICQ时,你的OICQ作为Client连接到腾讯公司的主服务器上,当你“看谁在线时,你的OICQ又一次作为Client从QQ Server上读取在线网友名单。当你和你的OICQ伙伴进行聊天时,如果你和对方的连接比较稳定,你和他的聊天内容都是以UDP的形式,在计算机之间传送。如果你和对方的连接不是很稳定,QQ服务器将为你们的聊天内容进行中转。其他的即时通信软件原理与此大同小异。

一般的步骤:

首先,用户A输入自己的用户名和密码登录即时通讯服务器,服务器通过读取用户数据库来验证用户身份,如果用户名、密码都正确,就登记用户A的IP地址、IM客户端软件的版本号及使用的TCP/UDP端口号,然后返回用户A登录成功的标志,此时用户A在 IM系统中的状态为在线(Online Presence)。

其次,根据用户A存储在IM服务器上的好友列表(Buddy List),服务器将用户A在线的相关信息发送到也同时在线的即时通讯好友的PC机,这些信息包括在线状态、IP地址、 IM客户端使用的TCP端口(Port)号等,即时通讯好友PC机上的即时通讯软件收到此信息后将在PC桌面上d出一个小窗口予以提示。

第三步,即时通讯服务器把用户A存储在服务器上的好友列表及相关信息回送到他的PC机,这些信息包括也在线状态、IP地址、IM客户端使用的TCP端口(Port)号等信息,用户A的PC机上的IM客户端收到后将显示这些好友列表及其在线状态。

接下来,如果用户A想与他的在线好友用户B聊天,他将直接通过服务器发送过来的用户B的IP地址、TCP端口号等信息,直接向用户B的PC机发出聊天信息,用户B的IM客户端软件收到后显示在屏幕上,然后用户B再直接回复到用户A的PC机,这样双方的即时文字消息就不通过 IM服务器中转,而是通过网络进行点对点的直接通讯,这称为对等通讯方式(Peer To Peer)。在商用即时通讯系统中,如果用户A与用户B的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢, IM服务器还提供消息中转服务,即用户A和用户B的即时消息全部先发送到IM服务器,再由服务器转发给对方。早期的IM系统,在IM客户端和IM服务器之间通讯采用采用UDP协议,UDP协议是不可靠的传输协议,而在 IM客户端之间的直接通讯中,采用具备可靠传输能力的TCP协议。随着用户需求和技术环境的发展,目前主流的即时通讯系统倾向于在即时通讯客户端之间、即时通讯客户端和即时通讯服务器之间都采用TCP协议。

4G DTU 在此工作模式下,用户的串口设备,可以通过本设备发送数据到网络上指定的服务器。设备也可以接受来自服务器的数据,并将信息转发至串口设备。用户不需要关注串口数据与网络数据包之间的数据转换过程,只需通过简单的参数设置,即可实现串口设备与网络服务器之间的数据透明通信。本设备支持两路 Socket 连接,分别为 Socket A 和 Socket B,它们是相互独立的。DTU仅 Socket A 支持作为 TCP Client,TCP Server 和 UDP Client,UDP Server。Socket B 只支持 TCP Client 和 UDP Client 功能。本设备支持两路 Socket 分别设置为短链接,当设置为短链接时只有在发送数据的时候才会和服务器建立连接,当无数据传输时开始计时,超过设置的超时时间之后断开和服务器的连接。

4G DTU在此工作模式下,网络透传模式上增加特定的注册包和心跳包,并且对数据进行组包。这种模式更方便用户使用和二次开发,用户可以理解成加入 UDC 协议的网络透传模式。此模式下,我们提供了服务器端二次开发包,用户在将链接库加入到自己的工程后,就可以通过调用我们提供的接口,快速开发自己的服务端,好处在于设备的上线情况和数据传输既能被用户所掌握,也可以由用户来控制,既方便了用户开发,也提高了服务器端的统一性,稳定性和可靠性。

4G DTU在此工作模式下,用户的终端设备,可以通过本设备发送请求数据到指定的 >问题一:信息推送服务是什么意思,接受信息推送服务有什么好处? 就是,你关了应用,手机还是会收到这个应用发送过来的信息。

问题二:手机推送服务是什么 就是运营商,或者手机制造商,或者第三方软件通过服务器,向指定用户发送消息!

问题三:消息推送什么意思? 简单的举个例子:
腾讯QQ和微信的服务端,定时定期的想其用户推送消息。比如腾讯资讯(新闻消息)等。当用户登录客户端,并接入网络。便可接收其推送的消息。
官方的解释:
所谓信息推送,就是web广播,是通过一定的技术标准或协议,在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送
信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息。

问题四:什么叫信息推送服务 信息推送,就是web广播,是通过一定的技术标准或协议,在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术的基础思想是将浏览器主动查询信息改为服务器主动发送信息。通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定场推给用户,帮助用户高效率地发掘有价值的信息。

问题五:消息推送是什么意思 其实就是发送到的意思。
所谓信息推送,就是在互联网上通过定期传送用户需要的信息来减少信息过载的一项新技术。推送技术通过自动传送信息给用户,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地鼎掘有价值的信息。

问题六:什么是网络信息推送 网络信息推送是利用推送(Push)技术根据用户需要,有目的、按时将用户感兴趣的信息主动发送到用户的计算机中。就像是广播电台音, “推送”技术主动将最新的新闻和资料推送给客户,使用者不必上网搜索。
Push技术的主要优点是:
1、对用户要求低,普遍适用于广大公众,不要求有专门的技术;
2、及时性好,信源及时地向用户“推送”不断更新的动态信息。

问题七:推送是什么意思? 用户和用户之间,都是通过一定的纽带结合在一起,就像我们日常生活中的人际交往一样。
所谓的推送功能,就是类似于一条信息发布以后,他会通过好友、分享等途径,让更多的人了解这则消息。比如,我在spacebuilder上面,发布一篇资讯,别人如果感兴趣,就会了解你,了解你的朋友,了解你的圈子,了解你一切可以了解的,同时,也有可能和你结为好友,当你形成一个圈子,一种氛围以后,你发布的内容,就可以借助sns进行推送。
关于推送功能:
在手机通信中,大多智能机都支持推送功能。比如,你手机上有一个即时消息软件,当它在运行时它是和服务器相连的;但是一旦退出后,你就失去了连接。这时推送服务就开始工作了。
程序后台运行时都将会采用这样的一种提醒方式,比如提醒你升级,实时更新消息等。
现在使用智能手机的用户越来越多,很多人以为,不上网就不会有流量,其实不然。智能手机都有推送功能,邮件、天气、部分程序等都会自动更新,这也就是很多用户反映的“偷流量”问题。即便是你在睡觉,手机还是通过后台悄悄在产生流量。

问题八:app推送消息发送方式是什么意思 推送的基本原理其实类似,其实就是通过手机和服务器之间的Socket维持一个TCP长连接,通过这个长连接来实现服务器和客户端之间的通信。所以推送服务的提供商都会同时提供一个库来供第三方引用,这个嵌入的库会帮助第三方应用维护和服务器之间的连接,包括权限校验,断开重连等的工作。这样暴露给第三方开发者的就是一个简单的接口了,开发人员不必关心网络的断开与重连,以及心跳检测等各种复杂的技术问题。当然,除此以外,这些潜入的库往往还会封装一些其他的接口,比如帮助你收到消息后显示在通知栏,展示页面,甚至激活你的应用,传递数据到应用并显示在应用中的某个界面等。这些功能都可以极大的简化app开发的工作,有人问我推送和短信有什么区别,我想这些扩展的功能就是和短信最大的区别吧。至于,之前那个朋友使用>

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/zz/13362001.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-31
下一篇2025-08-31

发表评论

登录后才能评论

评论列表(0条)

    保存