服务器怎么给指定客户端发送消息

服务器怎么给指定客户端发送消息,第1张

这种做法是不是只有在客户端连接到服务器才可以,如果没有连接到服务器,在用户列表就找不到对应的socket,这样就不可以发送了,是不是这样如果我想在客户端没有连接到服务器的情况下发送信息给该客户端(这个时候可能在服务器端保存这个信息吧,但是怎么保存这个信息呢是保存在数据库还是在内存中),然后当该客户端连接上服务器后就把这个信息发给他有没有这种做法,应该怎么做

使用基于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=">安卓推送服务, 实现方案有以下方式:
轮询:客户端定期询问服务器有没有新的消息, 这样服务器不用管客户端的地址是什么, 客户端来问, 直接告诉它就行
这种方案最简单, 对于一些不追求实时性的客户端来说, 很适合, 只需要把时间间隔设定成几个小时取一次, 就能很方便的解决问题
SMS通知:这种方案在移动端是有可能的, 让客户端拦截手机短信, 服务器在有新消息时给用户的手机号发一条特殊的短信, 客户端拦截短信后发现是正常短信就放行, 如果是特殊短信就连接服务器取消息。
消息推送,可以到极光了解一下 ,极光推送(JPush)是独立的第三方云推送平台,致力于为全球移动应用开发者提供移动消息推送服务。2016年6月,国内一站式开发者服务平台极光推送发表公开声明,宣布品牌正式全面升级为大数据综合服务商“极光”。


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

原文地址: https://www.outofmemory.cn/zz/13398945.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-28
下一篇 2023-07-28

发表评论

登录后才能评论

评论列表(0条)

保存