'\" t .\" Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. .\" DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. .\" .\" This code is free software; you can redistribute it and/or modify it .\" under the terms of the GNU General Public License version 2 only, as .\" published by the Free Software Foundation. .\" .\" This code is distributed in the hope that it will be useful, but WITHOUT .\" ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or .\" FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License .\" version 2 for more details (a copy is included in the LICENSE file that .\" accompanied this code). .\" .\" You should have received a copy of the GNU General Public License version .\" 2 along with this work; if not, write to the Free Software Foundation, .\" Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. .\" .\" Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA .\" or visit www.oracle.com if you need additional information or have any .\" questions. .\" .\" Arch: generic .\" Software: JDK 8 .\" Date: 21 November 2013 .\" SectDesc: Java IDL and RMI-IIOP Tools .\" Title: tnameserv.1 .\" .if n .pl 99999 .TH tnameserv 1 "21 November 2013" "JDK 8" "Java IDL and RMI-IIOP Tools" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "نام (NAME)" tnameserv-openjdk8 \- سرویس نام‌گذاری موقت جاوا CORBA .SH "خلاصه دستور (SYNOPSIS)" .sp .nf \fBtnameserv\fR \fB\-ORBInitialPort\fR [ \fInameserverport\fR ] .fi .sp .TP -ORBInitialPort \fInameserverport\fR .br درگاه اولیه‌ای که سرویس نام‌گذاری روی آن به پروتکل راه‌اندازی اولیه (bootstrap) گوش می‌دهد؛ این پروتکل برای پیاده‌سازی متدهای \f3resolve_initial_references\fR و \f3list_initial_references\fR در ORB استفاده می‌شود\&. .SH "توضیحات (DESCRIPTION)" بخش Java IDL شامل دیمن واسط درخواست شیء (ORBD) است\&. دیمن ORBD یک پردازه پس‌زمینه است که شامل سرویس راه‌اندازی اولیه (Bootstrap Service)، سرویس نام‌گذاری موقت (Transient Naming Service)، سرویس نام‌گذاری ماندگار (Persistent Naming Service) و مدیر کارساز (Server Manager) می‌باشد\&. تمام آموزش‌های Java IDL از ORBD استفاده می‌کنند، اما می‌توانید در هر یک از مثال‌هایی که از سرویس نام‌گذاری موقت بهره می‌برند، دستور \f3tnameserv\fR را جایگزین دستور \f3orbd\fR نمایید\&. .PP به orbd(1) یا بخش Naming Service در نشانی http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/jidlNaming\&.html مراجعه کنید\&. .PP سرویس نام‌گذاری Common Object Services (COS) در CORBA یک ساختار درختی از ارجاعات شیء مشابه ساختار شاخه‌ای فایل‌ها در سیستم‌فایل ارائه می‌دهد\&. سرویس نام‌گذاری موقت ارائه‌شده در Java IDL یعنی \f3tnameserv\fR، یک پیاده‌سازی ساده از مشخصات COS Naming Service است\&. .PP ارجاعات اشیاء با نام در فضای نام ذخیره می‌شوند و به هر جفت «ارجاع شیء - نام»، یک نگاشت نام (name binding) گفته می‌شود\&. نگاشت‌های نام را می‌توان ذیل بافت‌های نام‌گذاری (naming contexts) سازمان‌دهی کرد\&. بافت‌های نام‌گذاری خود نوعی نگاشت نام هستند و همان نقش سازمان‌دهی زیرشاخه‌ها در سیستم‌فایل را ایفا می‌کنند\&. تمامی نگاشت‌ها ذیل بافت نام‌گذاری اولیه ذخیره می‌شوند\&. بافت نام‌گذاری اولیه تنها نگاشت ماندگار در فضای نام است\&. با توقف و راه‌اندازی مجدد پردازه سرویس نام‌گذاری Java IDL، باقی فضای نام از دست می‌رود\&. .PP برای اینکه یک اپلت یا برنامه کاربردی بتواند از نام‌گذاری COS استفاده کند، ORB آن باید درگاه میزبانی که سرویس نام‌گذاری روی آن در حال اجراست را بداند یا به رشته بافت نام‌گذاری اولیه برای آن سرویس دسترسی داشته باشد\&. سرویس نام‌گذاری می‌تواند سرویس نام‌گذاری Java IDL یا هر سرویس نام‌گذاری منطبق بر استاندارد COS دیگر باشد\&. .SS "راه‌اندازی سرویس نام‌گذاری (START THE NAMING SERVICE)" باید سرویس نام‌گذاری Java IDL را پیش از اجرای برنامه‌ها یا اپلت‌هایی که از آن استفاده می‌کنند، راه‌اندازی کنید\&. نصب بسته Java IDL اسکریپتی (در Oracle Solaris: \f3tnameserv\fR) یا فایلی اجرایی (در Windows: \f3tnameserv\&.exe\fR) ایجاد می‌کند که سرویس نام‌گذاری Java IDL را آغاز می‌نماید\&. سرویس نام‌گذاری را طوری اجرا کنید که در پس‌زمینه اجرا شود\&. .PP چنانچه درگاه دیگری مشخص نکنید، سرویس نام‌گذاری Java IDL روی درگاه ۹۰۰ به پروتکل راه‌اندازی اولیه مورد استفاده برای پیاده‌سازی متدهای \f3resolve_initial_references\fR و \f3list_initial_references\fR در ORB گوش می‌دهد، به صورت زیر: .sp .nf \f3tnameserv \-ORBInitialPort nameserverport&\fP .fi .nf \f3\fP .fi .sp اگر درگاه کارساز نام را مشخص نکنید، درگاه ۹۰۰ به صورت پیش‌فرض استفاده می‌شود\&. هنگام اجرا در Oracle Solaris، برای اجرای پردازه روی درگاه‌های زیر ۱۰۲۴ باید دسترسی کاربر ریشه (root) داشته باشید\&. به همین دلیل توصیه می‌شود از شماره درگاه بزرگتر یا مساوی ۱۰۲۴ استفاده کنید\&. برای مشخص کردن درگاهی متفاوت، مثلاً ۱۰۵۰، و اجرای سرویس نام‌گذاری در پس‌زمینه، در پوسته خط فرمان یونیکس وارد کنید: .sp .nf \f3tnameserv \-ORBInitialPort 1050&\fP .fi .nf \f3\fP .fi .sp در اعلان خط فرمان ویندوز (MS-DOS) وارد کنید: .sp .nf \f3start tnameserv \-ORBInitialPort 1050\fP .fi .nf \f3\fP .fi .sp کارخواه‌های کارساز نام باید از شماره درگاه جدید مطلع شوند\&. این کار با تنظیم ویژگی \f3org\&.omg\&.CORBA\&.ORBInitialPort\fR روی شماره درگاه جدید هنگام ایجاد شیء ORB انجام می‌پذیرد\&. .SS "اجرای کارساز و کارخواه روی میزبان‌های متفاوت (RUN THE SERVER AND CLIENT ON DIFFERENT HOSTS)" در بیشتر آموزش‌های Java IDL و RMI-IIOP، سرویس نام‌گذاری، کارساز و کارخواه همگی روی ماشین توسعه اجرا می‌شوند\&. در استقرار دنیای واقعی، کارخواه و کارساز معمولاً روی ماشین‌های میزبانی متفاوت از ماشین سرویس نام‌گذاری اجرا می‌شوند\&. .PP برای اینکه کارخواه و کارساز بتوانند سرویس نام‌گذاری را بیابند، باید از شماره درگاه و میزبانی که سرویس نام‌گذاری روی آن در حال اجراست مطلع شوند\&. این کار با تنظیم ویژگی‌های \f3org\&.omg\&.CORBA\&.ORBInitialPort\fR و \f3org\&.omg\&.CORBA\&.ORBInitialHost\fR در فایل‌های کارخواه و کارساز به نام ماشین و شماره درگاه محل اجرای سرویس نام‌گذاری انجام می‌شود\&. نمونه‌ای از این موضوع در راهنمای Getting Started Using RMI-IIOP در نشانی http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/rmi-iiop/rmiiiopexample\&.html نشان داده شده است\&. .PP همچنین می‌توانید از گزینه‌های خط فرمان \f3-ORBInitialPort nameserverport#\fR و \f3-ORBInitialHost nameserverhostname\fR استفاده کنید تا به کارخواه و کارساز بگویید سرویس نام‌گذاری را کجا پیدا کنند\&. برای مشاهده یک مثال از انجام این کار با گزینه‌های خط فرمان، به راهنمای Java IDL: The Hello World Example on Two Machines در نشانی http://docs\&.oracle\&.com/javase/8/docs/technotes/guides/idl/tutorial/jidl2machines\&.html مراجعه کنید\&. .PP برای نمونه، فرض کنید سرویس نام‌گذاری موقت \f3tnameserv\fR روی درگاه ۱۰۵۰ در میزبان \f3nameserverhost\fR در حال اجراست\&. کارخواه روی میزبان \f3clienthost\fR و کارساز روی میزبان \f3serverhost\fR اجرا می‌شوند\&. .PP اجرای \f3tnameserv\fR روی میزبان \f3nameserverhost\fR: .sp .nf \f3tnameserv \-ORBInitialPort 1050\fP .fi .nf \f3\fP .fi .sp اجرای کارساز روی \f3serverhost\fR: .sp .nf \f3java Server \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost\fP .fi .nf \f3\fP .fi .sp اجرای کارخواه روی \f3clienthost\fR: .sp .nf \f3java Client \-ORBInitialPort 1050 \-ORBInitialHost nameserverhost\fP .fi .nf \f3\fP .fi .sp .SS "توقف سرویس نام‌گذاری (STOP THE NAMING SERVICE)" برای متوقف کردن سرویس نام‌گذاری Java IDL، از دستور مناسب سیستم‌عامل استفاده کنید؛ مانند \f3kill\fR برای پردازه در یونیکس یا \f3Ctrl+C\fR برای پردازه در ویندوز\&. سرویس نام‌گذاری تا زمانی که صریحاً خاموش نشود به انتظار برای فراخوانی‌ها ادامه می‌دهد\&. توجه داشته باشید که نام‌های ثبت‌شده در سرویس نام‌گذاری Java IDL با پایان یافتن سرویس از بین می‌روند\&. .SH "گزینه‌ها (OPTIONS)" .TP -J\fIoption\fR .br گزینه \f3option\fR را به ماشین مجازی جاوا (JVM) ارسال می‌کند، که در آن \f3option\fR یکی از گزینه‌های شرح داده شده در صفحه مرجع اجراکننده برنامه‌های جاوا است\&. برای نمونه، \f3-J-Xms48m\fR حافظه راه‌اندازی را روی ۴۸ مگابایت تنظیم می‌کند\&. به java(1) مراجعه کنید\&. .SH "مثال‌ها (EXAMPLES)" .SS "افزودن شیءها به فضای نام (ADD OBJECTS TO THE NAME SPACE)" مثال زیر نحوه افزودن نام‌ها به فضای نام را نشان می‌دهد\&. این برنامه یک کارخواه مستقل از سرویس نام‌گذاری موقت است که درخت ساده زیر را ایجاد می‌کند: .sp .nf \f3Initial Naming Context\fP .fi .nf \f3 plans\fP .fi .nf \f3 Personal\fP .fi .nf \f3 calendar\fP .fi .nf \f3 schedule\fP .fi .nf \f3\fP .fi .sp در این مثال، \f3plans\fR یک ارجاع شیء است و \f3Personal\fR یک بافت نام‌گذاری است که شامل دو ارجاع شیء می‌باشد: \f3calendar\fR و \f3schedule\fR\&. .sp .nf \f3import java\&.util\&.Properties;\fP .fi .nf \f3import org\&.omg\&.CORBA\&.*;\fP .fi .nf \f3import org\&.omg\&.CosNaming\&.*;\fP .fi .nf \f3\fP .fi .nf \f3public class NameClient {\fP .fi .nf \f3\fP .fi .nf \f3 public static void main(String args[]) {\fP .fi .nf \f3\fP .fi .nf \f3 try {\fP .fi .nf \f3\fP .fi .sp در بخش راه‌اندازی سرویس نام‌گذاری، \f3nameserver\fR روی درگاه ۱۰۵۰ راه‌اندازی شد\&. کد زیر تضمین می‌کند که برنامه کارخواه از این شماره درگاه مطلع است: .sp .nf \f3 Properties props = new Properties();\fP .fi .nf \f3 props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fP .fi .nf \f3 ORB orb = ORB\&.init(args, props);\fP .fi .nf \f3\fP .fi .sp این کد بافت نام‌گذاری اولیه را به دست آورده و آن را به \f3ctx\fR اختصاص می‌دهد\&. خط دوم \f3ctx\fR را درون یک ارجاع شیء ساختگی \f3objref\fR کپی می‌کند که به نام‌های مختلف متصل شده و به فضای نام اضافه می‌گردد\&. .sp .nf \f3 NamingContext ctx =\fP .fi .nf \f3 NamingContextHelper\&.narrow(\fP .fi .nf \f3 orb\&.resolve_initial_references("NameService"));\fP .fi .nf \f3 NamingContext objref = ctx;\fP .fi .nf \f3\fP .fi .sp این کد یک نام \f3plans\fR از نوع \f3text\fR ایجاد کرده و آن را به ارجاع شیء ساختگی متصل می‌سازد\&. سپس \f3plans\fR با استفاده از متد \f3rebind\fR ذیل بافت نام‌گذاری اولیه اضافه می‌شود\&. متد \f3rebind\fR به شما امکان می‌دهد این برنامه را بارها و بارها بدون مواجهه با استثناهای ناشی از متد \f3bind\fR اجرا کنید\&. .sp .nf \f3 NameComponent nc1 = new NameComponent("plans", "text");\fP .fi .nf \f3 NameComponent[] name1 = {nc1};\fP .fi .nf \f3 ctx\&.rebind(name1, objref);\fP .fi .nf \f3 System\&.out\&.println("plans rebind successful!");\fP .fi .nf \f3\fP .fi .sp این کد یک بافت نام‌گذاری به نام \f3Personal\fR از نوع \f3directory\fR ایجاد می‌کند\&. ارجاع شیء حاصل، \f3ctx2\fR، به نام متصل شده و ذیل بافت نام‌گذاری اولیه اضافه می‌شود\&. .sp .nf \f3 NameComponent nc2 = new NameComponent("Personal", "directory");\fP .fi .nf \f3 NameComponent[] name2 = {nc2};\fP .fi .nf \f3 NamingContext ctx2 = ctx\&.bind_new_context(name2);\fP .fi .nf \f3 System\&.out\&.println("new naming context added\&.\&.");\fP .fi .nf \f3\fP .fi .sp باقی کد، ارجاع شیء ساختگی را با استفاده از نام‌های \f3schedule\fR و \f3calendar\fR ذیل بافت نام‌گذاری \f3Personal\fR (\f3ctx2\fR) نگاشت می‌کند\&. .sp .nf \f3 NameComponent nc3 = new NameComponent("schedule", "text");\fP .fi .nf \f3 NameComponent[] name3 = {nc3};\fP .fi .nf \f3 ctx2\&.rebind(name3, objref);\fP .fi .nf \f3 System\&.out\&.println("schedule rebind successful!");\fP .fi .nf \f3\fP .fi .nf \f3 NameComponent nc4 = new NameComponent("calender", "text");\fP .fi .nf \f3 NameComponent[] name4 = {nc4};\fP .fi .nf \f3 ctx2\&.rebind(name4, objref);\fP .fi .nf \f3 System\&.out\&.println("calender rebind successful!");\fP .fi .nf \f3 } catch (Exception e) {\fP .fi .nf \f3 e\&.printStackTrace(System\&.err);\fP .fi .nf \f3 }\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp .SS "مرور فضای نام (BROWSING THE NAME SPACE)" برنامه نمونه زیر نحوه مرور در فضای نام را نشان می‌دهد: .sp .nf \f3import java\&.util\&.Properties;\fP .fi .nf \f3import org\&.omg\&.CORBA\&.*;\fP .fi .nf \f3import org\&.omg\&.CosNaming\&.*;\fP .fi .nf \f3\fP .fi .nf \f3public class NameClientList {\fP .fi .nf \f3\fP .fi .nf \f3 public static void main(String args[]) {\fP .fi .nf \f3\fP .fi .nf \f3 try {\fP .fi .nf \f3\fP .fi .sp در بخش راه‌اندازی سرویس نام‌گذاری، \f3nameserver\fR روی درگاه ۱۰۵۰ راه‌اندازی شد\&. کد زیر تضمین می‌کند که برنامه کارخواه از این شماره درگاه مطلع است: .sp .nf \f3 Properties props = new Properties();\fP .fi .nf \f3 props\&.put("org\&.omg\&.CORBA\&.ORBInitialPort", "1050");\fP .fi .nf \f3 ORB orb = ORB\&.init(args, props);\fP .fi .nf \f3\fP .fi .sp کد زیر بافت نام‌گذاری اولیه را به دست می‌آورد: .sp .nf \f3 NamingContext nc =\fP .fi .nf \f3 NamingContextHelper\&.narrow(\fP .fi .nf \f3 orb\&.resolve_initial_references("NameService"));\fP .fi .nf \f3\fP .fi .sp متد \f3list\fR نگاشت‌های موجود در بافت نام‌گذاری را فهرست می‌کند\&. در این حالت، حداکثر ۱۰۰۰ نگاشت از بافت نام‌گذاری اولیه در \f3BindingListHolder\fR برگردانده می‌شوند؛ هر نگاشت باقی‌مانده دیگری در \f3BindingIteratorHolder\fR بازگردانده خواهد شد\&. .sp .nf \f3 BindingListHolder bl = new BindingListHolder();\fP .fi .nf \f3 BindingIteratorHolder blIt= new BindingIteratorHolder();\fP .fi .nf \f3 nc\&.list(1000, bl, blIt);\fP .fi .nf \f3\fP .fi .sp این کد آرایه نگاشت‌ها را از \f3BindingListHolder\fR بازگردانده‌شده استخراج می‌کند\&. چنانچه هیچ نگاشتی وجود نداشته باشد، برنامه پایان می‌یابد\&. .sp .nf \f3 Binding bindings[] = bl\&.value;\fP .fi .nf \f3 if (bindings\&.length == 0) return;\fP .fi .nf \f3\fP .fi .sp باقی کد روی نگاشت‌ها پیمایش کرده و نام‌ها را چاپ می‌کند: .sp .nf \f3 for (int i=0; i < bindings\&.length; i++) {\fP .fi .nf \f3\fP .fi .nf \f3 // get the object reference for each binding\fP .fi .nf \f3 org\&.omg\&.CORBA\&.Object obj = nc\&.resolve(bindings[i]\&.binding_name);\fP .fi .nf \f3 String objStr = orb\&.object_to_string(obj);\fP .fi .nf \f3 int lastIx = bindings[i]\&.binding_name\&.length\-1;\fP .fi .nf \f3\fP .fi .nf \f3 // check to see if this is a naming context\fP .fi .nf \f3 if (bindings[i]\&.binding_type == BindingType\&.ncontext) {\fP .fi .nf \f3 System\&.out\&.println("Context: " +\fP .fi .nf \f3 bindings[i]\&.binding_name[lastIx]\&.id);\fP .fi .nf \f3 } else {\fP .fi .nf \f3 System\&.out\&.println("Object: " +\fP .fi .nf \f3 bindings[i]\&.binding_name[lastIx]\&.id);\fP .fi .nf \f3 }\fP .fi .nf \f3 }\fP .fi .nf \f3 } catch (Exception e) {\fP .fi .nf \f3 e\&.printStackTrace(System\&.err)\fP .fi .nf \f3 }\fP .fi .nf \f3 }\fP .fi .nf \f3}\fP .fi .nf \f3\fP .fi .sp .SH "همچنین ببینید (SEE ALSO)" .TP 0.2i \(bu orbd(1) .RE .br 'pl 8.5i 'bp