How to generete helper methods in client stubs
Hello all
my web service is using complex types , when the client side it importing the wsdl
and generating client stubs , is it possible to include helper methods that help to
manage the complex type and not just getters and setters ?
Hi,
what version is the SAP PS running? If WebAs or higher, create an inbound synch interface containing your two parameters in the request structure and as many as you require in your response structure. Generate an Inbound ABAP proxy, where you can plug in some code, i.e. create and instantiate an object of the required type and make the call to the BAPI.
If SAP PS on lower than WebAs, then create a wrapper function module and make it RFC enabled. Then plug your code in here and do the same thing.
Watch out for commits!
Cheers,
Mark
Similar Messages
-
How to create client stub while deployign EAR on Oracle Application Server
Hi,
I have deployed an EJB on Oracle Application Server 10g 10.1.2.0.2. And i want to call this ejb from other app server using ejb client. For that i need client stub.
Is there any way I can create client stub while deploying EJB on the OC4J?
I am sure there will be some options.
Thanks and Regards
ATAmit,
It depends on which transport protocol you use to transmit both the client requests and the server responses: either IIOP or ORMI.
Here's how it works: if you've chosen the IIOP protocol, the client stubs are generated at deploy time and stored in the iiopClient.jar file. Once created, you append this file to your java client's classpath.
Now, if your choice is ORMI, the client stubs are created on demand by the container, so there is no need to append any jar file to the client classpath.
Consult the OC4J Services Guide in the Official Oracle Application Server docs for further inforrmation on this topic, specially the "Remote Method Invocation" chapter.
RB -
How the client stub is generated from the wsdl file ?
I want to know how the client stub is generated from the wsdl file ?
how the client accesses the methods in the wsdl fie ?
thanks alot .there are several ways to generate the stubs from a wsdl.
if you're using jax-ws, there is a netbeans tutorial creating web services. you found this on http://www.netbeans.org/kb/trails/web.html.
if you're using axis as your framework, i think this would be a nice introduction of it. link : http://www.eli.sdsu.edu/courses/spring03/cs683/notes/AXIS/AXIS.html#Heading4 -
Help:How can I run the J2EE Client Application? Thanks
Help:How can I run the J2EE Client Application that will access the remote J2EE1.4 application server which runs on another host computer?
I have developped a stateles senterprise java bean name converter and deloyed it in the j2ee1.4 application server on the host machine A. The converterbean provides the remote home interface and remote interface. At the same time I have developped the j2ee application client named convertappclient. When I access the conveter bean at host computer A through the script 'appclient.bat' as 'appclient -client convertappclient.jar', the client can access the bean sucessfully. Now I want to access the bean through the script 'appclient.bat' at host computer B,what files should I copy from host computer A to host computer B;and what the command line should be like? Thanks!
The following are the code of the enterprise java bean and it's home interface .
The client code is also provided.
The enterprise java bean:
package converter;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import java.math.*;
public class ConverterBean implements SessionBean {
BigDecimal yenRate = new BigDecimal("121.6000");
BigDecimal euroRate = new BigDecimal("0.0077");
public ConverterBean() {
public BigDecimal dollarToYen(BigDecimal dollars) {
BigDecimal result = dollars.multiply(yenRate);
return result.setScale(2, BigDecimal.ROUND_UP);
public BigDecimal yenToEuro(BigDecimal yen) {
BigDecimal result = yen.multiply(euroRate);
return result.setScale(2, BigDecimal.ROUND_UP);
public void ejbCreate() {
public void ejbRemove() {
public void ejbActivate() {
public void ejbPassivate() {
public void setSessionContext(SessionContext sc) {
The bean's remote home interface :
package converter;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface ConverterHome extends EJBHome {
Converter create() throws RemoteException, CreateException;
The bean's remote interface:
package converter;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
import java.math.*;
public interface Converter extends EJBObject {
public BigDecimal dollarToYen(BigDecimal dollars) throws RemoteException;
public BigDecimal yenToEuro(BigDecimal yen) throws RemoteException;
The j2ee application client:
import converter.Converter;
import converter.ConverterHome;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.math.BigDecimal;
public class ConverterClient {
public static void main(String[] args) {
try {
Context initial = new InitialContext();
System.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
System.setProperty("java.naming.provider.url","jnp://10.144.97.250:3700");
Context myEnv = (Context) initial.lookup("java:comp/env");
Object objref = myEnv.lookup("ejb/SimpleConverter");
ConverterHome home =
(ConverterHome) PortableRemoteObject.narrow(objref,
ConverterHome.class);
Converter currencyConverter = home.create();
BigDecimal param = new BigDecimal("100.00");
BigDecimal amount = currencyConverter.dollarToYen(param);
System.out.println(amount);
amount = currencyConverter.yenToEuro(param);
System.out.println(amount);
System.exit(0);
} catch (Exception ex) {
System.err.println("Caught an unexpected exception!");
ex.printStackTrace();
}Surprisingly I find an upsurge in the number of posts with this same problem. I recently found a post which gave a nice link for this. Follow the steps and it should help:
http://docs.sun.com/source/819-0079/dgacc.html#wp1022105 -
How to use this method in JSTL?help me please!
I know I can use "<C:set >" like as
<c:set var="clabel3" value="${portalCustomizeBean.portalPage}"/> ,
but now I want to use one method of portalCustomizeBean object not a attribute of it !!!!!
who would tell me how to use?
this is wrong in my code:
<c:set var="clabel" value="${portalCustomizeBean.currentPageLabel}"/>
<c:set var="clabel3" value="${portalCustomizeBean.toEntitiesExceptSpaceEscape(clabel)}"/>
but how to use "toEntitiesExceptSpaceEscape" method in JSTL?????Why can't you just assign the method's return value to a variable and then print that? A bit of scriptlet code will do the trick. (As much as we all hate to use scriptlet code.)
I believe you'll be able to do what you want in the 1.1 standard JSTL, but for now this will suffice. - MOD -
WSDL/client-stub generation without EJBs ?
My WL7 application invokes methods on external subscriber
web-apps. I need to provide WSDLs for these external apps, since
they'll be implemented by our customers.
Currently, I create 'dummy' EJBs, then create .ears out of it,
run 'servicegen' to create a dummy webservice, then run
'clientgen' to create the WSDLs and the client stub classes
that I'll finally use. I'd like to avoid some of the above
steps. Ideally, I'd just create the appropriate Java interface
classes, then use some tool to create the WSDL and the
client-stub classes. Is this possible ?
-johnHi John,
Have you considered using a WSDL generation GUI, such as
http://www.omniopera.com/omniopera.html
Bruce
BTW, you do realize that when a webservice is deployed on WLS v7, the
WSDL is available to anyone using
http://<host>:<port>/<context_url>/<webservice>?WSDL
john wrote:
Bruce, I'm not sure how I would use those other tasks to obtain
what I want. AFAIK, the only way to generate a WSDL for a service
is to use the 'clientgen' task. And the clientgen task requires
the actual webservice implementation in the form of a .ear
file.
In my case, I need to create WSDLs which I then pass on to
my customers, for them to implement and host. Currently, to do
this I have to myself implement the desired dummy webservice
and then use clientgen to obtain the WSDL (along with the
stubs etc ..)
thanx
-john
Bruce Stephens <[email protected]> wrote:
Hi John,
In addition to the servicegen and clientgen ant tasks there are now
several other narrowly focused ant tasks such as autotype, and
source2wsdd. Check out the documentation:
http://edocs.bea.com/wls/docs70/webserv/assemble.html#1011066
Hope this helps,
Bruce
john wrote:
My WL7 application invokes methods on external subscriber
web-apps. I need to provide WSDLs for these external apps, since
they'll be implemented by our customers.
Currently, I create 'dummy' EJBs, then create .ears out of it,
run 'servicegen' to create a dummy webservice, then run
'clientgen' to create the WSDLs and the client stub classes
that I'll finally use. I'd like to avoid some of the above
steps. Ideally, I'd just create the appropriate Java interface
classes, then use some tool to create the WSDL and the
client-stub classes. Is this possible ?
-john -
XML format for input to BPEL process from client stub
Hi,
I have deployed SyncHelloWorld BPEL process as given in the tutorial in the BPEL Server. It is working fine. Now I am trying to invoke the process by creating a Java client stub . I created a stub using the Web-services wizard by specifying the WSDL of the BPEL. Now I want to know how to pass some string through XML document to the BPEL process.
I am using this code in the main method of the stub., but the value is not being passed to the BPEL nodes correctly. the output I am getting is "Hello "
and not "Hello XYZString". I think I am not able to form the XML document to pass as input correctly. Can anyone help.
Can anyone please help :
public static void main(String[] args)
try
SyncHelloWorldStub stub = new SyncHelloWorldStub();
// Add your own code here.
// Create an empty XML document
XMLDocument doc = new XMLDocument();
// Create an element
Element body = doc.createElementNS("http://xmlns.oracle.com/SyncHelloWorld", "SyncHelloWorldProcessRequest");
// Create the inner element
Element ip = doc.createElementNS("http://xmlns.oracle.com/SyncHelloWorld", "input");
// Create a text node
Text text = doc.createTextNode("input");
// Set the input parameter
text.setNodeValue("XYZString");
ip.appendChild(text);
body.appendChild(ip);
// Call the process. It returns a vector
Vector v = stub.process(body);
// Code to print the returned xml.
System.out.println("Received " + v.size() + " element");
Enumeration enum = v.elements();
// Walk through the vector and print out contents
while (enum.hasMoreElements())
Object o = enum.nextElement();
System.out.println("Returned a " + o.getClass().getName());
//If it is an element, print it out
if (o instanceof XMLElement)
XMLElement xml = (XMLElement)o;
xml.print(System.out);
else
System.out.println("Returned " + o.toString());
System.out.println("After executing : "+v.toString());
catch(Exception ex)
ex.printStackTrace();
This is the code for WSDL file for the BPEL process.
<?xml version="1.0" encoding="UTF-8" ?>
- <definitions name="SyncHelloWorld" targetNamespace="http://xmlns.oracle.com/SyncHelloWorld" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://xmlns.oracle.com/SyncHelloWorld" xmlns:plnk="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:client="http://xmlns.oracle.com/SyncHelloWorld">
- <types>
- <schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://xmlns.oracle.com/SyncHelloWorld" xmlns="http://www.w3.org/2001/XMLSchema">
- <element name="SyncHelloWorldProcessRequest">
- <complexType>
- <sequence>
<element name="input" type="string" />
</sequence>
</complexType>
</element>
- <element name="SyncHelloWorldProcessResponse">
- <complexType>
- <sequence>
<element name="result" type="string" />
</sequence>
</complexType>
</element>
</schema>
</types>
- <message name="SyncHelloWorldRequestMessage">
<part name="payload" element="tns:SyncHelloWorldProcessRequest" />
</message>
- <message name="SyncHelloWorldResponseMessage">
<part name="payload" element="tns:SyncHelloWorldProcessResponse" />
</message>
- <portType name="SyncHelloWorld">
- <operation name="process">
<input message="tns:SyncHelloWorldRequestMessage" />
<output message="tns:SyncHelloWorldResponseMessage" />
</operation>
</portType>
- <binding name="SyncHelloWorldBinding" type="tns:SyncHelloWorld">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
- <operation name="process">
<soap:operation style="document" soapAction="process" />
- <input>
<soap:body use="literal" />
</input>
- <output>
<soap:body use="literal" />
</output>
</operation>
</binding>
- <service name="SyncHelloWorld">
- <port name="SyncHelloWorldPort" binding="tns:SyncHelloWorldBinding">
<soap:address location="http://cisoidd001.corporate.ge.com:5843/orabpel/default/SyncHelloWorld/v2006_06_19__40924" />
</port>
</service>
- <plnk:partnerLinkType name="SyncHelloWorld">
- <plnk:role name="SyncHelloWorldProvider">
<plnk:portType name="tns:SyncHelloWorld" />
</plnk:role>
</plnk:partnerLinkType>
</definitions>
Also, while running the BPEL process from console, we can give the input as html or string. Can anyone give the me xml format of the input.
Any help would be highly appreciated.
Thanks,
DebojyotyYour last question shows that you might have solved this by now.
The xml document you are composing in java might not exactly be the xml input bpel excepts. The way to compare is first initiate a process by posting an html message, using the initiate tab for your process in the BPEL console. Check the box "Save as default input" before you send the html request.
Then again do an initiate from the BPEL console and select "XML Source" instead of "HTML Form". You will see the xml message you just have sent as html.
You might also want to test your java program with one of the many free soap clients available on the internet.
HTH,
Ruerd
http://www.numericalexample.com -
Hello. I would like to write async tcp client and server. I wrote this code but a have a problem, when I call the disconnect method on client or stop method on server. I can't identify that the client or the server is no longer connected.
I thought I will get an exception if the client or the server is not available but this is not happening.
private async void Process()
try
while (true)
var data = await this.Receive();
this.NewMessage.SafeInvoke(Encoding.ASCII.GetString(data));
catch (Exception exception)
How can I determine that the client or the server is no longer available?
Server
public class Server
private readonly Dictionary<IPEndPoint, TcpClient> clients = new Dictionary<IPEndPoint, TcpClient>();
private readonly List<CancellationTokenSource> cancellationTokens = new List<CancellationTokenSource>();
private TcpListener tcpListener;
private bool isStarted;
public event Action<string> NewMessage;
public async Task Start(int port)
this.tcpListener = TcpListener.Create(port);
this.tcpListener.Start();
this.isStarted = true;
while (this.isStarted)
var tcpClient = await this.tcpListener.AcceptTcpClientAsync();
var cts = new CancellationTokenSource();
this.cancellationTokens.Add(cts);
await Task.Factory.StartNew(() => this.Process(cts.Token, tcpClient), cts.Token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
public void Stop()
this.isStarted = false;
foreach (var cancellationTokenSource in this.cancellationTokens)
cancellationTokenSource.Cancel();
foreach (var tcpClient in this.clients.Values)
tcpClient.GetStream().Close();
tcpClient.Close();
this.clients.Clear();
public async Task SendMessage(string message, IPEndPoint endPoint)
try
var tcpClient = this.clients[endPoint];
await this.Send(tcpClient.GetStream(), Encoding.ASCII.GetBytes(message));
catch (Exception exception)
private async Task Process(CancellationToken cancellationToken, TcpClient tcpClient)
try
var stream = tcpClient.GetStream();
this.clients.Add((IPEndPoint)tcpClient.Client.RemoteEndPoint, tcpClient);
while (!cancellationToken.IsCancellationRequested)
var data = await this.Receive(stream);
this.NewMessage.SafeInvoke(Encoding.ASCII.GetString(data));
catch (Exception exception)
private async Task Send(NetworkStream stream, byte[] buf)
await stream.WriteAsync(BitConverter.GetBytes(buf.Length), 0, 4);
await stream.WriteAsync(buf, 0, buf.Length);
private async Task<byte[]> Receive(NetworkStream stream)
var lengthBytes = new byte[4];
await stream.ReadAsync(lengthBytes, 0, 4);
var length = BitConverter.ToInt32(lengthBytes, 0);
var buf = new byte[length];
await stream.ReadAsync(buf, 0, buf.Length);
return buf;
Client
public class Client
private TcpClient tcpClient;
private NetworkStream stream;
public event Action<string> NewMessage;
public async void Connect(string host, int port)
try
this.tcpClient = new TcpClient();
await this.tcpClient.ConnectAsync(host, port);
this.stream = this.tcpClient.GetStream();
this.Process();
catch (Exception exception)
public void Disconnect()
try
this.stream.Close();
this.tcpClient.Close();
catch (Exception exception)
public async void SendMessage(string message)
try
await this.Send(Encoding.ASCII.GetBytes(message));
catch (Exception exception)
private async void Process()
try
while (true)
var data = await this.Receive();
this.NewMessage.SafeInvoke(Encoding.ASCII.GetString(data));
catch (Exception exception)
private async Task Send(byte[] buf)
await this.stream.WriteAsync(BitConverter.GetBytes(buf.Length), 0, 4);
await this.stream.WriteAsync(buf, 0, buf.Length);
private async Task<byte[]> Receive()
var lengthBytes = new byte[4];
await this.stream.ReadAsync(lengthBytes, 0, 4);
var length = BitConverter.ToInt32(lengthBytes, 0);
var buf = new byte[length];
await this.stream.ReadAsync(buf, 0, buf.Length);
return buf;Hi,
Have you debug these two applications? Does it go into the catch exception block when you close the client or the server?
According to my test, it will throw an exception when the client or the server is closed, just log the exception message in the catch block and then you'll get it:
private async void Process()
try
while (true)
var data = await this.Receive();
this.NewMessage.Invoke(Encoding.ASCII.GetString(data));
catch (Exception exception)
Console.WriteLine(exception.Message);
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
By the way, I don't know what the SafeInvoke method is, it may be an extension method, right? I used Invoke instead to test it.
We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
Click
HERE to participate the survey. -
How to call a method of another class ?
Hello,
I�d like to know how to call a method of another class. I have to classes (class 1 and class 2), class 1 instantiates an object of class 2 and executes the rest of the method. Later, class 1 has to call a method of class 2, sending a message to do something in the object... Does anybody know how to do that ? Do I have to use interface ? Could you please help me ?
Thanks.
Bruno.Hi Schiller,
The codes are the following:
COMECO
import javax.swing.UIManager;
import java.awt.*;
import java.net.*;
import java.io.*;
import java.awt.event.*;
import javax.swing.*;
//Main method
class comeco {
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
catch(Exception e) {
AGORA testeagora=new AGORA();
// Code for socket
int port;
ServerSocket server_socket;
BufferedReader input;
try {
port = Integer.parseInt(args[0]);
catch (Exception e) {
System.out.println("comeco ---> port = 1500 (default)");
port = 1500;
try {
server_socket = new ServerSocket(port);
System.out.println("comeco ---> Server waiting for client on port " +
server_socket.getLocalPort());
// server infinite loop
while(true) {
Socket socket = server_socket.accept();
System.out.println("comeco ---> New connection accepted " +
socket.getInetAddress() +
":" + socket.getPort());
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// print received data
try {
while(true) {
String message = input.readLine();
if (message==null) break;
System.out.println("comeco ---> " + message);
testeagora.teste(message);
catch (IOException e) {
System.out.println(e);
// connection closed by client
try {
socket.close();
System.out.println("Connection closed by client");
catch (IOException e) {
System.out.println(e);
catch (IOException e) {
System.out.println(e);
AGORA
import javax.swing.UIManager;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
import java.net.*;
//public class AGORA {
public class AGORA {
boolean packFrame = false;
//Construct the application
public AGORA() {
try {
Main frame = new Main();
System.out.println("agora ---> Criou o frame");
//Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if (packFrame)
frame.pack();
else
frame.validate();
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height)
frameSize.height = screenSize.height;
if (frameSize.width > screenSize.width)
frameSize.width = screenSize.width;
frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
catch(Exception e)
{ System.out.println("agora ---> " +e);
// Tem que criar a THREAD e ver se funciona
public void remontar (final String msg) {
try {
System.out.println("agora ---> Passou pelo Runnable");
System.out.println("agora --> Mensagem que veio do comeco para agora: "+ msg);
Main.acao(msg);
catch(Exception x) {
x.printStackTrace();
MAIN
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import com.borland.jbcl.layout.*;
import javax.swing.border.*;
import java.net.*;
import java.io.*;
public class Main extends JFrame {
// ALL THE CODE OF THE INTERFACE
//Construct the frame
public Main() {
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
try {
jbInit();
catch(Exception e) {
e.printStackTrace();
public void acao() {
// C�digo para mudar a interface
Runnable setTextRun=new Runnable() {
public void run() {
try {
System.out.println("main ---> Passou pelo Runnable");
TStatus.setText("main ---> Funcionou");
catch(Exception x) {
x.printStackTrace();
System.out.println("main ---> About to invokelater");
SwingUtilities.invokeLater(setTextRun);
System.out.println("main ---> Back from invokelater");
// Aqui vai entrar o m�todo para ouvir as portas sockets.
// Ele deve ouvir e caso haja alguma nova mensagem, trat�-la para
// alterar as vari�veis e redesenhar os pain�is
// Al�m disso, o bot�o de refresh deve aparecer ativo em vermelho
//Component initialization
private void jbInit() throws Exception {
// Initialize the interface
//Setting | Host action performed
public void SetHost_actionPerformed(ActionEvent e) {
int port;
ServerSocket server_socket;
BufferedReader input;
System.out.println("main ---> port = 1500 (default)");
port = 1500;
try {
server_socket = new ServerSocket(port);
System.out.println("main ---> Server waiting for client on port " +
server_socket.getLocalPort());
// server infinite loop
while(true) {
Socket socket = server_socket.accept();
System.out.println("main ---> New connection accepted " +
socket.getInetAddress() +
":" + socket.getPort());
input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String espaco=new String(": ");
JLabel teste2=new JLabel(new ImageIcon("host.gif"));
PHost.add(teste2);
System.out.println("main ---> Adicionou host na interface");
repaint();
System.out.println("main ---> Redesenhou a interface");
setVisible(true);
// print received data
try {
while(true) {
String message = input.readLine();
if (message==null) break;
System.out.println("main ---> " + message);
catch (IOException e2) {
System.out.println(e2);
// connection closed by client
try {
socket.close();
System.out.println("main ---> Connection closed by client");
catch (IOException e3) {
System.out.println(e3);
catch (IOException e1) {
System.out.println(e1);
public void OutHost_actionPerformed(ActionEvent e) {
repaint();
setVisible(true);
//Help | About action performed
public void helpAbout_actionPerformed(ActionEvent e) {
Main_AboutBox dlg = new Main_AboutBox(this);
Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x, (frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.show();
//Overridden so we can exit on System Close
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if(e.getID() == WindowEvent.WINDOW_CLOSING) {
fileExit_actionPerformed(null);
public void result(final String msg) {
// C�digo para mudar a interface
Runnable setTextRun=new Runnable() {
public void run() {
try {
System.out.println("main ---> Chamou o m�todo result para mudar a interface");
System.out.println("main --> Mensagem que veio do agora para main: "+ msg);
TStatus.setText(msg);
catch(Exception x) {
x.printStackTrace();
System.out.println("main --> About to invokelater");
SwingUtilities.invokeLater(setTextRun);
System.out.println("main --> Back from invokelater");
[]�s. -
HOWTO: Expose Entity Object Methods to Clients
By design, clients cannot directly access entity objects. The view object layer provides an extra layer of security--you can choose exactly what data and methods you want clients to see.
This HOWTO describes the process of exposing an entity object method to client programs.
First, if you don't already have one, you must base a view object on your entity object and add the view object to your data model. For full details of how to do this, see the help topics under
+Developing Business Components
--Working with View Objects, View Links, Application Modules, and Clients
+----Creating and Modifying View Objects, View Links, Application Modules, and Clients
For the purposes of this HOWTO, we'll assume that you already have an entity object, Employees, with a method on it, calculateBonus(),
and a view object EmployeesView based on Employees.
First, you must generate a view row class. A view row represents one row of the view object's cache; it corresponds to a view of a particular entity object.
To generate a view row class:
1. Right-click EmployeesView and choose Edit.
2. In the View Object Editor, select the Java page.
3. Select Generate Java File and Generate Accessors for the view row class.
4. Click Done. This creates a class called EmployeesViewRowImpl.
Next, you should add a "delegator" method to the view row class--a public method with the exact same signature as the entity method, that simply calls the entity method. For example:
public int calculateBonus(int rating) {
return getEmployees().calculateBonus(rating);
Next, you should export this method.
1. Right-click EmployeesView and choose Edit.
2. In the View Object Editor, select the Client Row Methods page.
3. Shuttle the method you just created into the Selected list and click Done.
This creates an interface called EmployeesViewRow that contains your method.
Now you can call the method from your client. You should cast the row returned by EmployeesView.current(), the <jbo:Row> tag, or a similar method or data tag to EmployeesViewRow.
For example,
<jbo:Row id="myRow" datasource="ds" action=Current>
<% out.println(((EmployeesViewRow) myRow).calculateBonus(3)); %>
</jbo:Row>
nullHi Lisa,
There's a difference between exporting methods (on an application module, view object, and view row--this is done on the "Client Methods" tab of the view object and application module wizards and the "Client Row Methods" tab of the view object wizard) and making an application module remotable (which is done on the "remote" tab of the application module wizard).
You should always export methods you want clients to use--and you only need to do this on the application module if you've written methods on your application module (which I didn't in this HOWTO). You can still use these methods in local mode--the interfaces will be present locally. The advantage of exporting methods is that it doesn't lock you into local mode--you'll be able to change to remote mode later (if you decide that's the way to go) with minimal changes--because the interfaces will be present locally even when the implementation classes aren't.
By contrast, you should only make an application module remotable if you're planning on deploying in a non-local configuration. You can do this step right before deployment.
Hope this helps,
Avrom
null -
Generating client stubs...
Hi all,
I want to ask a question about my j2me web service project.
Wireless Toolkit 2.5,
Tomcat 5.0 for Java WSDP,
Java Web Services Developer Pack 1.5,
jdk1.5.0_06 are installed and environment variables are adjusted...
When i want to generate client stubs after i deploy the project via ant, i get this error:
error : com.sun.tools.javac.Main is not available in the classpath..
error: compilation failed, errors should have been reported
How to solve this problem, please help...I found more notes on what I had to do:
- the process above created package names like java.oracle_e1_bssv_jp010000
- we need to rename these to be proper package names.
- refresh the eclipse project so you see these folders
- select the package, right click, refactor, rename
- rename these to be like oracle.e1.bssv.jp010000 (remove the java. and replace _ with .)
- there will probably be a bunch of errors in individual java files you will need to fix.
- they are very easy, it should be a matter of just deleting the imports, these are not needed because they are in the same package. -
OC4J 9.0.4, JAX-RPC, AXIS Client Stub
Hi All,
I have hit a problem and am wondering if anybody has any pointers :
* I have a Webservice running on OC4J 10.1.2 Standalone.
* I have generated Java client stubs by pointing to this webservice using the wsdl2java tool from Apache Axis and can use these generated classes without any problems outside any web containers.
* I have created a jsp that calls these classes and can run this within the embedded server of Jdeveloper 9.0.5.2
However...
When I deploy the ear file containing this jsp into a 9.0.4 OC4J standalone / or full install and run the same jsp I am getting the following exception :
500 Internal Server Error
java.lang.ClassFormatError: com/abc/mypackage/MyApplicationBindingStub (Illegal Field name "array$[B")
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].util.OC4JSecureClassLoader.defineClassEntry(OC4JSecureClassLoader.java:172)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].naming.ContextClassLoader.defineClass(ContextClassLoader.java:1154)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].naming.ContextClassLoader.findClass(ContextClassLoader.java:390)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].naming.ContextClassLoader.loadClass(ContextClassLoader.java:138)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at com.abc.mypackage.MyApplication_ServiceLocator.getMyApplicationPort(MyApplication_ServiceLocator.java:55)
at com.abc.mypackage.MyApplication_ServiceLocator.getMyApplicationPort(MyApplication_ServiceLocator.java:50)
at _Headers._jspService(_Headers.java:81)
[SRC:/Headers.jsp:40]
at com.orionserver[com Application Server Containers for J2EE 10g (9.0.4.0.0)].http.OrionHttpJspPage.service(OrionHttpJspPage.java:56)
at com.jsp.runtimev2.JspPageTable.service(JspPageTable.java:349)
at com.jsp.runtimev2.JspServlet.internalService(JspServlet.java:509)
at com.jsp.runtimev2.JspServlet.service(JspServlet.java:413)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ServletRequestDispatcher.invoke(ServletRequestDispatcher.java:765)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.ServletRequestDispatcher.forwardInternal(ServletRequestDispatcher.java:317)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.processRequest(HttpRequestHandler.java:790)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:270)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].server.http.HttpRequestHandler.run(HttpRequestHandler.java:112)
at com.evermind[com Application Server Containers for J2EE 10g (9.0.4.0.0)].util.ReleasableResourcePooledExecutor$MyWorker.run(ReleasableResourcePooledExecutor.java:186)
at java.lang.Thread.run(Thread.java:536)
Can anybody let me know what I need to do. Is there anyway that I can get this Apache client code (which uses jax-rpc) working within OC4J 9.0.4. I know the limitations of 9.0.4 and Jax-rpc - but I am wondering if anybody has a nice note to work around it.
Any help or comments would be greatly appreciated.Richard, the error message you see below indicates that the JVM can not recognize your class file.
java.lang.ClassFormatError: com/abc/mypackage/MyApplicationBindingStub (Illegal Field name "array$[B")
Are you using different java version to run wsdljava and OC4J? Can you try using the same version of java for both of them? -
hi...friends
i'm a new learner to rmi concepts. can anybody help me in knowing the client & stub concepts in rmi.stub is a client side proxy for a remote object ( instance of a class that implements a remote interface ) which is responsible for communicating method invocations on remote objects to the server where the actual remote object implementation resides and are generated with the command -rmic class_name. Client gets reference to the remote object with the help of stub.
More information can be obtained from either Java Tutorial or the Java Documentation. -
Wscompile does not seem to be generating a client stub
When I run the wscompile tool on a WSDL file generated using gSoap the wscompile tool does not generate the client stub. Instead it reports the following errors:
warning: ignoring port "finsvc": no SOAP address specified
warning: Service "finsvc" does not contain any usable ports
The WSDL file and the config file is shown below (please note that the IP address has been changed to 255.255.255.255 in this example but when we ran wscompile it was a valid one):
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="finsvc"
targetNamespace="http://www.xxxxxxxx.com/abcd/finsvc"
xmlns:tns="http://www.xxxxxxxx.com/abcd/finsvc"
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nsfinsvc="http://www.xxxxxxxx.com/abcd/finsvc"
xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:MIME="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:DIME="http://schemas.xmlsoap.org/ws/2002/04/dime/wsdl/"
xmlns:WSDL="http://schemas.xmlsoap.org/wsdl/"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<types>
<schema targetNamespace="http://www.xxxxxxxx.com/abcd/finsvc"
xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:nsfinsvc="http://www.xxxxxxxx.com/abcd/finsvc"
xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="unqualified"
attributeFormDefault="unqualified">
<import namespace="http://www.w3.org/2003/05/soap-encoding"/>
<complexType name="getFinStatusRequest">
<sequence>
<element name="lswebcmn-dept" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="lswebcmn-opr" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="lswebcmn-pwd" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="lswebcmn-func" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="lswebcmn-action" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="lswebcmn-option" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
<element name="lswebcmn-sessid" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="ltnum" type="xsd:int" minOccurs="1" maxOccurs="1"/>
</sequence>
</complexType>
<complexType name="getFinStatusRspLtdet">
<sequence>
<element name="ltnum" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="ltnum1" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="ltnum2" type="xsd:int" minOccurs="1" maxOccurs="1"/>
<element name="ltname" type="xsd:string" minOccurs="0" maxOccurs="1" nillable="true"/>
</sequence>
</complexType>
<complexType name="ArrayOfgetFinStatusRspLtdet">
<complexContent>
<restriction base="SOAP-ENC:Array">
<sequence>
<element name="item" type="nsfinsvc:getFinStatusRspLtdet" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute ref="SOAP-ENC:arrayType" WSDL:arrayType="nsfinsvc:getFinStatusRspLtdet[]"/>
</restriction>
</complexContent>
</complexType>
</schema>
</types>
<message name="getFinStatus">
<part name="p-in" type="nsfinsvc:getFinStatusRequest"/>
</message>
<message name="getFinStatusRsp">
<part name="lswebcmn-status" type="xsd:int"/>
<part name="lswebcmn-statusmsg" type="xsd:string"/>
<part name="ptrLtdet" type="nsfinsvc:ArrayOfgetFinStatusRspLtdet"/>
</message>
<portType name="finsvcPortType">
<operation name="getFinStatus">
<documentation>Service definition of function nsfinsvc__getFinStatus</documentation>
<input message="tns:getFinStatus"/>
<output message="tns:getFinStatusRsp"/>
</operation>
</portType>
<binding name="finsvc" type="tns:finsvcPortType">
<SOAP:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="getFinStatus">
<SOAP:operation style="rpc"/>
<input>
<SOAP:body use="encoded" namespace="http://www.xxxxxxxx.com/abcd/finsvc" encodingStyle="http://www.w3.org/2003/05/soap-encoding"/>
</input>
<output>
<SOAP:body use="encoded" namespace="http://www.xxxxxxxx.com/abcd/finsvc" encodingStyle="http://www.w3.org/2003/05/soap-encoding"/>
</output>
</operation>
</binding>
<service name="finsvc">
<documentation>gSOAP 2.7.6d generated service definition</documentation>
<port name="finsvc" binding="tns:finsvc">
<SOAP:address location="http://255.255.255.255:18083"/>
</port>
</service>
</definitions>
And the config file used with the wscompile is as below:
<configuration xmlns="http://java.sun.com/xml/ns/jax-rpc/ri/config">
<wsdl location="./FINSVC.wsdl"
packageName="com"/>
</configuration>Thanks for the reply...
C:\JavaProgFiles\jwsdp-2.0\jaxrpc\bin>wscompile -version
JAX-RPC Standard Implementation (1.1.3, build R1)
C:\JavaProgFiles\jwsdp-2.0\jaxrpc\bin>wscompile -verbose config.xml
error: no mode was specified, please use one of -import/-define/-gen
Usage: wscompile [options] configuration_file
Use "wscompile -help" for a detailed description of options.
C:\JavaProgFiles\jwsdp-2.0\jaxrpc\bin>wscompile -verbose -gen config.xml
warning: ignoring port "finsvc": no SOAP address specified
warning: Service "finsvc" does not contain any usable ports
[ServiceInterfaceGenerator: creating service interface: com.Finsvc]
[ServiceGenerator: creating service: com.Finsvc_Impl]
[SerializerRegistryGenerator: creating serializer registry: com.Finsvc_SerializerRegistry]
Since then we discovered the following:
When I change the following line in the WSDL it works:
From:
xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap12/"
To:
xmlns:SOAP="http://schemas.xmlsoap.org/wsdl/soap/"
It looks like wscompile (v1.1.3) works with Soap 1.1 WSDL only.
When using wsimport instead all seems to work fine provided we change from rpc/encoded to document/literal.
I guess that's the way to go...for Soap 1.2 -
How to list IP address from client on the Server (TCP/IP CLIENT SERVER COMMUNICATION)
Excuse me,
In this project I want to ask how to add list IP from client that connect to server.
I have edited slightly the project.
'SERVER
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Reflection
Public Class ServerForm
Private _Listener As TcpListener
Private _Connections As New List(Of ConnectionInfo)
Private _ConnectionMonitor As Task
Private Sub Button_Checked(sender As System.Object, e As System.EventArgs) Handles StartStopButton.CheckedChanged
If StartStopButton.Checked Then
StartStopButton.Text = "Stop"
StartStopButton.Image = My.Resources.StopServer
_Listener = New TcpListener(IPAddress.Any, CInt(PortTextBox.Text))
_Listener.Start()
Dim monitor As New MonitorInfo(_Listener, _Connections)
ListenForClient(monitor)
_ConnectionMonitor = Task.Factory.StartNew(AddressOf DoMonitorConnections, monitor, TaskContinuationOptions.LongRunning)
Else
StartStopButton.Text = "Start:"
StartStopButton.Image = My.Resources.StartServer
CType(_ConnectionMonitor.AsyncState, MonitorInfo).Cancel = True
_Listener.Stop()
_Listener = Nothing
End If
End Sub
Private Sub PortTextBox_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles PortTextBox.Validating
Dim deltaPort As Integer
If Not Integer.TryParse(PortTextBox.Text, deltaPort) OrElse deltaPort < 1 OrElse deltaPort > 65535 Then
MessageBox.Show("Port number between 1 and 65535", "Invalid Port Number", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
PortTextBox.SelectAll()
e.Cancel = True
End If
End Sub
Private Sub ListenForClient(monitor As MonitorInfo)
Dim info As New ConnectionInfo(monitor)
_Listener.BeginAcceptTcpClient(AddressOf DoAcceptClient, info)
End Sub
Private Sub DoAcceptClient(result As IAsyncResult)
Dim monitorinfo As MonitorInfo = CType(_ConnectionMonitor.AsyncState, MonitorInfo)
If monitorinfo.Listener IsNot Nothing AndAlso Not monitorinfo.Cancel Then
Dim info As ConnectionInfo = CType(result.AsyncState, ConnectionInfo)
monitorinfo.Connections.Add(info)
info.AcceptClient(result)
ListenForClient(monitorinfo)
info.AwaitData()
Dim doUpdateConnectionCountLabel As New Action(AddressOf UpdateConnectionCountLabel)
Invoke(doUpdateConnectionCountLabel)
End If
End Sub
Private Sub DoMonitorConnections()
Dim doAppendOutput As New Action(Of String)(AddressOf AppendOutput)
Dim doUpdateConnectionCountLabel As New Action(AddressOf UpdateConnectionCountLabel)
Dim monitorInfo As MonitorInfo = CType(_ConnectionMonitor.AsyncState, MonitorInfo)
Me.Invoke(doAppendOutput, "Server Started")
Do
Dim lostCount As Integer = 0
For index As Integer = monitorInfo.Connections.Count - 1 To 0 Step -1
Dim info As ConnectionInfo = monitorInfo.Connections(index)
If info.Client.Connected Then
If info.DataQueue.Count > 0 Then
Dim messageBytes As New List(Of Byte)
While info.DataQueue.Count > 0
Dim value As Byte
If info.DataQueue.TryDequeue(value) Then
messageBytes.Add(value)
End If
End While
Me.Invoke(doAppendOutput, "Message from IP: " + System.Text.Encoding.ASCII.GetString(messageBytes.ToArray))
End If
Else
monitorInfo.Connections.Remove(info)
lostCount += 1
End If
Next
If lostCount > 0 Then
Invoke(doUpdateConnectionCountLabel)
End If
_ConnectionMonitor.Wait(1)
Loop While Not monitorInfo.Cancel
For Each info As ConnectionInfo In monitorInfo.Connections
info.Client.Close()
Next
monitorInfo.Connections.Clear()
Invoke(doUpdateConnectionCountLabel)
Me.Invoke(doAppendOutput, "Server Stoped")
End Sub
Private Sub UpdateConnectionCountLabel()
ConnectionCountLabel.Text = String.Format("{0} Connections", _Connections.Count)
End Sub
Private Sub AppendOutput(message As String)
If RichTextBox1.TextLength > 0 Then
RichTextBox1.AppendText(ControlChars.NewLine)
End If
RichTextBox1.AppendText(message)
RichTextBox1.ScrollToCaret()
End Sub
Private Sub ClearButton_Checked(sender As Object, e As EventArgs) Handles ClearButton.CheckedChanged
If ClearButton.Checked Then
RichTextBox1.Clear()
End If
End Sub
End Class
Public Class MonitorInfo
Private _listener As TcpListener
Public ReadOnly Property Listener As TcpListener
Get
Return _listener
End Get
End Property
Private _connections As List(Of ConnectionInfo)
Public ReadOnly Property Connections As List(Of ConnectionInfo)
Get
Return _connections
End Get
End Property
Public Property Cancel As Boolean
Public Sub New(tcpListener As TcpListener, connectionInfoList As List(Of ConnectionInfo))
_listener = tcpListener
_connections = connectionInfoList
End Sub
End Class
Public Class ConnectionInfo
Private _monitor As MonitorInfo
Public ReadOnly Property Monitor As MonitorInfo
Get
Return _monitor
End Get
End Property
Private _Client As TcpClient
Public ReadOnly Property Client As TcpClient
Get
Return _Client
End Get
End Property
Private _DataQueue As System.Collections.Concurrent.ConcurrentQueue(Of Byte)
Public ReadOnly Property DataQueue As System.Collections.Concurrent.ConcurrentQueue(Of Byte)
Get
Return _DataQueue
End Get
End Property
Private _Stream As NetworkStream
Public ReadOnly Property Stream As NetworkStream
Get
Return _Stream
End Get
End Property
Public Sub New(monitor As MonitorInfo)
_monitor = monitor
_DataQueue = New System.Collections.Concurrent.ConcurrentQueue(Of Byte)
End Sub
Private _LastReadLength As Integer
Public ReadOnly Property LastReadLength As Integer
Get
Return _LastReadLength
End Get
End Property
Private _Buffer(63) As Byte
Public Sub AcceptClient(result As IAsyncResult)
_Client = _monitor.Listener.EndAcceptTcpClient(result)
If _Client IsNot Nothing AndAlso _Client.Connected Then
_Stream = _Client.GetStream
End If
End Sub
Public Sub AwaitData()
_Stream.BeginRead(_Buffer, 0, _Buffer.Length, AddressOf DoReadData, Me)
End Sub
Private Sub DoReadData(result As IAsyncResult)
Dim info As ConnectionInfo = CType(result.AsyncState, ConnectionInfo)
Try
If info.Stream IsNot Nothing AndAlso info.Stream.CanRead Then
info._LastReadLength = info.Stream.EndRead(result)
For Index As Integer = 0 To _LastReadLength - 1
info._DataQueue.Enqueue(info._Buffer(Index))
Next
'info.SendMessage("Data Diterima " & info._LastReadLength & " Bytes")
info.SendMessage("reply form server: " & info._LastReadLength & " Bytes")
For Each otherInfo As ConnectionInfo In info.Monitor.Connections
If Not otherInfo Is info Then
otherInfo.SendMessage(System.Text.Encoding.ASCII.GetString(info._Buffer))
End If
Next
info.AwaitData()
Else
info.Client.Close()
End If
Catch ex As Exception
info._LastReadLength = -1
End Try
End Sub
Private Sub SendMessage(message As String)
If _Stream IsNot Nothing Then
Dim messageData() As Byte = System.Text.Encoding.ASCII.GetBytes(message)
Stream.Write(messageData, 0, messageData.Length)
End If
End Sub
End Class
'CLIENT
Imports System.Net
Imports System.Net.Sockets
Public Class ClientForm
Private _Connection As ConnectionInfo
Private _ServerAddress As IPAddress
Private Sub ClientForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
ValidateChildren()
End Sub
Private Sub ConnectButton_Checked(sender As Object, e As System.EventArgs) Handles ConnectButton.CheckedChanged
If ConnectButton.Checked Then
If _ServerAddress IsNot Nothing Then
ConnectButton.Text = "Disconnect"
ConnectButton.Image = My.Resources.StopServer
Try
_Connection = New ConnectionInfo(_ServerAddress, CInt(PortTextBox.Text), AddressOf InvokeAppendOutput)
_Connection.AwaitData()
Catch ex As Exception
MessageBox.Show(ex.Message, "Error Connecting to Server", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
ConnectButton.Checked = False
End Try
Else
MessageBox.Show("Invlid IP Server", "Cannt Connect to Server", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
ConnectButton.Checked = False
End If
Else
ConnectButton.Text = "Connect"
ConnectButton.Image = My.Resources.StartServer
If _Connection IsNot Nothing Then _Connection.Close()
_Connection = Nothing
End If
End Sub
Private Sub SendButton_Click(sender As System.Object, e As System.EventArgs) Handles SendButton.Click
If _Connection IsNot Nothing AndAlso _Connection.Client.Connected AndAlso _Connection.Stream IsNot Nothing Then
Dim buffer() As Byte = System.Text.Encoding.ASCII.GetBytes(InputTextBox.Text)
_Connection.Stream.Write(buffer, 0, buffer.Length)
End If
End Sub
Private Sub ServerTextBox_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles IPTextBox.Validating
_ServerAddress = Nothing
Dim remoteHost As IPHostEntry = Dns.GetHostEntry(IPTextBox.Text)
If remoteHost IsNot Nothing AndAlso remoteHost.AddressList.Length > 0 Then
For Each deltaAddress As IPAddress In remoteHost.AddressList
If deltaAddress.AddressFamily = AddressFamily.InterNetwork Then
_ServerAddress = deltaAddress
Exit For
End If
Next
End If
If _ServerAddress Is Nothing Then
MessageBox.Show("Cannot resolve Server Address", "invalid Server", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
IPTextBox.SelectAll()
e.Cancel = True
End If
End Sub
Private Sub PortTextBox_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles PortTextBox.Validating
Dim deltaPort As Integer
If Not Integer.TryParse(PortTextBox.Text, deltaPort) OrElse deltaPort < 1 OrElse deltaPort > 65535 Then
MessageBox.Show("Port number between 1 and 65535", "invalid Port number", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
PortTextBox.SelectAll()
e.Cancel = True
End If
End Sub
Private Sub InvokeAppendOutput(message As String)
Dim doAppendOutput As New Action(Of String)(AddressOf AppendOutput)
Me.Invoke(doAppendOutput, message)
End Sub
Private Sub AppendOutput(message As String)
If RichTextBox1.TextLength > 0 Then
RichTextBox1.AppendText(ControlChars.NewLine)
End If
RichTextBox1.AppendText(message)
RichTextBox1.ScrollToCaret()
End Sub
Private Sub ButtonClear_Click(sender As Object, e As EventArgs) Handles ButtonClear.Click
RichTextBox1.Clear()
InputTextBox.Clear()
End Sub
End Class
Public Class ConnectionInfo
Private _AppendMethod As Action(Of String)
Public ReadOnly Property AppendMethod As Action(Of String)
Get
Return _AppendMethod
End Get
End Property
Private _Client As TcpClient
Public ReadOnly Property Client As TcpClient
Get
Return _Client
End Get
End Property
Private _Stream As NetworkStream
Public ReadOnly Property Stream As NetworkStream
Get
Return _Stream
End Get
End Property
Private _LastReadLength As Integer
Public ReadOnly Property LastReadLength As Integer
Get
Return _LastReadLength
End Get
End Property
Private _Buffer(63) As Byte
Public Sub New(address As IPAddress, port As Integer, append As Action(Of String))
_AppendMethod = append
_Client = New TcpClient
_Client.Connect(address, port)
_Stream = _Client.GetStream
End Sub
Public Sub AwaitData()
_Stream.BeginRead(_Buffer, 0, _Buffer.Length, AddressOf DoreadData, Me)
End Sub
Public Sub Close()
If _Client IsNot Nothing Then _Client.Close()
_Client = Nothing
_Stream = Nothing
End Sub
Private Sub DoreadData(result As IAsyncResult)
Dim info As ConnectionInfo = CType(result.AsyncState, ConnectionInfo)
Try
If info._Stream IsNot Nothing AndAlso info._Stream.CanRead Then
info._LastReadLength = info._Stream.EndRead(result)
If info._LastReadLength > 0 Then
Dim message As String = System.Text.Encoding.ASCII.GetString(info._Buffer)
info._AppendMethod(message)
End If
info.AwaitData()
End If
Catch ex As Exception
info._LastReadLength = -1
info._AppendMethod(ex.Message)
End Try
End Sub
End Class
//ScreenShot server
http://prntscr[dot]com/5t1ol3
//Screenshot client
http://prntscr[dot]com/5t1odj
source: code[dot]msdn[dot]microsoft[dot]com/windowsdesktop/Simple-Multi-User-TCPIP-43cc3b44I have a similar chat application. When the user attempts to connect, instead of sending a simple string, the client sends a serialized object(xml string) with all relevant login and session information, this includes the user's IP address. Once the server
receives said information, depending on the type of TCP broadcast (a custom enumerated type) information from one user may be passed to a single user, or distributed to many users.
If it helps, here is the TCPBroadcast object I use. But in order for your server to understand it, you kind of have to build your server and client somewhat around it.
Option Strict On
Option Explicit On
Option Infer Off
Namespace TCPChat
Public Class TCPBroadcast
Public Property Message As String
Public Property BroadCastTime As DateTime
Public Property DestUser As String
Public Property OriginUser As String
Public Property PasswordHash As String
Public Property BroadcastSourceIP As String
Public Property BroadCastType As TCPBroadcastType
Public Property LoginUserName As String
Public Property FailureReason As String
Public Function XmlEncoding() As String
Dim serializer As New Xml.Serialization.XmlSerializer(GetType(TCPBroadcast))
Dim XML As String = String.Empty
Using memStream As New IO.MemoryStream
Using xmlWriter As New Xml.XmlTextWriter(memStream, System.Text.Encoding.UTF8) With _
{.Indentation = 4, .Formatting = System.Xml.Formatting.Indented}
serializer.Serialize(xmlWriter, Me)
End Using
XML = System.Text.Encoding.UTF8.GetString(memStream.ToArray)
End Using
Return XML
End Function
Public Function ToBinary() As Byte()
Return System.Text.Encoding.UTF8.GetBytes(Me.XmlEncoding)
End Function
Public Shared Function FromBinary(binary As Byte()) As DeserializationResult
Dim xml As String = System.Text.Encoding.UTF8.GetString(binary)
Return FromXML(xml)
End Function
Public Shared Function FromXML(xml As String) As DeserializationResult
Dim DeserializationResult As New DeserializationResult
DeserializationResult.Error = False
Try
Dim deserializer As New Xml.Serialization.XmlSerializer(GetType(TCPBroadcast))
Dim buffer As Byte() = System.Text.Encoding.UTF8.GetBytes(xml)
Using memStream As New IO.MemoryStream(buffer)
DeserializationResult.tcpBroadCast = CType(deserializer.Deserialize(memStream), TCPBroadcast)
End Using
Catch ex As Exception
DeserializationResult.Error = True
DeserializationResult.ErrorMessage = ex.ToString
DeserializationResult.AttemptedXML = xml
End Try
Return DeserializationResult
End Function
Public Class DeserializationResult
Public [Error] As Boolean
Public ErrorMessage As String
Public tcpBroadCast As TCPBroadcast
Public AttemptedXML As String
Sub New()
End Sub
End Class
Public Enum TCPBroadcastType
AdministrativeMessage
AuthenticationFailure
AuthenticationSuccess
ChatBroadcast
CredentialsRequest
Credentials
DisconnectedByServer
KeepAlive
PrivateMessage
ServerMessage
SystemMessage
UnableToProcessRequest
End Enum
End Class
End Namespace
“If you want something you've never had, you need to do something you've never done.”
Don't forget to mark
helpful posts and answers
! Answer an interesting question? Write a
new article
about it! My Articles
*This post does not reflect the opinion of Microsoft, or its employees.
Maybe you are looking for
-
Photoshop CS6 wont use my graphics card.
When I try to use the Oil Paint filter tool I receive an error claiming that an "uknown graphics processor error" had occured. I then checked under my preferences and Photoshop is not using the correct graphics card. Is there a way for me to fix this
-
Unclassified Documents in Knowledge Directory
Does anybody know what the unclassified documents folder is for? We are trying to organize our knowledge directory and can't find in the documentation what this system created folder is for.
-
Hi All, The "Additional Description" textbox on Header tab is of type text and can accept more than 256 characters, But the textbox displayed is huge. Is there any way to resize the textbox to have a scrollbar? I need to reduce display size of a desc
-
TS3694 keep getting error code 1015 help please
as title says i keep getting this error code while tryin to restore (1015)
-
I want to use QM in customer return i.e. insp type 06. But if I use it, when i will save inbound delivery, system will generate the insp lot and until i accept that lot, system will not allow me to do the PGR. BUt my client requirement is that they w