关于date详解,date操作的案例,转载:https://www.cnblogs.com/kimbo/p/7102203.html和date常用方法的问题就给大家分享到这里,感谢你花时间阅读本站内容
关于date详解,date操作的案例,转载:https://www.cnblogs.com/kimbo/p/7102203.html和date常用方法的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html、Activity详解一 配置、启动和关闭activity转载 https://www.cnblogs.com/androidWuYou/p/5887726.html、c# networkcomms 3.0 实现模拟登陆总结 转载 https://www.cnblogs.com/zuochanzi/p/7039636.html、centos下部署LAMP环境(Linux+Apache+mysql+php)(转载文章:https://www.cnblogs.com/apro-abra/p/4862285.html)等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- date详解,date操作的案例,转载:https://www.cnblogs.com/kimbo/p/7102203.html(date常用方法)
- ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html
- Activity详解一 配置、启动和关闭activity转载 https://www.cnblogs.com/androidWuYou/p/5887726.html
- c# networkcomms 3.0 实现模拟登陆总结 转载 https://www.cnblogs.com/zuochanzi/p/7039636.html
- centos下部署LAMP环境(Linux+Apache+mysql+php)(转载文章:https://www.cnblogs.com/apro-abra/p/4862285.html)
date详解,date操作的案例,转载:https://www.cnblogs.com/kimbo/p/7102203.html(date常用方法)
总结
以上是小编为你收集整理的date详解,date操作的案例,转载:https://www.cnblogs.com/kimbo/p/7102203.html全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html
ActiveMQ安装配置及使用
ActiveMQ介绍
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。
特性列表:
⒈ 多种语言和协议编写客户端。语言: Java,C,C++,C#,Ruby,Perl,Python,PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
⒊ 对spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
⒋ 通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
⒌ 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通过JDBC和journal提供高速的消息持久化
⒎ 从设计上保证了高性能的集群,客户端-服务器,点对点
⒏ 支持Ajax
⒐ 支持与Axis的整合
⒑ 可以很容易的调用内嵌JMS provider,进行测试
(二)ActiveMQ安装、配置、启动、可视化界面
1、安装
下载地址:http://activemq.apache.org/download.html
2、配置(conf目录下)
1)用户名密码设置
2)开启jmx监控
activemq.xml中进行如下修改
注:这里的配置不是必须,根据需要自行配置
3、启动
直接运行bin目录下:activemq.bat
4、可视化界面
浏览器中:http://localhost:8161/admin/index.jsp
用户名,密码在:jetty-realm.properties中设置
(三)点对点式消息队列(Queue)
消息生产者
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class QueueProducer { public static void main(String[] args) { //连接信息设置 String username = "system"; String password = "manager"; String brokerURL = "failover://tcp://localhost:61616"; //连接工厂 ConnectionFactory connectionFactory = null; //连接 Connection connection = null; //会话 接受或者发送消息的线程 Session session = null; //消息的目的地 Destination destination = null; //消息生产者 MessageProducer messageProducer = null; //实例化连接工厂 connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL); try { //通过连接工厂获取连接 connection = connectionFactory.createConnection(); //启动连接 connection.start(); //创建session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); //创建一个名称为QueueTest的消息队列 destination = session.createQueue("QueueTest"); //创建消息生产者 messageProducer = session.createProducer(destination); //发送消息 TextMessage message = null; for (int i=0; i<10; i++) { //创建要发送的文本信息 message = session.createTextMessage("Queue消息测试" +(i+1)); //通过消息生产者发出消息 messageProducer.send(message); System.out.println("发送成功:" + message.getText()); } session.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ if(null != connection){ try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
消息消费者
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class QueueConsumer { public static void main(String[] args) { //连接信息设置 String username = "system"; String password = "manager"; String brokerURL = "failover://tcp://localhost:61616"; //连接工厂 ConnectionFactory connectionFactory = null; //连接 Connection connection = null; //会话 接受或者发送消息的线程 Session session = null; //消息的目的地 Destination destination = null; //消息消费者 MessageConsumer messageConsumer = null; //实例化连接工厂 connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL); try { //通过连接工厂获取连接 connection = connectionFactory.createConnection(); //启动连接 connection.start(); //创建session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //创建一个连接QueueTest的消息队列 destination = session.createQueue("QueueTest"); //创建消息消费者 messageConsumer = session.createConsumer(destination); while (true) { TextMessage textMessage = (TextMessage) messageConsumer.receive(100000); if(textMessage != null){ System.out.println("成功接收消息:" + textMessage.getText()); }else { break; } } } catch (JMSException e) { e.printStackTrace(); } }
(四)主题发布订阅式(Topic)
主题发布者
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.DeliveryMode; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; public class TopicProducer { public static void main(String[] args) { //连接信息设置 String username = "system"; String password = "manager"; String brokerURL = "failover://tcp://localhost:61616"; //连接工厂 ConnectionFactory connectionFactory = null; //连接 Connection connection = null; //会话 接受或者发送消息的线程 Session session = null; //消息的主题 Topic topic = null; //消息生产者 MessageProducer messageProducer = null; //实例化连接工厂 connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL); try { //通过连接工厂获取连接 connection = connectionFactory.createConnection(); //启动连接 connection.start(); //创建session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); //创建名为TopicTest的主题 topic = session.createTopic("TopicTest"); //创建主题生产者 messageProducer = session.createProducer(topic); messageProducer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);//不将数据持久化 //发送主题 TextMessage message = null; for (int i=0; i<10; i++) { //创建要发送的文本信息 message = session.createTextMessage("Topic主题测试" +(i+1)); //通过主题生产者发出消息 messageProducer.send(message); System.out.println("发送成功:" + message.getText()); } session.commit(); } catch (Exception e) { e.printStackTrace(); }finally{ if(null != connection){ try { connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } } }
主题订阅者
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.MessageListener; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import org.apache.activemq.ActiveMQConnectionFactory; public class TopicConsumer { public static void main(String[] args) { //连接信息设置 String username = "system"; String password = "manager"; String brokerURL = "failover://tcp://localhost:61616"; //连接工厂 ConnectionFactory connectionFactory = null; //连接 Connection connection = null; //会话 接受或者发送消息的线程 Session session = null; //主题的目的地 Topic topic = null; //主题消费者 MessageConsumer messageConsumer = null; //实例化连接工厂 connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL); try { //通过连接工厂获取连接 connection = connectionFactory.createConnection(); //启动连接 connection.start(); //创建session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //创建一个连接TopicTest的主题 topic = session.createTopic("TopicTest"); //创建主题消费者 messageConsumer = session.createConsumer(topic); messageConsumer.setMessageListener(new MyMessageListener()); } catch (JMSException e) { e.printStackTrace(); } } } class MyMessageListener implements MessageListener { @Override public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println("接收订阅主题:" + textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }
注:
1、代码中所需额外jar包在下载的mq文件夹中,例如我使用的:activemq-all-5.9.0.jar
2、对于消息队列,异步生产和消费;对于主题发布订阅要先启动订阅者进行监听,然后在发布方可接收到订阅主题
3、关于Queue与Topic的具体区别,详见http://blog.csdn.net/qq_21033663/article/details/52458305
Activity详解一 配置、启动和关闭activity转载 https://www.cnblogs.com/androidWuYou/p/5887726.html
先看效果图:
Android为我们提供了四种应组件,分别为Activity、Service、Broadcast receivers和Content providers,这些组建也就是我们开发一个Android应用程序的基石。系统可以通过不同组建提供的切入点进入到开发的应用程序中。对用户来说不是所有的组建都是实际的切入点,但是他们之间都是相互依赖的,它们每一个作为存在的实体,扮演着特定的角色,作为独一无二的基石帮助开发者定义Android应用的行为。下面我将整理自己的Activity学习点滴:
一个Acitvity作为一个显示在屏幕上的用户交互界面,比如在电子邮件应用中,一个用来显示收件列表的Activity,一个用来写邮件的Activity,一个阅读邮件内容的Activity,等等。Activity用来提供用户体验,许多不同体验的Activity聚集在一起即可以形成一个Android应用程序的用户体验,每一Activity都是相互独立的。应用除了可以访问自己的Activity,也可以访问其他APP的Acitivity(需要被APP允许)。
1.如何创建一个Activity?
必须创建一个Activity的 子类,在子类中需要实现Activity状态在生命周期中切换时系统回调的函数(onCreate、onStart、onResume、onPause、onStop、onDestroy),当然并非所有的函数都需要重新实现。其中两个比较重要的函数为onCreate和onPause:
onCreate(),此方法必须要重写。系统调用此方法创建activity,实现该方法是你初始化你所创建Activity的重要步骤。其中最重要的就是调用 setContentView() 去定义你的要展现的用户界面的布局。
onPause(),当系统任务用户离开此界面时会调用此方法,此时并非销毁一个Activity。通常在这里就要处理一些持久超越用户会话的变化,比如:数据的保存。
为了保证流畅的用户体验和处理,你可以调用其他的回调函数来使你的Atctivity停止或销毁。在onStop()方法中,一般做一些大资源货对象的释放,如:网络或者数据库连接。可以在onResume时再加载所需要资源。
2创建Activity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
class
MainActivity
extends
Activity {
//必须重写的方法
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//activity的布局
}
}
|
2.一个Activity创建完成后,为了它可以访问系统必须要声明注册它到应用的AndroidManifest.xml文件中:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<activity
android:name=
"com.zy.demo.activity.MainActivity"
android:label=
"@string/app_name"
>
<intent-filter>
<action android:name=
"android.intent.action.MAIN"
/>
<category android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
|
<activity>有很多属性供开发者定义不同特色的Activity,比如lable、icon或者theme、style等。其中android:name是必须的属性,用来定义activity的名字,当应用发布后不能改变。
<activity>还提供各种intent-filter,使用<intent-filter>来声明其它应用组件如何激活(启动)Activity,<intent-filter>有包含<action>和<category>两个元素。如上例中<action android:name="android.intent.action.MAIN" />用来表示此Activity需要响应android.intent.action.MAIN(表明为应用程序的主要入口),<category android:name="android.intent.category.LAUNCHER" />表示Activity为LAUNCHER类别,即应用程序会列在Launcher中,允许用户直接启动。以上也是一个应用的主activity所必须的声明方法:一个MAIN action,和一个LAUNCHER category。如果要Activity响应其他应用的隐式的intent,则需要为Activity声明对应action,还可以添加categor和data。
3.Activity的启动
3.1 startActivity
通过调用startActivity(intent)启动Activity,intent用来准确的描述你要启动的Activity,或者你要进行的action,intent也可以用来携带小数据给被启动Acitivity。
当在同一个应用中间需要简单启动另一个Activity,intent明确的定义你要启动Activity类即可:
1
2
3
4
5
6
7
|
//定义一个intent,指名要启动的activity:ToStartActivity
Intent intent =
new
Intent(MainActivity.
this
,ToStartActivity.
class
);
//使用startActivity(),启动activity
startActivity(intent);
|
在你的应用程序需要执行一些自身没有Activity可以执行的行为时,我们可以使用手机上的其他应用程序的Activity来代替执行。比如发送一个mail、查看一张图片、搜索一个单词等等。这个里也就是Intent的重要指出,你可以定义一个intent描述你想要做的行为,等你发送给系统后,系统会启动合适的Acitivty帮你执行,如果有多个应用的Activity都可以处理此行为时,系统会让用户去选择一个。当此Activity执行完毕后,原来的Activity将比
1
2
3
4
5
6
7
|
//跨应用从google界面搜索
Intent intent =
new
Intent(Intent.ACTION_WEB_SEARCH);
intent.putExtra(SearchManager.QUERY,
"zy"
);
startActivity(intent);
|
当跨应用启动Activity时,在定义intent时必须要为他指定具体的acitvity,前提是此activity必须暴露在自己应用程序之外(android:exported="true"):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
Intent intent =
new
Intent();
//指定要启动组建完整的包名,对象名
ComponentName cn =
new
ComponentName(
"com.android.settings"
,
"com.android.settings.RunningServices"
);
intent.setComponent(cn);
// 使用context.startActivity()时需要新启一个任务
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
|
3.2 startActivityForResult
通过调用 startActivityForResult(intent),来接收到启动的Acitivity反馈的结果。为了接收接下来启动的Activity的结果,需要重写onActivityResult()这个回调函数。当调用的activity完成后,它将返回一个含有结果的intent给onActivityResult()处理。比如,在应用程序的Activity中,需要用户选择联系人中的一个,Activity需要得到联系人的部分信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
Intent intent =
new
Intent(Intent.ACTION_PICK,
Contacts.People.CONTENT_URI);
//启动一个带有选择联系人返回结果的activity
startActivityForResult(intent, PICK_CONTACT_REQUEST);
这里的PICK_CONTACT_REQUEST为自定义的
int
型请求反馈结果代码。
//重新onActivityResult()用来处理接收到的返回结果
@Override
protected
void
onActivityResult(
int
requestCode,
int
resultCode, Intent data) {
// 如果请求requestCode成功,且请求返回的结果resultCode是我们要的PICK_CONTACT_REQUEST
if
(resultCode == Activity.RESULT_OK
&& requestCode == PICK_CONTACT_REQUEST) {
// 处理Intent返回的数据,在联系人数据库中查找联系人的名字
Cursor cursor = getContentResolver().query(data.getData(),
new
String[] { Contacts.People.NAME },
null
,
null
,
null
);
if
(cursor.moveToFirst()) {
// 如果cursor不为空,就查找出联系人的名字
int
columnIndex = cursor.getColumnIndex(Contacts.People.NAME);
String name = cursor.getString(columnIndex);
//添加其他功能
}
}
}
|
这里在要说明是onActivityResult()使用来处理返回结果的,首先要检查的是请求是否成功,然后是否有返回结果,结果是否是startActivityForResult()中所要的,如果满足,则处理通过Intent返回的数据。
4.关闭Activity
1 Activity可以调用finish()方法关闭自己,也可以通过调用finishActivity()的方法关闭一个独立的之前启动的Activity。
2 调用finishActivity()的方法关闭一个独立的之前启动的Activity
//此方法用在关闭使用startActivityForResult(requestCode)启用的Activity
this.finishActivity(requestCode);
关于何时关闭一个Activity,一般由系统直接为我们管理。但是当你确认用户不用返回到此Activity时,我们调用以上方法关闭对应的Activity。
5 Demo代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
package
mm.shandong.com.testusea;
import
android.content.Intent;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.view.View;
public
class
TestUseAActivity
extends
AppCompatActivity {
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_use_a);
}
//启动第一个activity
public
void
startFirstActivity(View view) {
Intent intent =
new
Intent(
this
, TestUseAActivity2.
class
);
startActivity(intent);
}
//启动第二个activity
public
void
startSecondActivity(View view) {
Intent intent =
new
Intent(
this
, TestUseAActivity3.
class
);
startActivity(intent);
}
//启动第三个activity,这个activity 4秒钟后被关闭
public
void
startThirdActivity(View view) {
Intent intent =
new
Intent(
this
, TestUseAActivity4.
class
);
startActivityForResult(intent,
1
);
new
Thread() {
@Override
public
void
run() {
try
{
Thread.sleep(
4000
);
finishActivity(
1
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
}
|
c# networkcomms 3.0 实现模拟登陆总结 转载 https://www.cnblogs.com/zuochanzi/p/7039636.html
最近项目需要做一个客户查询状态系统,当前上位机缺少服务功能,于是找到了 networkcomms 开源框架,作为项目使用.
最新版 networkcomms 下载地址:https://github.com/MarcFletcher/NetworkComms.Net
下载直接 vs 打开
新建服务器端
using MessageContract;
using NetworkCommsDotNet;
using NetworkCommsDotNet.Connections;
using NetworkCommsDotNet.Connections.TCP;
using NetworkCommsDotNet.DPSBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows.Forms;
namespace AppServer
{
public partial class MaiForm : Form
{
public MaiForm()
{
InitializeComponent();
}
SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);
private void button1_Click(object sender, EventArgs e)
{
//服务器开始监听客户端的请求
Connection.StartListening(ConnectionType.TCP, new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text)));
//服务器开始监听客户端的请求
//IPEndPoint thePoint = new IPEndPoint(IPAddress.Parse(txtIP.Text), int.Parse(txtPort.Text));
//TCPConnection.StartListening(thePoint, false);
button1.Text = "监听中";
button1.Enabled = false;
//button1.Text = "监听中";
//button1.Enabled = false;
//此方法中包含服务器具体的处理方法。
StartListening();
}
private void StartListening()
{
//开启日志记录
//配置日志记录器
//ILogger logger = new LiteLogger(LiteLogger.LogMode.ConsoleAndLogFile, "ServerLogFile_" + NetworkComms.NetworkIdentifier + ".txt");
//NetworkComms.EnableLogging(logger);
//禁用日志记录 服务器端正式使用时,赢禁用日志记录
NetworkComms.DisableLogging();
//服务器端处理收到的消息
//为简单起见,此示例中我们只处理字符类型的信息,也返回字符类型的信息。
//处理的信息可以使自定义类,具体见下一个Demo
NetworkComms.AppendGlobalIncomingPacketHandler<LoginContract>("ReqLogin", IncomingLoginRequest);
}
//处理某个具体的请求
private void IncomingLoginRequest(PacketHeader header, Connection connection, LoginContract loginContract)
{
try
{
string resMsg = "";
//为了简单,这里不调用数据库,而是模拟一下登录
if (loginContract.UserID == "1000" && loginContract.PassWord == "123")
resMsg = "登录成功";
else
resMsg = "用户名密码错误";
//把返回结果写入到契约类中,后面返回给客户端
//ResMsgContract contract = new ResMsgContract();
//contract.Message = resMsg;
//connection.SendObject<ResMsgContract>("ResLogin", contract);
ResMsgContract contract = new ResMsgContract();
contract.Message = resMsg;
connection.SendObject("ResLogin", contract);
}
catch (Exception ex)
{
// LogTools.LogException(ex, "IncomingMsgHandle");
}
}
}
}
在别的帮助中往往少了这行:导致出现客户端发送时,类型打包出现问题。这行代码是客户端服务器两端都要加上的,是指定传输方式
SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);
就是这个报错了
一下是客户端
using MessageContract;
using NetworkCommsDotNet;
using NetworkCommsDotNet.Connections;
using NetworkCommsDotNet.Connections.TCP;
using NetworkCommsDotNet.DPSBase;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AppClient
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
//连接信息对象
public ConnectionInfo connInfo = null;
//连接对象
Connection newTcpConnection;
SendReceiveOptions aboveOptions = new SendReceiveOptions(DPSManager.GetDataSerializer<ProtobufSerializer>(), null, null);
private void button1_Click(object sender, EventArgs e)
{
//给连接信息对象赋值
connInfo = new ConnectionInfo(txtIP.Text, int.Parse(txtPort.Text));
//如果不成功,会弹出异常信息
newTcpConnection = TCPConnection.GetConnection(connInfo);
button1.Enabled = false;
button1.Text = "连接成功";
}
private void btnlogin_Click(object sender, EventArgs e)
{
//给契约类赋值
LoginContract contract = new LoginContract(txtUserName.Text, txtPassword.Text);
//contract.UserID = txtUserName.Text;
//contract.PassWord = txtPassword.Text;
//向服务器发送登录信息并获取登录结果
ResMsgContract resMsg = newTcpConnection.SendReceiveObject<LoginContract, ResMsgContract>("ReqLogin", "ResLogin", 5000, contract);
//向服务器发送登录信息并获取登录结果
// ResMsgContract resMsg = newTcpConnection.SendReceiveObject<ResMsgContract>("ReqLogin", "ResLogin", 5000, contract);
if (resMsg.Message == "登录成功")
{
MessageBox.Show("登录成功");
}
else
{
MessageBox.Show("用户名密码错误");
}
}
}
}
契约类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MessageContract
{
[ProtoContract]
public class LoginContract
{
[ProtoMember(1)]
public string UserID { get; set; }
[ProtoMember(2)]
public string PassWord { get; set; }
public LoginContract() { }
public LoginContract(string userID, string passWord)
{
this.UserID = userID;
this.PassWord = passWord;
}
}
}
using ProtoBuf;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MessageContract
{
[ProtoContract]
public class ResMsgContract
{
[ProtoMember(1)]
public string Message;
public ResMsgContract() { }
public ResMsgContract(string message)
{
this.Message = message;
}
}
}
注意:
使用这个框架要配合谷歌的 protobuf 要选好版本。本人没重复测试最高版本,因为在调试登录过程中出现别的问题过程中,也顺改了 protobuf 的版本,至今未测试最高版本是否存在兼容问题。本人成功的使用的是 2.0.0.668
protobuf简介protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小
vs nuget 添加方式
输入
版本选择自己指定一下,加大项目的契约类里边。这是自己定义传输对象的方式.
结果:
centos下部署LAMP环境(Linux+Apache+mysql+php)(转载文章:https://www.cnblogs.com/apro-abra/p/4862285.html)
一:安装apache
1.安装yum -y install httpd
2.开启apache服务systemctl start httpd.service
3.设置apache服务开机启动systemctl enable httpd.service
4.验证apache服务是否安装成功
在本机浏览器中输入虚拟机的ip地址,CentOS7查看ip地址的方式为:ip addr
(阿里云不需要用这种方式查看,外网ip已经在你主机列表那里给你写出来了的;)
这里是访问不成功的
(阿里云用外网访问,能成功,不需要做以下步骤)
查了资料,说法是,CentOS7用的是Firewall-cmd,CentOS7之前用的是iptables防火墙;要想让外网能访问到apache主目录,就需要做以下的操作:firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=httpsfirewall-cmd --reload
然后再访问外网ip,如果看到apache默认的页面--有Testing 123...字样,便是成功安装了apache服务了;
二、安装PHP
1.安装yum -y install php
2.重启apache服务systemctl restart httpd
或者systemctl restart httpd.service
然后,你可以写一个php文件在浏览器中运行一下了;
eg:vi /var/www/html/info.php
i<?php phpinfo(); ?>
Esc:wq
然后,在自己电脑浏览器输入 192.168.1.1/info.php
运行,会出现php的一些信息
三、安装MySQL
我这里根据所学的那个教程,也安装了MariaDB
1.安装yum -y install mariadb*
2.开启MySQL服务systemctl start mariadb.service
3.设置开机启动MySQL服务systemctl enable mariadb.service
4.设置root帐户的密码mysql_secure_installation
然后会出现一串东西,可以仔细读一下,如果你懒得读,就在提示出来的时候,按Enter就好了,让你设置密码的时候,你就输入你想要的密码就行,然后继续在让你选择y/n是,Enter就好了;当一切结束的时候,你可以输入mysql -uroot -p
的方式,验证一下;
四、将PHP和MySQL关联起来yum search php
,选择你需要的安装:yum -y install php-mysql
五、安装常用的PHP模块
例如,GD库,curl,mbstring,...
1.安装:yum -y install php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel
2.重启apache服务systemctl restart httpd.service
然后,再次在浏览器中运行info.php,你会看到安装的模块的信息;
至此,LAMP环境就搭建好了。
今天关于date详解,date操作的案例,转载:https://www.cnblogs.com/kimbo/p/7102203.html和date常用方法的介绍到此结束,谢谢您的阅读,有关ActiveMQ安装配置及使用 转发 https://www.cnblogs.com/hushaojun/p/6016709.html、Activity详解一 配置、启动和关闭activity转载 https://www.cnblogs.com/androidWuYou/p/5887726.html、c# networkcomms 3.0 实现模拟登陆总结 转载 https://www.cnblogs.com/zuochanzi/p/7039636.html、centos下部署LAMP环境(Linux+Apache+mysql+php)(转载文章:https://www.cnblogs.com/apro-abra/p/4862285.html)等更多相关知识的信息可以在本站进行查询。
本文标签: